Использование библиотек Arduino с ATmega8A
В статье разобрано подключение ATmega8A вместо ATmega328 в Arduino UNO R3. Описана "заливка" bootloader в микроконтроллер. Дана схема включения ATmega8 с "распиновкой" от Arduino.
Предистория: Понадобился как-то приемник сигнала RF433 для включения исполнительного устройства. Готовой программы для ATtiny не нашел, а использовать "целую Ардуино" для такой задачки не хотелось...
Анализ алгоритма приема команд в библиотеке RCswitch показал "уж очень" неэффективное использование оперативной памяти МК: во всяком случае памяти даже ATtiny2313 на это не хватит...
"В закромах" "валялась" ATmega8A и сразу подумалось: а не использовать ли эту "более мощную" штучку для решения задачи, не тратя при этом время на разработку программы? Воспользуемся готовыми библиотеками!
Итак, план работ такой:
"Втыкаем" ATmega8 в Arduino UNO
Для начала, подключаем Arduino UNO R3 через ISP к программатору от Algorithm Builder (можно к любому другому, но у меня - этот, см фото). Пришлось воспользоваться кучей проводов, т.к. IDC-08F от программатора "никак не хотел" втыкаться в 6-ти штырьковый ICSP разъем на плате Arduino UNO (мешает панелька с микросхемой).
Предистория: Понадобился как-то приемник сигнала RF433 для включения исполнительного устройства. Готовой программы для ATtiny не нашел, а использовать "целую Ардуино" для такой задачки не хотелось...
Анализ алгоритма приема команд в библиотеке RCswitch показал "уж очень" неэффективное использование оперативной памяти МК: во всяком случае памяти даже ATtiny2313 на это не хватит...
"В закромах" "валялась" ATmega8A и сразу подумалось: а не использовать ли эту "более мощную" штучку для решения задачи, не тратя при этом время на разработку программы? Воспользуемся готовыми библиотеками!
Итак, план работ такой:
- "Втыкаем" ATmega8 в Arduino UNO
- Отлаживаем на Arduino программу и "железо"
- Собираем схему приемника на ATmega 8 в том виде, в каком надо...
"Втыкаем" ATmega8 в Arduino UNO
Для начала, подключаем Arduino UNO R3 через ISP к программатору от Algorithm Builder (можно к любому другому, но у меня - этот, см фото). Пришлось воспользоваться кучей проводов, т.к. IDC-08F от программатора "никак не хотел" втыкаться в 6-ти штырьковый ICSP разъем на плате Arduino UNO (мешает панелька с микросхемой).
Воспользуемся случаем, чтобы сделать резервную копию содержимого ATmega 328. Создаем в Algorithm Builder новый проект.
Выясняем состояние Fuse битов микросхемы ATMega328P. Идем в Опции -> Fuse bits -> Read (см скриншоты выше)
Читаем состояние памяти микросхемы ATMega328P. Нам важны последние 512 байт - там загрузчик.
Программа -> Прочитать кристалл. Указываем имя файла .hex : arduinoUNOr3_328P.hex (сам считанный файл - лежит тут)
(надо тут отметить, что чтение идет довольно долго (примерно 2 минуты))
Теперь, собственно, займемся делом: вынимаем микросхему ATMega328P из платы Arduino и вставляем на ее место микросхему ATMega8A (она, пока, чистая; во всяком случае, ее содержимое для нас безразлично...)
Снова создаем в Algorithm Builder новый проект - теперь с целью заливки в мегу программы-загрузчика...
Выбираем в опциях проекта тип микроконтроллера - ATMega8
Выставляем Fuse bits как показано на скриншоте справа
В шапке поля проекта пишем указание на внешний hex файл прошивки : ATmegaBOOT-prod-firmware-2009-11-07.hex
Сам файл берем из C:\Program Files\Arduino\hardware\arduino\bootloaders\atmega8, но его надо поместить в папку создаваемого проекта.
!!! ВАЖНО. При компиляции настоящего файла из Program Files дает ошибку, т.к. в предпоследней строке есть данные "непонимаемые AB" - надо убрать строку; конец файла должен быть такой:
:101FD000E199FECFBFBBAEBB0DBA11960FB6F89418
:081FE000E29AE19A0FBE089598
:021FE800800077
>>> эту строку надо убрать >>>:0400000300001C00DD
:00000001FF
(готовый проект для среды Algorithm Builder : BootLoaderUNO_8A.alp)
Выясняем состояние Fuse битов микросхемы ATMega328P. Идем в Опции -> Fuse bits -> Read (см скриншоты выше)
Читаем состояние памяти микросхемы ATMega328P. Нам важны последние 512 байт - там загрузчик.
Программа -> Прочитать кристалл. Указываем имя файла .hex : arduinoUNOr3_328P.hex (сам считанный файл - лежит тут)
(надо тут отметить, что чтение идет довольно долго (примерно 2 минуты))
Теперь, собственно, займемся делом: вынимаем микросхему ATMega328P из платы Arduino и вставляем на ее место микросхему ATMega8A (она, пока, чистая; во всяком случае, ее содержимое для нас безразлично...)
Снова создаем в Algorithm Builder новый проект - теперь с целью заливки в мегу программы-загрузчика...
Выбираем в опциях проекта тип микроконтроллера - ATMega8
Выставляем Fuse bits как показано на скриншоте справа
В шапке поля проекта пишем указание на внешний hex файл прошивки : ATmegaBOOT-prod-firmware-2009-11-07.hex
Сам файл берем из C:\Program Files\Arduino\hardware\arduino\bootloaders\atmega8, но его надо поместить в папку создаваемого проекта.
!!! ВАЖНО. При компиляции настоящего файла из Program Files дает ошибку, т.к. в предпоследней строке есть данные "непонимаемые AB" - надо убрать строку; конец файла должен быть такой:
:101FD000E199FECFBFBBAEBB0DBA11960FB6F89418
:081FE000E29AE19A0FBE089598
:021FE800800077
>>> эту строку надо убрать >>>:0400000300001C00DD
:00000001FF
(готовый проект для среды Algorithm Builder : BootLoaderUNO_8A.alp)
Теперь все готово для программирования. Программируем с установкой флагов как показано на рисунке.
Вроде бы все! Но... Проблема
Попытка загрузить очередной скетч - не удалась. Такое впечатление, что повторную загрузку загрузчик не отрабатывает (нет перемигивания диодов).
Временно решил так: снова залил загрузчик с очисткой микросхемы (см.инструкцию выше)
После этого загрузился скетч с примером приема RF433: ReceiveDemo_Advanced - работает нормально.
Снова пытаемся загрузить Blink - не идет: pin13 горит постоянно (похоже, что автозагрузчик при наличии программы - не запускается...)
Решение проблемы
Вопреки образцу (то, что мы "слили" с ATmega328) надо fuse bit BOOTRST запрограммировать (при этом таблица векторов прерываний переносится в область bootloader). После такого программирования (вышеприведенный скриншот с fuse bits надо скорректировать так как указано справа) все программируется как надо. Ожидание выхода на рабочую программу после СБРОС (время когда bootloader ждет загрузки по последовательному интерфейсу) - около 5-7 секунд.
Попытка загрузить очередной скетч - не удалась. Такое впечатление, что повторную загрузку загрузчик не отрабатывает (нет перемигивания диодов).
Временно решил так: снова залил загрузчик с очисткой микросхемы (см.инструкцию выше)
После этого загрузился скетч с примером приема RF433: ReceiveDemo_Advanced - работает нормально.
Снова пытаемся загрузить Blink - не идет: pin13 горит постоянно (похоже, что автозагрузчик при наличии программы - не запускается...)
Решение проблемы
Вопреки образцу (то, что мы "слили" с ATmega328) надо fuse bit BOOTRST запрограммировать (при этом таблица векторов прерываний переносится в область bootloader). После такого программирования (вышеприведенный скриншот с fuse bits надо скорректировать так как указано справа) все программируется как надо. Ожидание выхода на рабочую программу после СБРОС (время когда bootloader ждет загрузки по последовательному интерфейсу) - около 5-7 секунд.
Отлаживаем на Arduino программу и "железо", собираем схему на ATmega 8 в том виде, в каком надо...
Тут и писать нечего, далее - "дело техники": создаем/модифицируем скетч, отлаживаем его на ATmega8.
Готовую микросхему с отлаженной прошивкой устанавливаем в плату. За основу разработки берем принципиальную схему платы Arduino NG - см схему на рисунке
Тут и писать нечего, далее - "дело техники": создаем/модифицируем скетч, отлаживаем его на ATmega8.
Готовую микросхему с отлаженной прошивкой устанавливаем в плату. За основу разработки берем принципиальную схему платы Arduino NG - см схему на рисунке
размещено: 11 января 2015 года