Есть ли возможность адаптировать прошивки С. Кухтецкого [4] на микроконтроллер ATMega328PU, установленный на макетной плате metaboard [1]?
Да, конечно, и сделать это довольно просто.
Примечание: прошивка Сергея Кухтецкого - это программа для макетной платы 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 должна быть выставлена так:
Примечание: здесь не случайно указано компилировать для микроконтроллера ATmega168, несмотря на то, что применен микроконтроллер ATmega328PU. Дело в том, что получающийся двоичный код для ATmega168 все равно будет нормально работать и на ATmega328. Однако если компилировать с опцией DEVICE=atmega328 (или atmega328p, что одно и то же), то со старыми версиями библиотеки V-USB полученная прошивка для устройства USB может не заработать (подробнее описание проблемы см. в [5]).
Значение переменной F_CPU в файле должно соответствовать частоте кварца, который стоит на Вашей макетной плате metaboard. Например, если частота кварца 16 МГц, то значение F_CPU должно быть 16000000. Значение F_CPU задается в makefile следующим образом:
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? |