суббота, 18 октября 2014 г.

Быстрый осциллограф на Arduino / AVR. Часть 3


Прерывания


Как будет видно далее, в проекте используются прерывания. Прерывания - это сигналы микроконтроллеру остановить выполнение основного цикла и начать выполнять определенные функции. Рисунки ниже, нагляднее покажут идею прерываний:

Функции, которые выполняются, называются обработчиками прерываний (ISR), это обычные функции без параметров.

Рассмотрим пример, для подсчета импульсов. ATMega328P имеет встроенный  компаратор, который имеет прерывание, которое активируется, когда сигнал превышает установленное значение. Прежде всего необходимо объявить функцию-обработчик
ISR(АNАLОG_CОMP_vect)
{
    counter++;
}
Инструкция ISR() является макросом, который сообщает компилятору, что данная функция является обработчиком прерывания. АNАLОG_CОMP_vect - вектор прерывания, он сообщает компилятору, какое прерывание будет обрабатываться данным обработчиком. Таким образом, каждый раз, когда компаратор обнаружит, что сигнал выше определенной цифры, переменная counter увеличится.

Далее необходимо разрешить прерывание. Для этого необходимо установить в 1 бит ACIE регистра ACSR:

sbi(ACSR,ACIE);

понедельник, 6 октября 2014 г.

Быстрый осциллограф на Arduino / AVR. Часть 2

Что нам понадобится



Для работы над проектом нам понадобится плата Arduino и даташит на  находящийся в плате микроконтроллер.

Даташит для ATMEGA328P.

Также будет добавленна электронная схема в виде шилда. Список компонентов предоставлю позже.

Работа с микроконтроллером. Побитовый доступ к регистрам

Для повышения быстродействия необходимо использовать функции более низкого уровня, чем стандартные функции Arduino IDE. Эти функции будут работать с регистрами, которые в свою очередь являются наборами из восьми бит, так как Atmega328P имеет восьмиразрядную архитектуру.

Каждый регистр имеет свое имя, описанное в даташите. Например ADCSRA - регистр А настройки АЦП. Кроме того, каждый бит регистра имеет имя, например ADEN - бит включения АЦП. 

Для работы можно использовать обычные операторы языка C для работы с битами, но есть и очень удобные макросы :

// Определения для установки и сбрасывания битов регистра
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

Пользоваться ими очень просто:

Для установки разрешающего бита в 1 надо написать:

sbi(ADCSRA,ADEN);

Для сброса разрешающего бита в 0 надо написать:

cbi(ADCSRA,ADEN);

суббота, 4 октября 2014 г.

Быстрый осциллограф на Arduino/AVR. Пролог.

Обнаружил недавно на просторах интернета заманчивую англоязычную статью про осциллограф girino на сайте instructables. Думаю будет полезным перевести ее на понятный для огромного числа людей язык, кроме того, планирую собрать устройство, и если оно покажет приличные результаты собрать разработать его дешевый и доступный всем вариант. В силу моей занятости, статьи могут появятся нерегулярно, но до конца дело я доведу.

Итак, начнем с первой части статьи:


В ней автор представляется физиком, которому часто надо изобретать себе разнообразные инструменты). Как-то раз, он решил собрать себе осциллограф на Arduino. Проект он представил как "экстремальный", потому как хочет выжать из Arduino все, на что он способен.
Также автор хвастается что не видел осциллограф на Arduino быстрее своего.

Далее, просто перевод:

Некоторое время назад, я работал над проектом на Arduino, и мне было необходимо убедится, что выходной сигнал соответствует требованиям. Проведя поиски готовых проектов Arduino осциллографов, я не нашел ничего толкового. Проекты, которые есть в сети в основном состоят из графического интерфейса пользователя, написанного на processing, и простейшего скетча, типа такого:
 void setup() {
    Serial.begin(9600);
}

void loop() {
    int val = analogRead(ANALOG_IN);
    Serial.println(val);
}


Такой подход не является ошибочным, и  я не хочу никого обидеть. Но для меня это слишком медленно. Скорость последовательного порта очень низкая, и передавать каждый раз результат analogRead() не очень  хорошая идея.
Я изучал дискретизаторы аналоговых сигналов, и знаю как они работают. Вдохновение буду черпать из них.
таким образом были сформированы основные требования:
-входной сигнал должен сохранятся отдельно от Arduino
-сдвиг сигнала даст нам возможность видеть отрицательные значения
-данные должны помещаться в буфер
-для захвата сигналов нужны аппаратные триггеры
-кольцевой буфер может дать форму сигналу до триггера
-использование низкоуровневых функций дает выигрыш в скорости

Girino - шуточный каламбур на итальянском, означающий "Небольшой поворот". Также Girino это головастик, который и стал талиcманом проекта



понедельник, 15 сентября 2014 г.

Передача чисел по USART Mega48PA

Как то надо было следить за переменными по USART на ATMEGA48PA, в результате прочтения даташитов был получен следующий код:

/*
 * UART48.cpp
 *
 * Created: 15.09.2014 19:35:04
 *  Author: Serhiy
 */



#include <avr/io.h>
#define F_CPU 1000000L
#include<util/delay.h>



void MyUartInit()
{
 UBRR0 = 12; //из таблицы в даташите для 9600бод и частоты 1МГц
 UCSR0A|= 1<<U2X0;//из той же таблицы
 UCSR0B|= 1<<TXEN0;//включаем передатчик
}


void printInt(int i)//для вывода чисел 0-99
 {
  if(i<10)
  {
  i+=48;
  UDR0=i;
  while(!(UCSR0B&(1<<TXEN0)))
  {   }
  }
  else if(i<100)
  {
UDR0=(i/10)+48;
 while(!(UCSR0B&(1<<TXEN0)))
 {   }

 UDR0=i-((i/10)*10)+48;
  while(!(UCSR0B&(1<<TXEN0)))
  {   }
  }

 }
int main(void)
{

  MyUartInit();
 
   while(1)
   {
     printInt(87);
     _delay_ms(1000);
   }
}

воскресенье, 4 мая 2014 г.

LCD и Arduino

Для работы скетча достаточно только МК и ЖКИ
Проверочный скетч (с сайта Arduino)

#include <LiquidCrystal.h>


LiquidCrystal lcd(40, 41, 42, 43, 44, 45);

void setup() {

  lcd.begin(16, 2);

  lcd.print("hello, world!");
}

void loop() {

  lcd.setCursor(0, 1);

  lcd.print(millis()/1000);
}

Для того чтобы записать и проверить работу скетча в Proteus необходимо выполнить инструкции из данного поста.

воскресенье, 23 марта 2014 г.

Проверка скетча для Arduino Mega1280 в Proteus

Компилируем скетч, для этого нажимаем Verify в Arduino IDE:


Далее необходимо добыть hex или elf файлы для микроконтроллера. Для этого делаем следующее:

Вводим в адресную строку проводника %temp% и жмем Enter

 

Затем ищем папку название которой начинается с build, а дата создания соответствуе дате компиляции скетча
  

В этой папке и находятся elf и hex файлы:


Создаем ярлык на elf файл:

Далее в Proteus в настройках модели микроконтроллера Atmega1280 выбираем путь к этому ярлыку, и вводим остальные настройки как на рисунке:
Готово!