Программирование AVR: работа с USB Адаптация прошивки Сергея Кухтецкого для metaboard Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Адаптация прошивки Сергея Кухтецкого для metaboard Печать
Добавил(а) microsin   

Есть ли возможность адаптировать прошивки С. Кухтецкого [4] на микроконтроллер ATMega328PU, установленный на макетной плате metaboard [1]?

metaboard-IMG_1402.JPG

Да, конечно, и сделать это довольно просто.

Примечание: прошивка Сергея Кухтецкого - это программа для макетной платы AVR-USB-MEGA16 [2], которая позволяет управлять всеми ресурсами микроконтроллера (дергать ножками, работать с АЦП, работать с таймерами-счетчиками, последовательным портом и другой аппаратурой микроконтроллера ATmega) из программы на языке C# (Visual Studio). Макетная плата с AVR-USB-MEGA16 выступает при этом как устройство USB HID, которое подчиняется командам, отправляемым ей из программы на языке C# (подробнее см. [3, 4]. Благодаря этой замечательной возможности упрощается процесс взаимодействия ПО хоста (программа компьютера) с устройством USB HID. В этой статье описывается процесс адаптации прошивки Сергея Кухтецкого для макетной платы metaboard.

Для того, чтобы прошивка Сергея Кухтецкого заработала на плате metaboard, нужно всего лишь правильно установить в проекте тип микроконтроллера и тактовую частоту кварца. Процесс по шагам:

1. Скачайте проект прошивки С. Кухтецкого. Ссылка есть в статье [3] (см. раздел [Ссылки], ссылка 8).

2. Распакуйте архив. В папке firmware есть несколько вариантов прошивки Сергея Кухтецкого. Можете взять любой, например проект V-USB_C#_libusb\firmware\phmeter-fw.

3. В проекте phmeter-fw, как и в большинстве проектов для AVR, есть файл Makefile, где задаются опции компиляции. Вам нужно проверить две опции, чтобы они соответствовали metaboard: DEVICE (тип микроконтроллера) и F_CPU (рабочая частота микроконтроллера).

Значение переменной DEVICE должно соответствовать используемому микроконтроллеру на плате metaboard. Если, например, у Вас применяется микроконтроллер ATmega328PU, то переменная DEVICE должна быть выставлена так:

DEVICE  = atmega168

Примечание: здесь не случайно указано компилировать для микроконтроллера ATmega168, несмотря на то, что применен микроконтроллер ATmega328PU. Дело в том, что получающийся двоичный код для ATmega168 все равно будет нормально работать и на ATmega328. Однако если компилировать с опцией DEVICE=atmega328 (или atmega328p, что одно и то же), то со старыми версиями библиотеки V-USB полученная прошивка для устройства USB может не заработать (подробнее описание проблемы см. в [5]).

Значение переменной F_CPU в файле должно соответствовать частоте кварца, который стоит на Вашей макетной плате metaboard. Например, если частота кварца 16 МГц, то значение F_CPU должно быть 16000000. Значение F_CPU задается в makefile следующим образом:

F_CPU = 16000000

4. Подправьте код, где используется регистр TIMSK (в ATmega328 этому регистру соответствует регистр TIMSK1). Для этого текстовым редактором откройте файл модуля кода main.c, и перейдите к телу функции обработчика прерывания ISR(TIMER1_COMPA_vect). Код должен быть таким (нужно добавить директивы условной компиляции препроцессора, проверяющие тип используемого микроконтроллера):

//-----------------------------------------------------------------------------
// Обработчик прерывания от таймера 1 (COMPA)
//-----------------------------------------------------------------------------
ISR(TIMER1_COMPA_vect)
{
   sei();
   if(lcFlag && (lc >= lcm))
#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega328__)
      TIMSK1 &= (byte)(~(1 << OCIE1A)); // Запрещаем прерывания по таймеру TIMER1
#else
      TIMSK  &= (byte)(~(1 << OCIE1A)); // Запрещаем прерывания по таймеру TIMER1
#endif
   else
      SMDoStep();
}

5. Перекомпилируйте проект. Для этого обычно используются команды make. Сначала выполните make clean, затем make hex (подразумевается, что у Вас установлена рабочая среда WinAVR). В результате получите файл прошивки main.hex, который можете загрузить в плату metaboard с помощью бутлоадера.

Примечание: подобным образом прошивка Сергея Кухтецкого может адаптирована на любой микроконтроллер ATmega, если подключение через USB происходит через те же самые ножки портов, как и на макетной плате AVR-USB-MEGA16. Если же ножки другие, то понадобится дополнительно вносить правки в файл usbconfig.h (для metaboard этого делать не надо, потому что подключение сигналов D+ и D- совпадает с платой AVR-USB-MEGA16).

6. Прошивка для устройства USB готова (это файл main.hex). Если Вы прошьете её в память микроконтроллера metaboard, то устройство USB Сергея Кухтецкого [4] будет готово к выполнению команд. Однако это еще не все. Дело в том, что для доступа к ресурсам микроконтроллера (порты ввода/вывода GPIO, АЦП, таймеры/счетчики, UART и т. п.) в ПО хоста используются физические адреса регистров. И эти адреса различаются для микроконтроллеров ATmega16/32 и ATmega168/328.

Поэтому требуется модификация класса C# для ПО хоста (Visual Studio 2010), где прописаны физические адреса регистров микроконтроллера. Этот класс расположен в файле ATmega16.cs. Сделайте копию этого файла в файл ATmega328.cs, внесите в него исправления (чтобы физические адреса регистров и констант соответствовали), и подключите этот новый файл класса к Вашему проекту ПО хоста.

Физические адреса регистров микроконтроллера ATmega328 можно узнать из файла iomx8.h (его можно найти в тулчейне WinAVR, папка будет называться наподобие c:\WinAVR-20100110\avr\include\avr\). Вот так, к примеру, определены в классе C# ATmega16.cs регистры микроконтроллера ATmega16 (ATmega32) для работы с портом B:

public const byte aPINB  = 0x16;
public const byte aDDRB  = 0x17;
public const byte aPORTB = 0x18;

Для класса ATmega328.cs нужно переопределить адреса регистров порта следующим образом:

public const byte aPINB  = 0x03;
public const byte aDDRB  = 0x04;
public const byte aPORTB = 0x05;

Точно так же необходимо переопределить все остальные атрибуты и константы класса ATmega328.cs, чтобы физические адреса всех используемых регистров соответствовали реально существующим адресам регистров микроконтроллера ATmega328P.

[Ссылки]

1. Макетная плата metaboard.
2. Макетная плата AVR-USB-MEGA16.
3. AVR-USB-MEGA16: измеряем и контролируем температуру.
4. AVR-USB-MEGA16: быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16.
5. Почему не работает библиотека V-USB с микроконтроллером AVR?

 

Добавить комментарий


Защитный код
Обновить

Top of Page