Официальный сайт компании Arduino по адресу arduino.cc
ArduinoIDE и ATmega16, формируем bootloader
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Зачем? В целях обучения, покопаться в потрохах, исходниках. Плюс не очень хочется некоторые вещи на асме писать. Итак, сегодня я опишу как изготовить bootloader для ATmega16. После того, как вы его прошьёте, ArduinoIDE увидит вашу ATmega16, однако чтобы писать скетчи, придется еще слегка попотеть, но об этом в другой раз.
Для начала опишу железо, которое я использовал:
PinBoardII - использовал как программатор, чтобы запрограммировать фьюзы и залить загрузчик в ATmega16;
Собственно ATmega16 из комплекта с PinBoardII;
Провода для подключения;
В качестве программы для прошивки фьюзов и заливки bootloader я использовал SynaProg;
ArduinoIDE v1.0.4.
Безусловно вы можете использовать другие программаторы (ISP), и программы для прошивки, мне было проще использовать именно эти. ATmega16 у меня с внешним кварцем на 16 MHz, хотя это не так принципиально. Главное правильно посчитать фьюзы и указать параметры компиляции в Makefile. Я установил следующие фьюзы: hfuse 0xD0, lfuse 0xFF. Описаний в интернете много, сегодня не буду на этом останавливаться.
Все пути, использованные в этой статье относительные. Они указаны относительно каталога, где установлен ArduinoIDE. Например, ArduinoIDE установлен в каталоге: "D:\Programs\arduino-1.0.4". Поэтому, если указан путь "hardware\arduino\bootloaders", значит полный путь будет таким: "D:\Programs\arduino-1.0.4\hardware\arduino\bootloaders".
Ок, перейдем к главному сегодняшнему вопросу, что нужно, чтобы прошить bootloader:
- Исходники bootloader. Их можно найти в папке "hardware\arduino\bootloaders". Для доработки я взял исходники из каталога "hardware\arduino\bootloaders\atmega"
- Для простоты я создал подкаталог atmega16 ("hardware\arduino\bootloaders\atmega16") и скопировал туда все файлы из atmega ("hardware\arduino\bootloaders\atmega\*").
- Далее я переименовал файл "ATmegaBOOT_168.c" в "ATmegaBOOT_16.c". Люблю порядок.
- Поскольку имена регистров разные на разных МК, я добавил соответствие имен 168 и 16, а именно, перед main() я добавил следующие строки (начиная с 272 строки):
#ifdef __AVR_ATmega16__ #define MCUSR MCUCSR #define WDTCSR WDTCR #define WDCE WDTOE #endif
Однако этого оказалось мало и мне пришлось исправить еще одну строку (402 строка). Вместо UCSRC = 0x06; я добавил следующий текст:
#ifdef __AVR_ATmega16__ UCSRC = _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); #else UCSRC = 0x06; #endif
Это нужно для корректной записи данных в регистр UCSRC. Для этого нужно установить старший бит (т.е. URSEL).
С исходниками всё. Но радоваться рано, нужно еще поколдовать с Makefile. Что такое Makefile? Об этом в другой раз, хотя, почему бы не почитать в интернете, вдруг я так и не соберусь об этом написать?
- Далее я изменил Makefile, чтобы можно было скомпилировать bootloader и получить желанную прошивку;
- Я заменил имя в строке 20 на:
PROGRAM = ATmegaBOOT_16
Подобную замену я сделал в строке 27:
MCU_TARGET = atmega16
- ATmega16 не имеет расширенных фьюзов (efuse), потому я убрал их использование из строки программирования фьюзов. Это строка 41, я просто удалил efuse, см. текст ниже:
-e -u -U lock:w:0x3f:m -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
Осталось немного, добавить параметры для ATmega16. Я вставил их перед строкой 199:
atmega16: TARGET = atmega16 atmega16: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS' atmega16: AVR_FREQ = 16000000L atmega16: $(PROGRAM)_atmega16_16MHz.hex atmega16_isp: atmega16 atmega16_isp: TARGET = atmega16_16MHz atmega16_isp: HFUSE = DD atmega16_isp: LFUSE = FF atmega16_isp: isp
Здесь явно просматриваются два блока, первый (atmega16) исопльзуется для компиляции, второй (atmega16_isp) для программирования. Сразу скажу, что второй блок я не использовал, а прошивал с помощью SynaProg, просто мне так было удобней. Поэтому в данной статье не описан процесс прошивки с использованием Makefile. Если кому то понадобится - расскажу отдельно.
- Остался один маленький шаг, чтобы скомпилировать bootloader. Но я лентяй, я пишу командные файлы, мне так удобней, вот мой файл comp.cmd, который поможет нам скомпилировать bootloader:
SET PATH=D:\Programs\a-104\arduino-1.0.4\hardware\tools\avr\utils\bin\;D:\Programs\a-104\arduino-1.0.4\hardware\tools\avr\bin\;%PATH% make -f Makefile clean make -f Makefile atmega16
Первая строка. У вас наверняка ArduinoIDE располагается в другом каталоге. Исправьте, поменяв путь "D:\Programs\arduino-1.0.4" на путь, куда установлен ваш ArduinoIDE.
- Стартуем comp.cmd и получаем "на выходе" файл ATmegaBOOT_16_atmega16_16MHz.hex
Собственно, для начала всё. Берем этот файл и прошиваем его в ATmega16 любой удобной программой. Я воспользовался SynaProg, прописав, предварительно фьюзы, затем bootloader.
На сегодня достаточно, завершим это увлекательное путешествие в другой раз :)
О чем я планирую рассказать в другой раз (впрочем, за раз не получится):
- Как добавить ATmega16 в список поддерживаемых "Arduino" в AruinoIDE
- Как описать соответствие портов ATmega16 и пинов Arduino16
- Как исправить исходники wiring, чтобы можно было использовать большинство библиотек ArduinoIDE, чтобы писать скетчи для ATmega16
- Выложить исходники всего того, что здесь описано
- Что то, о чем забыл упомянуть :)
Кстати, совсем забыл. Конечно это всё хорошо, но нужно помнить, что любые исправления, после установки новой версии ArduinoIDE придется переносить туда, что не очень удобно, но... такова жизнь!
Удачи!
Если изменения будут производиться исключительно в папке ArduinoIDE *\arduino-1.0.4\hardware\arduino\*, то её можно скопировать в папку "Мои документы", подпапку "Arduino", подпапку "hardware" (*\MyDOC\Arduino\hardware\*), тогда ArduinoIDE подхватит всё содержимое этой папки.
Остаётся отредактировать содержимое подпапок: удалить не относящиеся к Atmega16 лоадеры, в boards.txt вписать свою плату или несколько вариантов своей платы.
Так же можно создать несколько копий папки "arduino"(*\MyDOC\Arduino\hardware\arduino_1\*,*\MyDOC\Arduino\hardware\arduino_2\*,*\MyDOC\Arduino\hardware\arduino_N\*) и в них запиливать исходники под свои нужды.
Тогда, не зависимо от версии ArduinoIDE, оригинальные исходники останутся целы, а нам можно будет пользовать модифицированные.
зы
Админам форума: приструните, пожалуйста, свой псевдоинтеллектуальный редактор постов - зачем эти двойные расстояния между строками сообщения, и прыгающая страница после каждого перевода сроки?
Спасибо за информацию, попробую.
kisoft для особо тупого поясни плиз что конкретно выкинуть?
Я правильно понимаю?, вместо 402 строки пишем:
А что делать с 403 строкой? удалять ее, или оставить, и код должен выглядеть так?
403 оставить как есть. В новом исходнике она у тебя 407 строка. Т.е. последний исходник правильный.
403 оставить как есть. В новом исходнике она у тебя 407 строка. Т.е. последний исходник правильный.
А 408 в нов. редакции тоже правильно?
Трудно сказать, исходники дома. Самое простое повторить два действия снова ;) А также если будет ошибка при компиляции. Лишний #endif здесь даст ошибку
Хорошо, буду пробовать.
Напиши мне на мой ник рамблер ру, вышлю исходники, пока не знаю куда выложить. Кстати фьюзы уже знаешь какие программировать? Кварц внешний? Частота кварца?
Исходники, точнее все файлы, которые я изменил относительно arduino1.0.4, я выложил здесь:
https://sites.google.com/site/kisoft63/pinboardii/pinboardii там единственный приложенный файл-архив.
Если что не так, пишите (емейл мой я в начале этого сообщения написал)
UPD: да, 408 строка правильная, там #endif должен быть
kisoft, спасибо за проделанную работу. Как раз заинтересовало, как использовать arduino ide для МК atmega32 - больше пинов, чем в 328, найти ее легко, да и цена адекватная, в отличии от 328, которые днем с огнем не найдешь, да и цены из-за этой arduin-ы на нее не адекватные...
Я правильно понял, по поводу нумерации пинов - они соответсткуют стандартной дуине плюс новые продолжают нумерацию? То есть шильды подключаются к тем же пинам, что и на обычной дуине?
Ввиду того, что на ATmega16/32 нет "живых" Arduino, использование этих МК связано с некоторыми проблема поддержки софта и т.п. Сейчас в ядре ArduinoIDE есть поддержка ATmega16, например, можно поискать файл iom16.h, это как раз для неё. Но, это только на уровне ядра, а в библиотеках поддержки нет, увы.
Далее пины. Единого стандарта нет. Если посмотреть в исходники, да и так, в библиотеки, можно увидеть блоки условной компиляции, которые реализуют то или иное управление пином, например в Mega и в Uno. Самый простой пример, SPI, в Uno одни пины, в Mega - другие. Да, собственно, о чем говорить, цоколевка МК для большинства разная. Бывают приятные исключения, например, ATmega16 & ATmega32 (насколько я помню, там выводы МК одинаковые, в смысле на одинаковых ногах - одинаковые порты и функции).
Пины для Arduino16 (назову её так условно). Их там больше, чем в Uno, их там 32 из них 8 аналоговых. Это как раз три порта по 8 бит. PWM опять же, в ATmega16 пинов с PWM - три. Теперь о гравном, что такое подключить шилд к Arduino16, это вопрос больше философский, потому что Arduino16 - это у нас в голове и не реализовано никем из производителей. Разумеется можно приблизить Arduino16, например, к Uno, разведя плату так же, чтобы одинаковые пины были на одних и тех же местах. А дополнительные вынести на другие разъемы. Наверное есть и другие варианты.
Потому вопрос скорее к тому, кто будет это делать, как он собирается делать. Т.е. приближать к стандартному, например, Uno или нет. Опять же возникает вопрос, а нужно ли это? Обычно свои произведения (слово "поделки" не понравилось) программируются на ассемблере и это уже совсем не Arduino в его обычном понимании.
Лично я, как уже говорил, сделал это для того, чтобы некоторые вещи быстро обкатать, не заморачиваясь на ассемблер. Но если бы я паял сам, то вряд ли я стал использовать ArduinoIDE, скорее бы перешел на ассемблер. А чтобы не было холивара, нужно сразу сказать, ассемблер для одних задач, C++ для других. На C++ написать чаще проще, однако и места оно будет занимать не в пример больше (как правило! Но не всегда).
По пинам я могу сказать просто, смотрите в выложенном мной архиве файл pins_arduino.h, там есть (и даже нарисовано) соответствие номеров пинов и их функциональное назначение. Например:
Сравниваем с пинами на Mege:
Можете еще посмотреть на стандартный вариант в "hardware/arduino/variants/standard", там вообще:
По поводу принципов нумерации, могу сказать следующее. Как правило, в начале идут цифровые пины, в стандарте это 0 - 13, далее аналоговые 14 - 21. В свою очередь, цифровые пины (впрочем и аналоговые тоже) могут функционировать в разных вариантах, например, пины 0 - 1 используются для RX - TX, с 10 по 13 - SPI. Т.е. вцелом можно сказать (ИМХО, конечно, могу и не ошибаться), что аналоговые пины - они всегда в верхней части нумерации, т.е. они всегда с бОльшими номерами. Собственно я руководствовался именно этим принципом, когда делал pins_arduino.h.
Ой, кажется я заболтался. Короче говоря, если хотите ответа и не нашли его в том, что я сейчас наваял, то попробуйте сформулировать это вопрос как то по другому. Готов помочь, чем смогу.
Далее пины. Единого стандарта нет.
А Mighty-1284/644, по ногам совпадают с MEGA16/32. Зачем велосипед изобретать?
Не проще было их файлы довести под M16/32?
Я сразу написал, что мне было интересно покопаться в исходниках и в исходниках от разработчика. А доделывать чужие доработки мне не интересно.
К тому же мои доработки не предполагают полной поддержки ардуино16, а всего лишь работа тех библиотек, что мне нужны сейчас. Может быть потом, кто знает.
Да, спасибо за информацию, я не видел mighty, возможно посмотрю
Оказалось всё достаточно просто. Допилил. Ардуино16 в arduinoIDE работает, в том числе Tone.
Статья будет чуть позже.
Ждем-с...
Ок, планирую в отдельной теме, на днях напишу.
Главная проблема в таймерах. В простейших случаях помогает аналогия с атмега8.
Еще, нужно быть готовым, что в библиотеках будут проблемы. Вчера с triada13 поднял IRremote, правда не до конца, добью еще.
Привет. Что нибудь получилось с бутлоадером под атмегу16? Очень интересно, а то под мой проект ног не хватает у 168 и 328 атмег. А целую мегу использовать как то через чур.
Да получилось, я свою уже прошил.
Да получилось, я свою уже прошил.
Ну так поделитесь своими тайными знаниями, а лучше bootloaderom и фьюзами.
Всю неделю как белка в колесе. Бутлоадер можно найти по ссылке в 8 сообщении. Фьюзы я уже написал, D0 и FF для внешнего кварца на 16 МГц.
Завтра, максимум послезавтра выложу апдейт для 1.0.4
Спасибо. Все работает! :)
Бутлоадера мало, хотя блинк должен работать :)
Статья по изменению ядра и ссылки на исходники можно найти здесь
а тип USB устройства и его символьное имя для Atmega32u4 записаны в загрузчике ?
http://arduino.ru/forum/programmirovanie/pro-micro-328u4#comment-44911
Леонардовский Загрузчик не смотрел, кстати, надо глянуть.
Хотя в нем usb аппаратное.. Короче говоря - не могу помочь, не знаю, увы., надо погуглить
Лучше на это не надеяться, времени свободного очень мало и даже если я посмотрю, это произойдет не завтра и не через неделю.
Всем доброго времени суток. Уважаемый kisoft не могли бы Вы подсказать что и где нужно допилить, что бы использовать Atmega16 с кварцем на 8МГц? Просто в этом деле я пока более чем дилетант. Если простенький скетч еще могу накидать, то прикрутить проц к ArduinoIDE пока не знаю как. Конечно во всем можно разобраться но это время, а нужно срочно оживить существующий микроконтроллер на Atmega16 с кварцем на 8МГц. Проблема может вылезти с частотой потому, что надо будет использовать ШИМ. Вообще в идеале использовать готовое решение если таковое имеется.
Вы хотите в ArduinoIDE включить поддержку атмеги16 или в другой среде. Если ArduinoIDE, то в какой версии? Для 1.6 я еще не делал доработку.
А вцелом нужно править ядро, загрузчик и boards.txt.
Да хотелось бы прикрутить к ArduinoIDE. Версия не важна, есть и 1.0.5 и 1.6. Просто выбор на эту платформу пал из-за простоты программирования. Как писал выше имеется нес-ко контроллеров на основе Atmega16 но там впаяны кварцы на 8МГц. Причем физическая замена кварцев на 16МГц крайне не привествуется.
Для академических целей неплохо. Для практических конструктором как-то проще и быстрее:)
Конструктором вроде бутлодер и текст для boards.txt уже подготовлен. А вот библиотеки будут нормально с ним работать? Или надо что то еще сделать? Если что то не пойдет и все это дело зависнет, могут голову отвернуть и сказать, что так и было :).
Кстати еще вопрос. Имеет ли значение в каком корпусе Atmega16? В данном случае имеем корпус SMD с 44-я пинами.
Для ArduinoIDE v1.0.5 Вы можете скачать готовую доработку ядра здесь. Только boards.txt на 8МГц исправьте (возможно подойдет и Ваша уже исправленная).
Какие грабли ждут каждого, кто хочет использовать "не стандартные" Ардуино:
1. Поддержки у производителя нет, поэтому придется патчить ядро и прочее при переходе на новую версию ArduinoIDE.
2. Любая новая библиотека (не из комплекта ArduinoIDE) может глючить как угодно (придется копаться и патчить под свой камень).
3. В нужный момент может не оказаться патченной версии ядра для доработки "на месте".
Варианты:
1. Маяться и разгребать грабли.
2. Использовать другую среду, которая не требует патчей (например, Atmel Studio и другие).
Оба варианта со своими плюсами и минусами, так что, се ля ви :) Второй вариант более надежен, потому что не требует патчей. Ну потеряете возможность использовать функции типа digitalRead/Write например, однако от этого еще никто не умирал ;)
Если будут вопросы, спрашивайте. Быстрый ответ не гарантирую, но разобраться помогу.
UPD: Да, в другом корпусе - это не важно, просто выводы у неё будут другие, например PB0 это уже будет не ножка 1, а ножка 40 и т.п. Возможно есть и другие отличия, но не принципиальные, впрочем это мои предположения, я не копался с этим. Знаю, например, что в Atmega328 появляются два лишних пина A6 & A7 и то с особенностями, про другие камни - не подскажу. Это всегда можно посмотреть в даташите.
Спасибо.
Ну при такой постановке вопроса я бы вообще не использовал ардуино, это все-таки игрушка. ;)
А если серьезно, то атмега16 не пробовал, а атмега8 работают отлично.
А тут как раз и не ардуино. Это микроконтроллеры на основе Atmega16. У них своя архитектура и периферия. От Ардуино планируется использовать только среду программирования, так как ее возможностей должно хватить в данном случае. AVR Studio вроде покруче будет, но и на порядок сложнее в освоении. А сейчас просто надо запустить как можно быстрее. Показать, что оборудование работает.
Гм, имхо, ардуино это и есть "среда програмирования" для обучения, для серьезных задач не предназначенная.
Impuls-sv, Если Вы не руководитель, которому практически пофиг, на чем будет реализована система (и он совершенно прав, ведь для этого и есть в штате разработчики!), то я бы порекомендовал всё таки не использовать wiring (ArduinoIDE). Напишите замену wiring функций, которые Вы используете, практически и всё.
Плюсы очевидны разработчику, т.е. не нужно будет за собой тащить какашку в виде патчей и чертыхаться при использовании новых библиотек, т.е. не будет фактора неожиданности, когда завтра понадится прилепить стороннюю библиотеку, а она скажет "мяу".
Есть и другой подход, использовать ArduinoIDE, быстренько отчитаться о сделанной работе, а потом маяться и плеваться. Утешая свою совесть тем, что якобы потом переделаем по ходу дела. Для меня это лажовый вариант и вообще не вариант.
Разумеется, Вы выберете свой вариант :)
ПС У меня многолетний опыт, в т.ч. руководством разработки (вед.специалист, рук.отдела), потому я знаю про эти варианты не по наслышке.
Всё, не буду больше мозг полоскать :) Забейте на мою философию :)
Гм, имхо, ардуино это и есть "среда програмирования" для обучения, для серьезных задач не предназначенная.
Ну в приципе да. Просто как я сказал выше ее уровня на текущий момент как раз хватит. Хотя "среда програмирования" это всего лишь програмная часть. Ардуиновское железо тоже оформлено как игрушечный конструктор.
Напишите замену wiring функций, которые Вы используете, практически и всё.
Вот с этим как раз пока большая проблема. В смысле с написанием.
Есть и другой подход, использовать ArduinoIDE, быстренько отчитаться о сделанной работе, а потом маяться и плеваться.
Почти так и есть, но с небольшим отличием. Нужно чтобы зашевелилось железо (в смысле не контроллеры, а то чем они управляют) для проверки работоспособности, соответствия кинематики и т.д. А полное программирование скорее будет делать специально обученный человек :).
можно ли зделать загрузчик на 12 МГц для атмега16?перечитал ветку и не совсем все понял(начинающий в ардуино,но с атмега опыт небольшой есть)
можно ли зделать загрузчик на 12 МГц для атмега16?перечитал ветку и не совсем все понял(начинающий в ардуино,но с атмега опыт небольшой есть)
можно - внимательно читай первый пост
Можно в этом конструкторе
Пробовал конструктором-ноль,из первого поста понятия не имею что делать,например-
"Остался один маленький шаг, чтобы скомпилировать bootloader. Но я лентяй, я пишу командные файлы, мне так удобней, вот мой файл comp.cmd, который поможет нам скомпилировать bootloader:..."
пробовал и в авр студио,и в квавр-ничерта не понимаю в какой программе компилировать,и что такое командная строка тоже не пойму(есть командная строка в виндовс 7 но в данном случае это точно не оно)
попробовал прошить это-http://avrproject.ru/publ/poleznaja_informacija/ispolzovanie_zagruzchika_bascom_avr/4-2-0-109 все работает без проблем на частоте 8 мгц(то есть атмега16 шьется через переходник на сн340т)
пробовал и в авр студио,и в квавр-ничерта не понимаю в какой программе компилировать,и что такое командная строка тоже не пойму(есть командная строка в виндовс 7 но в данном случае это точно не оно)
написано же чёрным по белому
==============
- Остался один маленький шаг, чтобы скомпилировать bootloader. Но я лентяй, я пишу командные файлы, мне так удобней, вот мой файл comp.cmd, который поможет нам скомпилировать bootloader:
1
SET PATH=D:\Programs\a-104\arduino-1.0.4\hardware\tools\avr\utils\bin\;D:\Programs\a-104\arduino-1.0.4\hardware\tools\avr\bin\;%PATH%
2
make -f Makefile clean
3
make -f Makefile atmega16
Первая строка. У вас наверняка ArduinoIDE располагается в другом каталоге. Исправьте, поменяв путь "D:\Programs\arduino-1.0.4" на путь, куда установлен ваш ArduinoIDE.
- Стартуем comp.cmd и получаем "на выходе" файл ATmegaBOOT_16_atmega16_16MHz.hex
=========
как это ещё можно иначе понять, что бы пытаться компилить в авр студии или где-то ещё - где сказано про авр студию, если сказано
- Стартуем comp.cmd и получаем "на выходе" файл ATmegaBOOT_16_atmega16_16MHz.hex
вот я и не понимаю где скачать этот comp.cmd
где вообще,в какой программе найти этот comp.cmd?
вот я и не понимаю где скачать этот comp.cmd
где вообще,в какой программе найти этот comp.cmd?
вот мой файл comp.cmd, который поможет нам скомпилировать bootloader:
расечатать?
1
SET PATH=D:\Programs\a-104\arduino-1.0.4\hardware\tools\avr\utils\bin\;D:\Programs\a-104\arduino-1.0.4\hardware\tools\avr\bin\;%PATH%
2
make -f Makefile clean
3
make -f Makefile atmega16
==
расшифровываю - создать руками файл comp.cmd и скопировать в него содержимое кода.
Все правильно, если тема называется ArduinoIDE.... то было бы удивительно, если бы мы собирали загрузчик другой программой.
Ок, упростим объяснение, comp.cmd (текст которого я приводил) использует компилятор из пакета ArduinoIDE.
В общем не нашел я как создать файл com.cmd (у меня получается com.cmd.ini и нифига не компилируется),где стартуем com.cmd,видимо это не для меня
за сим откланиваюсь,удачи!
В общем не нашел я как создать файл com.cmd (у меня получается com.cmd.ini и нифига не компилируется),где стартуем com.cmd,видимо это не для меня
за сим откланиваюсь,удачи!
не каждому программисту дан талант создавать файлы...
не все тут такие "талантливые",да и не похоже что вы таланливый человек-вы даже толком обьяснить не можете что и как...