Что такое Фьюзы. Чтение и запись фьюзов Ардуино
Сегодня я хочу рассказать о том, что такое фьюзы, за что они отвечают и как их можно прочитать и записать в Ардуино. Рекомендую также заглянуть в предыдущую публикацию, т.к. работа с фьюзами возможна только через программатор.
Фьюзы (от английского Fuse bits) – это конфигурационные биты микроконтроллера, отвечающие за его предварительную настройку. Эти биты расположены в отдельном адресном пространстве, доступном только при программировании. Биты объединяются в конфигурационные байты и их состав зависит от конкретной модели микроконтроллера.
При работе с конфигурационными битами нужно помнить один важный момент: если бит содержит логическую единицу, то это означает что он не запрограммирован, соответственно, запрограммированный конфигурационный бит содержит логический ноль. Такая логика основана на принципе хранения данных в EEPROM: чистая микросхема памяти содержит во всех ячейках единицы, а термин запрограммирована по отношению к такой ячейке означает, что в нее записали ноль.
Фьюзы ATmega328 / ATmega328p
Микроконтроллеры ATmega328 и ATmega328p, на базе которых построено большинство плат семейства Ардуино, имеют 3 байта конфигурации: младший, старший и дополнительный. Их описание приведено ниже в таблицах.Младший конфигурационный байт ATmega328/P
Номер бита | Навание | Описание | Значение по умолчанию |
---|---|---|---|
7 | CKDIV8 | Divide clock by 8 | 0 (запрограммирован) |
6 | CKOUT | Clock output | 1 (не запрограммирован) |
5 | SUT1 | Select start-up time | 1 (не запрограммирован) |
4 | SUT0 | Select start-up time | 0 (запрограммирован) |
3 | CKSEL3 | Select Clock source | 0 (запрограммирован) |
2 | CKSEL2 | Select Clock source | 0 (запрограммирован) |
1 | CKSEL1 | Select Clock source | 1 (не запрограммирован) |
0 | CKSEL0 | Select Clock source | 0 (запрограммирован) |
Старший конфигурационный байт ATmega328/P
Номер бита | Навание | Описание | Значение по умолчанию |
---|---|---|---|
7 | RSTDISBL | External Reset Disable | 1 (не запрограммирован) |
6 | DWEN | debugWIRE Enable | 1 (не запрограммирован) |
5 | SPIEN | Enable Serial Program and Data Downloading | 0 (запрограммирован) |
4 | WDTON | Watchdog Timer Always On | 1 (не запрограммирован) |
3 | EESAVE | EEPROM memory is preserved through the Chip Erase | 1 (не запрограммирован) |
2 | BOOTSZ1 | Select Boot Size | 0 (запрограммирован) |
1 | BOOTSZ0 | Select Boot Size | 0 (запрограммирован) |
0 | BOOTRST | Select Reset Vector | 0 (запрограммирован) |
Дополнительный конфигурационный байт ATmega328/P
Номер бита | Навание | Описание | Значение по умолчанию |
---|---|---|---|
7 | – | – | 1 |
6 | – | – | 1 |
5 | – | – | 1 |
4 | – | – | 1 |
3 | – | – | 1 |
2 | BODLEVEL2 | Brown-out Detector trigger level | 1 (не запрограммирован) |
1 | BODLEVEL1 | Brown-out Detector trigger level | 1 (не запрограммирован) |
0 | BODLEVEL0 | Brown-out Detector trigger level | 1 (не запрограммирован) |
Таким образом, значения конфигурационных байтов в ATmega328/P по умолчанию: Low: 0x62, High: 0xD9, Extended: 0xFF. Обратите внимание, это значения именно для “чистого” микроконтроллера ATmega328/P , а не для Ардуино. Значения фьюзов для Ардуино можно найти в файле Arduino_dir\hardware\arduino\avr\Boards.txt, где Arduino_dir – это путь к IDE Arduino. Откройте файл в текстовом редакторе и найдите интересующую плату по названию, чуть ниже будет информация о фьюзах:
uno.name=Arduino/Genuino Uno
…
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0x05
Для расшифровки шестнадцатеричных значений конфигурационных байтов удобно использовать онлайн калькулятор Engbedded Atmel AVR® Fuse Calculator:
Выберите модель микроконтроллера и введите значения фьюзов в соответствующие поля внизу страницы в разделе Current settings – введенные значения будут моментально расшифрованы и представлены в удобном виде. И, наоборот, можно изменить конфигурацию битов в разделах Manual fuse bits configuration и Feature configuration и получить значения конфигурационных байтов для записи в микроконтроллер.
Рассмотрим назначение конфигурационных битов более подробно.
CKDIV8
Данный бит отвечает за деление тактовой частоты на 8. Он определяет начальное значение регистра делителя частоты: если бит не запрограммирован, то регистр делителя будет сброшен в “0000”; если бит CKDIV8 запрограммирован, то в регистре будет установлено значение “0011”, что обеспечит деление тактовой частоты на 8. Однако вне зависимости от значения фьюза CKDIV8 значение делителя может быть изменено программой в любой момент.
CKOUT
ATmega328/p позволяет выводить тактовую частоту на цифровой вывод CLKO (digital pin 8 на Ардуино Уно). Для этого конфигурационный бит CKOUT должен быть запрограммирован. Данная функция может быть полезна при использовании таковой частоты микроконтроллера внешними устройствами. При использовании делителя системной частоты на вывод CLKO также будет поступать пониженная частота.
SUT
Конфигурационные биты SUT совместно с битами CKSEL определяют длительность задержки при старте микроконтроллера. Задержка необходима для того, чтобы источник тактовой частоты стабилизировался после подачи питания и вошел в свой рабочий режим. Величина задержки зависит от выбранного источника и составляет от 0 до 65мс. Конкретные значения можно найти в даташите.CKSEL
Современные микроконтроллеры способны работать с различными источниками тактового сигнала. Выбор источника осуществляется установкой конфигурационных битов CKSEL. В таблице ниже приведены источники тактового сигнала, поддерживаемые микроконтроллерами ATmega328 / ATmega328P, и соответствующие им значения CKSEL.Источник тактового сигнала | Значение CKSEL3..0 |
---|---|
Экономичный кварцевый генератор | 1111-1000 |
Кварцевый генератор | 0111-0110 |
Низкочастотный кварцевый генератор | 0101-0100 |
Внутренний RC-генератор на 128кГц | 0011 |
Внутренний калиброванный RC-генератор | 0010 |
Внешний сигнал синхронизации | 0000 |
Зарезервировано | 0001 |
RSTDISBL
Фьюз RSTDISBL управляет работой цифрового вывода микроконтроллера, совмещенного с входом внешнего сброса. Если RSTDISBL запрограммирован, то вывод может быть использован как обычный цифровой пин ввода/вывода. Если фьюз RSTDISBL не запрограммирован, то вывод используется для внешнего сигнала сброса: низкий уровень напряжения на нем приводит к генерации сигнала сброса микроконтроллера. Отключение внешнего сброса может быть оправдано при работе с микроконтроллерами, имеющими небольшое количество выводов, в других случаях лучше не трогать этот фьюз.DWEN
Бит DWEN разрешает/запрещает работу отладочного интерфейса debugWire.
SPIEN
Данный бит разрешает/запрещает программирование по интерфейсу SPI. По умолчанию он запрограммирован и лучше не менять значение данного фьюза, как и значение RSTDISBL.
WDTON
Если запрограммировать конфигурационный бит WDTON, то сторожевой таймер начнет свою работу сразу после подачи питания на микроконтроллер. Работу таймера нельзя будет запретить программно и при его переполнении будет генерироваться сигнал сброса.
EESAVE
Данный бит определяет влияние команды “Стирание кристалла” на EEPROM-память: если бит запрограммирован, то при выполнении команды Chip Erase будут очищены Flash, SRAM и Lock-биты, а содержимое EEPROM затронуто не будет. В противном случае содержимое EEPROM также будет стерто.
BOOTSZ
Конфигурационные биты BOOTSZ определяют размер FLASH памяти микроконтроллера, резервируемой для загрузчика. Значения битов BOOTSZ и соответствующие им размеры указаны в таблице ниже. По умолчанию резервируется максимальный размер – 2048 слов.
Начало секции загрузчика | Размер секции (слов) | Значение BOOTSZ1..0 |
---|---|---|
0x3F00 | 256 | 11 |
0x3E00 | 512 | 10 |
0x3C00 | 1024 | 01 |
0x3800 | 2048 | 00 |
BOOTRST
Определяет положение вектора сброса. Если бит не запрограммирован, то вектор сброса располагается по адресу 0x0000, выполнение программы начнется именно с этого адреса. Если бит BOOTRST запрограммирован, то выполнение программы начнется с адреса начала секции загрузчика.
BODLEVEL
Конфигурационные биты BODLEVEL определяют порог срабатывания схемы BOD (Brown-Out Detection), которая отслеживает уровень напряжения источника питания. Если работа схемы BOD разрешена, то при снижении напряжения питания ниже установленного порога она переводит микроконтроллер в состояние сброса. Когда напряжение питания вновь увеличивается до порогового значения (данный порог чуть выше предыдущего за счет наличия гистерезиса), сигнал сброса снимается и происходит запуск микроконтроллера. Комбинации битов BODLEVEL и соответствующие им пороговые значения приведены в таблице:
Порог срабатывания схемы BOD (В) | Значение BODLEVEL2..0 |
---|---|
Схема BOD выключена | 111 |
Vcc = 1. 8 | 110 |
Vcc = 2.7 | 101 |
Vcc = 4.3 | 100 |
Теперь можно понять начальное состояние микроконтроллеров ATmega328/P, в каком они поставляются с завода: микроконтроллер сконфигурирован на работу с внутренним RC генератором на 8МГц, при этом прошитый бит CKDIV8 обеспечивает деление частоты генератора на 8; внешний сброс (по низкому уровню на выводе Reset) не запрещен; разрешено программирование по интерфейсу SPI; для загрузчика отведена область памяти 2048 слов; стартовый адрес программы 0x0000; схема контроля питания отключена.
В Ардуино Уно фьюзы микроконтроллера изменены таким образом, чтобы он был настроен на работу с экономичным кварцевым генератором без делителя частоты; для загрузчика отводится 256 слов; прошитый бит BOOTRST назначает стартовым адресом адрес начала секции загрузчика; порог срабатывания схемы BOD составляет 2.7В.
Разобравшись с назначением фьюзов можно перейти от теории к практике: попробуем прочитать и записать фьюзы Ардуино.
Чтение фьюзов Ардуино
В предыдущей публикации я рассказал о том, как превратить Ардуино в ISP программатор. И сейчас он нам пригодится для работы с фьюзами. Поэтому готовим программатор и подключаем к нему плату, из которой будем считывать фьюзы.В среде разработки Ардуино нет инструментов для чтения/записи фьюзов. Разве что процедура записи загрузчика включает в себя установку фьюзов, значения которых берутся из упомянутого ранее файла Boards.txt. Но в состав IDE входит программа Avrdude, предназначенная для прошивки AVR микроконтроллеров, ей-то мы и воспользуемся. Avrdude – консольная программа, работать мы с ней будем через командную строку, поэтому запускаем проводник и переходим в папку с программой. У меня IDE Arduino расположена на диске D и путь к Avrdude выглядит следующим образом: D:\Arduino\arduino-1.6.12\hardware\tools\avr\bin.
Находясь в этой папке нужно поместить курсор в адресную строку, удалить из нее путь, ввести cmd и нажать Enter. Откроется окно интерпретатора командной строки:
После этого подключаем программатор к компьютеру и вводим в командной строке следующую команду:
avrdude -C . ./etc/avrdude.conf -c arduino -p m328p -P com26 -b 19200 -U lfuse:r:-:h
Перед выполнением команды проверьте и скорректируйте ее параметры:
- -c <programmer> – в качестве <programmer> указываем псевдоним используемого программатора, в нашем случае arduino.
- -p <partno> – указывает тип микроконтроллера, m328p – это ATmega328p.
- -P <port> – указывает используемый программатором порт.
- -b <baudrate> – позволяет переопределить указанную для программатора в конфигурации программы скорость подключения по интерфейсу RS-232.
- -U <memtype>:r|w|v:<filename>[:format] – комплексная опция для указания производимой с памятью операции (чтение. запись, проверка). -U lfuse:r:-:h означает, что мы хотим прочитать содержимое младшего байта конфигурации, считанное значение выводим на экран в шестнадцатеричном виде.
Как видно из скриншота, младший конфигурационный байт моей Arduino Uno содержит значение 0xFF. Кроме запрошенного значения avrdude показал также значения всех трех конфигурационных байт. Это произошло потому, что мы не отключили safemode, это можно сделать, добавив в команду параметр -u. Остальные два конфигурационных байта также соответствуют значениям, приведенным в файле Boards.txt. Если у кого-то возникнут сомнения по поводу соответствия дополнительного конфигурационного байта, то загляните в его описание выше – биты с 3 по 7 не используются и содержат “1”, поэтому вместо 0x05 мы считываем значение 0xFD.
Запись фьюзов Ардуино
Полагаю, из приведенного выше описания фьюзов должно быть понятно, что при работе с ними нужно быть очень осторожным. В противном случае вы рискуете “залочить” микроконтроллер, т.е. привести в такое состояние, когда его уже нельзя будет перепрограммировать (без дополнительного оборудования). Поэтому будьте внимательны, изменяя фьюзы микроконтроллера.Давайте в качестве примера попробуем запретить работу схемы BOD в Ардуино Уно. Обратившись к приведенному выше описанию конфигурационных байтов или к онлайн калькулятору Engbedded Atmel AVR® Fuse Calculator, мы видим, что за работу схемы BOD в ATmega328/P отвечают фьюзы BODLEVEL и для ее запрета нужно записать в дополнительный конфигурационный байт значение 0xFF. Это можно сделать следующей командой avrdude:
avrdude -C ../etc/avrdude.conf -c arduino -p m328p -P com26 -b 19200 -U efuse:w:0xFF:m
Из скриншота видно, что avrdude сначала выполняет запись байта efuse, после чего производит контрольное считывание и сообщает об успешном выполнении операции.
В принципе нет ничего сложного в работе с конфигурационными битами. Главное быть внимательным при их изменении, чтобы не залочить микроконтроллер.
Фьюзы (Fuses) Микроконтролеров ATMega (Atmel) – Avislab
Фьюзы (Fuses) – это несколько специальных байт, которые можно прошить только программатором, и отвечают они за разные настройки микроконтроллера. У разных микроконтроллеров фьюзы могут отличаться. Поэтому более подробную информацию смотрите в документации. Поскольку это делается в последнюю очередь, я приведу здесь краткое описание фьюзов и перечислю наиболее часто встречающиеся ошибки при работе с фюзами.
Хочу заметить, что установленным считается бит, который сброшен в 0. Для начинающих это часто вносит путаницу, при работе с разными программами для прошивки. Так как не всегда ясно установленная напротив фьюза птичка это 1 или 0 (в смысле, установлен). Разработчики ПО имели ввиду, если стоит птичка, значит, бит считается установленным (т.е. =0).
Далее приведенная сборная информация для разных микроконтроллеров. Я не претендую на оригинальность, эту информацию я скачал с интернета, прошу прощения у авторов.
Семейство ATtiny | Семейство ATmega | ||||||||||||
2313 | 25/ 45/ 85 | 13 | 26 | 261/ 461/ 861 | 8 | 16 | 48/ 88/ 168 | 128 | 169 | 329 | 8515 | 8535 | |
RESERVED | M103С | + | S8515С | S8535С | |||||||||
OCDEN | + | + | + | + | |||||||||
JTAGEN | + | + | + | + | |||||||||
SELFPRGEN | + | + | + | + | + | ||||||||
DWEN | + | + | + | + | + | + | |||||||
EESAVE | + | + | + | + | + | + | + | + | + | + | + | + | + |
SPIEN | + | + | + | + | + | + | + | + | + | + | + | + | + |
WDTON | + | + | + | + | + | + | + | + | + | + | + | ||
BODLEVEL2 | + | + | + | + | + | ||||||||
BODLEVEL1 | + | + | + | + | + | + | + | ||||||
BODLEVEL0 | + | + | + | BOD LEVEL | + | BOD LEVEL | BOD LEVEL | + | BOD LEVEL | + | + | BOD LEVEL | BOD LEVEL |
BODEN | + | + | + | + | + | + | |||||||
RSTDISBL | + | + | + | + | + | + | + | + | |||||
CKDIV8 | + | + | + | + | + | + | + | ||||||
CKOUT | + | + | + | + | + | + | |||||||
SUT1 | + | + | + | + | + | + | + | + | + | + | + | + | + |
SUT0 | + | + | + | + | + | + | + | + | + | + | + | + | + |
CKOPT | + | + | + | + | + | + | |||||||
CKSEL3 | + | + | + | + | + | + | + | + | + | + | + | + | |
CKSEL2 | + | + | + | + | + | + | + | + | + | + | + | + | |
CKSEL1 | + | + | + | + | + | + | + | + | + | + | + | + | + |
CKSEL0 | + | + | + | + | + | + | + | + | + | + | + | + | + |
PLLCK | + | ||||||||||||
BOOTRST | + | + | + | + | + | + | + | + | |||||
BOOTSZ1 | + | + | + | + | + | + | + | + | |||||
BOOTSZ0 | + | + | + | + | + | + | + | + |
В таблице fuse-биты популярных AVR. Слева названия fuse-битов по даташиту, в первых двух строках перечислены семейства и типы конкретных МК, а на пересечении строк и столбцов стоит знак плюс, если данный fuse-бит имеется в данном МК, или указано название, отличное от стандартного. Если какой-то бит отсутствует — в соответствующей клетке ничего нет.Назначение каждого фьюза AVR fuse бита:RESERVED — этот бит зарезервирован для каких-то неизвестных простым смертным целей фирмой Atmel. Ни при каких условиях не рекомендуется менять его состояние (т. е. надо оставлять его таким, как он установлен при изготовлении МК). В этой строке встречаются биты с другими названиями, как правило, это биты включения режима совместимости с устаревшими типами МК, на смену которым выпущены новые. Обычно в конце названия такого fuse-бита имеется символ С — от COMPATIBLE (совместимый).
OCDEN — fuse разрешает работу схемы внутреннего отладчика (On Chip Debug ENable). Не оставляйте установленным этот бит в коммерческих продуктах! Иначе вашу программу можно будет считать из памяти МК.
JTAGEN — fuse бит разрешает работу интерфейса программирования-отладки JTAG. По сравнению с SPI-интерфейсом, JTAG обладает расширенными возможностями. Не рекомендуется без необходимости оставлять этот бит установленным, т. к. в этом случае потребляемый МК ток возрастает.
SELFPRGEN — бит, разрешающей программе МК производить запись в память программ, т. е. производить самопрограммирование.
DWEN — fuse бит, разрешающий работу DebugWire – это интерфейс отладки по одному проводу. Не рекомендуется оставлять его установленным в коммерческих изделиях.
EESAVE — fuse бит, после установки которого при стирании памяти МК содержимое EEPROM данных будет сохраняться нетронутым, т. е. не будет стерто.
SPIEN — fuse бит, разрешающий работу интерфейса внутрисхемного программирования МК по SPI. Этот бит может быть легко переустановлен при помощи параллельного программатора (или JTAG, если таковой разрешен и имеется в МК). Все МК выпускаются с установленным битом SPIEN, снять его по интерфейсу SPI невозможно.
WDTON — fuse бит, после установки которого сторожевой таймер WDT включается сразу после подачи питания и не может быть отключен программно. Если бит не установлен, то включением и отключением WDT можно управлять программно.
Группа fuse битов BODLEVEL. Может быть либо один такой бит, либо несколько, тогда они нумеруются, начиная с нуля. Значение этих fuse битов определяет порог срабатывания схемы BOD — детектора уровня питающего напряжения, при снижении напряжения питания ниже этого уровня произойдет “сброс” МК.
BODEN — fuse бит, включающий схему аппаратного детектора недопустимого уровня питающего напряжения, т. е. схему BOD.
RSTDISBL — fuse бит, отключающий сигнал внешнего сброса от вывода микроконтроллера и подключающий к нему схему порта ввода-вывода. Этот бит имеется только в тех МК, у которых вывод аппаратного сброса RESET совмещен с одинм из портов ввода-вывода. Ошибочная установка этого fuse бита может отключить RESET и вы не сможете больше прошивать по ISP. Не устанавливайте этот бит, если намерены продолжать работать с МК при помощи последовательных программаторов. “Оживить” МК с установленным RSTDISBL можно только параллельным программатором и не для всех МК.
CKDIV8 — fuse бит, включающий предварительное деление частоты кварцевого (или иного имеющегося) тактового генератора на 8. То есть при включенном этом бите и применении кварцевого резонатора на 8 МГц реальная тактовая частота МК составит1 МГц.
CKOUT — fuse бит, разрешающий вывод тактовой частоты на один из выводов МК (для тактирования других устройств).
SUT1 и SUT0 — fuse биты, управляющие режимом запуска тактовых генераторов МК. Связаны с нижеописываемыми битами, определяющими тип и частоту тактового генератора, причем связь весьма хитрая и запутанная. При ошибочной их установке возможны ситуации неустойчивого запуска генератора или неоднократного сброса МКв процессе подачи на него питания.
CKOPT — бит, определяющий режим работы встроенного генератора тактовой частоты для работы с кварцевыми резонаторами. Реально изменяет коэффициент усиления встроенного инвертора в схеме генератора и, следовательно, – выходное напряжение на ножке XTAL2. Ошибочная установка может приводить к неустойчивому запуску кварцевого генератора, вплоть до возбуждения его не на той гармонике, что надо (из-за этого бита кварц запускался или только при питании МК напряжением не выше 3,6В, или только после прикосновения к выводу XTAL1 пинцетом)
Группа битов CKSEL0…CKSEL3 — fuse биты, комбинация которых определяет тип и частоту работающего тактового генератора. Всего возможно до 16 комбинаций, однако не все определены для всех типов МК. Ошибочная установка комбинации этих битов может сделать МК «мертвым» — он не будет работать в схеме без подачи тактового сигнала на ножку XTAL1.
PLLCK — fuse бит, разрешающий использование встроенного синтезатора частоты для тактированияядра МК.
BOOTRST — fuse бит, определяющий адрес, с которого будет начато исполнение программы после сброса — если бит установлен, то начало программы будет не с адреса 0000h (как обычно), а с адреса области загрузчика (Boot Loader).
Группа fuse битов BOOTSZ — два fuse бита, определяющие размер области памяти программ, выделяемой для загрузчика (Boot Loader). Комбинация этих битов, в частности, определяет точку начала исполнения программы после сброса, если установлен бит BOOTRST.
Наиболее частые ошибки при настройке фюзов:
1. Установка фюза RSTDISBL. Ошибочная установка этого fuse бита отключает RESET, и Вы не сможете больше прошивать по ISP. Для этого потребуется последовательный программатор или что-то попроще для сброса фьюзов к заводским настройкам.2. Неправильная установка CKSEL0, CKSEL1, CKSEL2, CKSEL3. Эти фьюзы определяют источник тактирования микроконтроллера. Если Вы случайно выбрали не ту частоту внутреннего RC генератора, это не смертельно. Программирование через ISP будет возможным, и вы сможете исправить ситуацию. А если случайно установить тактирование от внешнего источника, RC цепочки или кварцевого резонатора, а у Вас таких в схеме нет, то программирование по ISP тоже станет невозможным. По сути, микроконтроллер будет ожидать тактирования от несуществующей схемы. Как выйти из этого положения? Очень просто – дать микроконтроллеру источник тактирования и исправить фьюзы. Чаще всего устанавливают CKSEL все нули – тактирование от внешнего генератора. В этом случае можно собрать схему, генерирующую меандр (частота особой роли не играет, главное, чтобы она лежала пределах возможности микроконтроллера) и подать на ногу XTAL1. После чего микроконтроллер можно будет прошить через ISP. Первое, что надо сделать, – сбросить фьюзы к заводским настройкам. Если CKSEL все установлены в 1 – тактирование от внешнего кварца. Навесьте кварц после чего микроконтроллер снова будет доступен через ISP.
Ну и напоследок, найденные в интернете калькуляторы Фюзов. Иногда очень полезная штука:
http://fusecalc.mirmk.net/ http://payalo.at.ua/c_fuse/calc.html
Ремонт транзистор-тестера или ESR метра
Вот и постигла меня печальная участь.Спалил свой транзистор-тестер, он же ESR метр.
Палится очень просто – не разряженным конденсатором, т.к. входы тестера напрямую приходят в микроконтроллер.
Выглядит мой экземпляр вот так:
На плате обозначение: WEI_M8_NLG_TST_V1. 10
Штука это незаменимая в работе.
Последнее время я совсем обленился и стал ей всецело доверять проверку элементов при разного рода ремонтах.
Например: надо проверить полевичок, подцепляем, если тестер показывает картинку – значит целый.
Померить ESR конденсатора – запросто.
А тут такая беда – сгорел. Надо чинить.
Тестер построен на микроконтроллере ATMega328p, точно на таком же как Arduino nano/mini.
Ну вы поняли мысль? 🙂
У меня как раз завалялась одна китайская Arduino pro-mini, которая быстренько этого контроллера лишилась.
Осталась одна платка:
Запаиваем в наш тестер, предварительно сняв экран:
Остаётся всего-то залить прошивку и можно пользоваться.
И вот тут я подзастрял надолго.
И так, структурирую свой тернистый путь долгих поисков и освоения магии прошивки этого чуда прибора.
Суть сводится к следующим действиям:
1. Скомпилировать прошивку, с нужными опциями под свою версию платы тестера.
2. Прошить ATMega328p
3. Profit!
Из статьи товарища elchupanibrei узнаём, что существует и здравствует форк проекта некого Маркуса, с нужными нам исходниками для сборки прошивки.
На портале vrtp.ru находится заметка юзера indman с подробным описанием процесса компиляции прошивки.
Приведу её здесь:
Установка программного обеспечения
1. Установить программу WinAVR-20100110-install.exe (при установке использовать параметры по умолчанию)
2. Распаковать содержимое архива “avr8-gnu-toolchain-installer-3.4.4.24-wi
(в последних релизах прошивки без этих исходников, при прошивке МК m328 возникает ошибка типа “..программа выходит за диапазон памяти МК”).
Компиляция прошивки
1. Скачать с сайта автора по ссылке https://www.mikrocontroller.net/svnbrowser/transistortester/Software/trunk/ текущий дистрибутив прошивок.
Для этого кликнуть внизу страницы на строчку “Download GNU tarball”.
2. Распаковать скачанный дистрибутив “transistortester-trunk.tar.gz” в каталог, например С:\Trunk (кирилицу в обозначении имени каталога не использовать).
3. Из каталога C:\Trunk\default удалить всё,кроме каталога “dep“.
4. Скопировать в каталог C:\Trunk\default соответствующий процессору файл “makefile“.
Вот тут нужна ремарочка.
В моей плате, которая WEI_M8_NLG_TST_V1.10, используется дисплей st7565, в дистрибутиве прошивок есть каталог mega328_wei_st7565 – это как раз наш вариант.
Файлик “makefile” можно взять прямо оттуда. Ну или из каталога mega328, но тогда придётся проверять и править больше опций.
Дисплейчик st7565 (разрешением 128×64):
Дальше нужно пробежаться по большому списку опций, проверить, что всё выставлено верно.
Перечень опций можно найти в инструкции Версия 1.12k в разделе Конфигурирование Тестера (стр. 50).
В файле “makefile“, который мы взяли в каталоге mega328_wei_st7565 я поменял только 3 опции:
UI_LANGUAGE = LANG_RUSSIAN
CFLAGS += -DLCD_CYRILLIC
CFLAGS += -DNO_LONG_PINLAYOUT
Захотелось что-то меню на русском, а остальное стояло, на мой взгляд верно 🙂
В принципе можно поиграть со шрифтами, например вместо
CFLAGS += -DFONT_8X12thin
поставить помельче
CFLAGS += -DFONT_8X16thin
но меня вполне устраивает и первый вариант.
5. Запустить редактор WinAVR (C:\WinAVR-20100110\pn\pn.exe)
6. Открыть Makefile.
7. Скомпилировать Makefile, для этого выполнить команды меню: Tools-Make All.
8. Если компиляция завершилась удачно – получаем код выхода равный 0 (Process Exit Code:0).
Скомпилированные файлы прошивки “TransistorTester.eep” и “TransistorTester.hex” будут находиться в том же каталоге C:\Trunk\default.
Для корректной компиляции в среде Win10 необходимо заменить одну библиотеку по адресу: %каталог с установленным WinAVR%\utils\bin\msys-1.0.dll
Библиотека прилагается в архиве в конце этой статьи.
Скомпилировали, получили два файлика: “TransistorTester.eep” и “TransistorTester.hex“.
Теперь нужно как-то прошить нашу ATMega328p.
У кого под рукой есть программаторы типа: TL866, USBasp или даже китай типа:
дальше будет не интересно.
Но у меня ничего подобного не водится, зато водится FTDI FT232RL, который прекрасно справится с ролью прошивки нашего контроллера:
И тут опять мне помогла статья про программатор из FT232R elchupanibrei.
Я до этого и не знал, что им можно прошивать AVR микроконтроллеры.
Прошивается режиме BitBang, через програмку AVRDUDE.
Проблема в том, что официальные версии AVRDUDE не поддерживают BitBang и предлагают самим пользователям, скомпилировать программу, установив необходимые для этого библиотеки.
Но, на radiokot.ru я нашёл статейку, где добрые люди за меня уже скомпилировали и выложили нужную версию AVRDUDE.
Правда без непоняток, и в этот раз необошлось.
В конфиге avrdude.conf, в секции которая нас интерсует, записаны номера пинов miso=1, sck=0, mosi=2, reset=4
programmer
id = “ft232r”;
desc = “FT232R Synchronous BitBang”;
type = “ftdi_syncbb”;
connection_type = usb;
miso = 1; # RxD
sck = 0; # TxD
mosi = 2; # RTS
reset = 4; # DTR
;
В другом конфиге, который я нашёл на каком-то форуме, были другие цифры:
programmer
id = “ft232r”;
desc = “FT232R Synchronous BitBang”;
type = “ftdi_syncbb”;
connection_type = usb;
miso = 3; # CTS X3(1)
sck = 5; # DSR X3(2)
mosi = 6; # DCD X3(3)
reset = 7; # RI X3(4)
;
Долго не мог понять откуда эти цифры, которые совсем не соответствуют реальной распиновке FT232RL:
А разгадка такая:
Распиновочка из таблички 2.1 официальной PDF-ки FTDI:
Тут я уже отметил пины, которые использовал, красным цветом.
Оказывается, в FT232RL можно переназначать выводы произвольным образом, что как раз и указывается в конфиге avrdude.conf.
В моей платке имеются выводы CTS, TX, RX и DTR (их отметил красным в столбце Pin Number, который соответствует реальной-физический распиновке FT232RL).
Вот на них и будем назначать выводы для программирования нашего контроллера (я назначил выводы, как в столбце Signal, но их можно перетасовать как угодно).
Исходя из таблички, мой конфиг будет выглядеть следующим образом:
programmer
id = “ft232r”;
desc = “FT232R Synchronous BitBang”;
type = “ftdi_syncbb”;
connection_type = usb;
miso = 1; # RxD
sck = 0; # TxD
mosi = 3; # CTS
reset = 4; # DTR
;
Так, с FT232RL разобрались, теперь надо понять, куда подключаться на нашей плате.
Ну тут уже проще.
Впаял разъёмчик на 6 пинов начиная с самого правого:
Подключаем к этим пинам наш адаптер FT232RL и запускаем AVRDUDE.
Кстати, рекомендую использовать GUI AVRDUDESS, лично мне так гораздо нагляднее и удобнее работать:
Тут я уже выставил все необходимые настроечки и фьюзы – fuses.
Пару слов о fuses.
Есть хорошая статья про них на сайте easyelectronics.ru (сайт всячески рекомендую к просмотру, там много чего интересного имеется).
Рекомендую также пользоваться калькулятором фьюзов для AVR.
Конкретно для моей платы WEI_M8_NLG_TST_V1.10 фьюзы расчитаны так:
Extended Fuse установлены как 0xFF не просто так.
Обычно там ставится 0xFC, но на стр. 27 инструкции Версия 1.12k есть информация о том, что может происходить сброс процессора из-за короткого провала напряжения “Brown Out”,
и, чтобы убрать обнаружение этих провалов, нужно сделать небольшую доработку платы или поставить Extended Fuse на 0xFF
Всё, фьюзы поставили, можно прошивать.
После прошивки, тестер попросит сделать калибровочку, после чего можно пользоваться:
Архив с готовыми прошивками и софтом – тут.
ATMEGA328P-PU как замена Arduino
Раз уж Arduino стал практически мейнстримом, напишу обзор про микроконтроллеры ATMEGA328Данный микроконтроллер является сердцем Arduino Uno, Nano, Pro Mini и ряда других плат.
Но Arduino — это слишком просто. Купил, подключил, загрузил программу и вот уже гордо мигает светодиод на плате. Мы же легких путей не ищем и
Итак зачем все это нужно?
Ну во первых, это экономия в деньгах (Правда с ценами на Pro Mini очень сомнительная)
Во вторых, экономия места
В третьих, микросхемы без всяких преобразователей и светодиодов очень экономичны, что немаловажно в проектах с батарейным питанием.
В четвертых, проекты на Arduino весьма неопрятны из за мотка проводов вокруг платы. Микроконтроллеры же вполне можно паять на макетках или нормальных печатных платах.
Ну и в пятых, это ведь интересно и познавательно!
Заказал я данные микросхемы на Алиэксперсс. Лот состоит из 10 микроконтроллеров, 10 панелек для них, и 10 кварцевых резонаторов на 16МГц. Сейчас лот подорожал до $35 и купить за адекватную цену Atmegу можно разве что на Таобао.
Заказ шел целых 97 дней. Трек быстро отозвался в Китае и завис, не дойдя до России. Я успел пообщаться с продавцом, открыть спор и выиграть его, когда нежданно посылка нарисовалась в Москве. Деньги я вернул продавцу на PayPal, видимо у него где-то есть еще и магазин.
Итак все довольны — продавец получил заслуженную прибыль, а я долгожданный товар.
Подробное описание ATMEGA328 можно посмотреть на сайте atmel.com.
Буковка «P» в названии означает низкое энергопотребление, а PU-корпус DIP28, который удобно паять обычным паяльником.
Сам товар:
Контроллер с панелькой и кварцем
Как это все готовить?
Для программирования взят очень дешевый программатор USBasp за 3.14 (Пи?) баксов.
Для простоты, используем ICSP разъем стандартной Arduino UNO
В панельку Arduino вставляем наш микроконтроллер.
Далее качаем и устанавливаем драйвер для программатора. Запускам стандартную ArduinoIDE, выбираем в меню «Сервис->Программатор->USBasp», плату ArduinoUNO и нажимаем «Записать загрузчик». После окончания процесса загрузки мы получаем контроллер, такой же как и в UNO, в который можно уже в дальнейшем заливать программы через стандартный USB Ардуины.
Далее мне захотелось использовать встроенный кварцевый резонатор на 8МГц, чтобы иметь минимум деталей на плате.
Открываем файл с описанием микроконтроллера c:\Program Files (x86)\Arduino\hardware\arduino\boards.txt
Копируем блок с Uno и правим в нм Фьюзы. Это специальные биты для настроки контроллера. Прочитать про них можно здесь. Сконфигурировать при помощи онлайн-калькулятора. Загрузив в калькулятор значения от UNO я устанавливаю стандартное значение с встроенным кварцем на 8МГц.
Затем заменяю значение в файле с описанием плат и получаю такое описание:
tmega328_8.name=Atmega328 (5V, 8 MHz internal)
atmega328_8.upload.protocol=arduino
atmega328_8.upload.maximum_size=30720
atmega328_8.upload.speed=57600
atmega328_8.bootloader.low_fuses=0xE2
atmega328_8.bootloader.high_fuses=0xDE
atmega328_8.bootloader.extended_fuses=0x05
atmega328_8.bootloader.path=optiboot
atmega328_8.bootloader.file=optiboot_atmega328.hex
atmega328_8.bootloader.unlock_bits=0x3F
atmega328_8.bootloader.lock_bits=0x0F
atmega328_8.build.mcu=atmega328p
atmega328_8.build.f_cpu=8000000L
atmega328_8.build.core=arduino
atmega328_8.build.variant=standard
Затем в среде Arduino выбираю свой микроконтроллер и снова прошиваю загрузчик.
Все, я получил микроконтроллер, в который можно заливать скетчи на Arduino UNO плате, а затем использовать его без внешнего кварца.
Можно не прошивать контроллеру загрузчик, но тогда заливать в него программы всегда придется через программатор.
Чтобы не соединять самому 10пинвый разъем на USBasp к 6-ти пиновому ICSP на Arduino заказал такой переходник
Потом подумал, и заказал такой переходник для программатора, позволяющий обходится без Arduino Uno. Так что надеюсь, следующие микросхемы буду шить с большим комфортом.
Рекомендую ли я данные микроконтроллеры — скорее нет. При цене на Arduino Pro Micro — $2.88 это не особенно целесообразно. Сейчас я бы купил Atmega8 стоимостью около 1$ или Atiny, для проектов, где не нужно возможности Atmega328.
Где я все это планирую применять?
Хочу сделать сенсорные беспроводные выключатели света, вентиляторов и др. устройств, причем разместить их прямо в корпусах выключателей.
В люстрах, для получения радиокоманд от этих выключателей, а также для диммирования.
В миниатюрном погодном датчике на аккумуляторе за окном.
В контроллере управления вентилятором на кухне и в ванной.
Да мало ли сколько еще «нужных и полезных» устройств можно сделать?
А как же мозг не вскипел все это реализовывать?
Ну конечно же был помощник
Все статьи мои статьи можно найти в моем блоге samopal.pro
Самодельный Arduino из контроллера ATMEGA328P-PU
Платформа Arduino стала нынче практически мейнстримом.
В этой статье напишу о том, как собрать минимальную платформу на контроллере Amega 328P-PU, чтобы ее можно было программировать на платформе Arduino IDE.
Контроллер Atmega 328 от компании ATMEL является сердцем платформ Arduino UNO , Arduino Nano, Arduino Pro Mini и ряда других. Данные платы вместе с многочисленными «шилдами» и модулями удобны для создания прототипов, но довольно громоздки и избыточны для готовых устройств.
Конечное устройство можно собрать на макетной или печатной плате. Для этого приобретаем контроллеры Atmega. Я покупал наплощадке aliexpress.com.
Цена на момент покупки была $20 за 10 контроллеров, 10 панелек и 10 кварцевых резонаторов на 16МГц. (Сейчас цена стала немного дороже)
Ссылка на товар на сайте aliexpress.com
Буковка «P» в названии микросхемы означает низкое энергопотребление, а PU-корпус DIP28, который удобно паять обычным паяльником.
Контроллеры пришли, как их теперь готовить?
Yеобходимо установить загрузчик в наши контроллеры. Для этого используем плату Arduino Uno и купленный заранее очень дешевый программатор USBasp. Чтобы не мудрить с проводками, лучше сразу взять еще и такой переходник на 6-ти пиновый разъем ICSP.
Качаем и ставим драйвер программатора.
Описываем параметры микроконтроллера в файле c:\Program Files (x86)\Arduino\hardware\arduino\boards.txt
Для себя я сделал две конфигурации — внутренний кварц 8МГц с загрузчиком optiboot и отключенной проверкой на напряжение питания (чтобы можно было запитать микросхему вольт так от трех)
atmega328_8_33.name=Atmega328 (3.3V, 8 MHz internal)
atmega328_8_33.upload.protocol=arduino
atmega328_8_33.upload.maximum_size=30720
#atmega328_8_33.upload.speed=19200
atmega328_8_33.upload.speed=57600atmega328_8_33.bootloader.low_fuses=0xC2
atmega328_8_33.bootloader.low_fuses=0xE2
atmega328_8_33.bootloader.high_fuses=0xDE
atmega328_8_33.bootloader.extended_fuses=0x07
atmega328_8_33.bootloader.path=optiboot
atmega328_8_33.bootloader.file=optiboot_atmega328.hex
atmega328_8_33.bootloader.unlock_bits=0x3F
atmega328_8_33.bootloader.lock_bits=0x0Fatmega328_8_33.build.mcu=atmega328p
atmega328_8_33.build.f_cpu=8000000L
atmega328_8_33.build.core=arduino
atmega328_8_33.build.variant=standard
и точная такая же с внешним кварцевым резонатором на 16МГц.
atmega328_16.name=Atmega328_16 (3.3V, 16 MHz external)
atmega328_16.upload.protocol=arduino
atmega328_16.upload.maximum_size=32256
atmega328_16.upload.speed=115200
atmega328_16.bootloader.low_fuses=0xff
atmega328_16.bootloader.high_fuses=0xde
atmega328_16.bootloader.extended_fuses=0x07
atmega328_16.bootloader.path=optiboot
atmega328_16.bootloader.file=optiboot_atmega328.hex
atmega328_16.bootloader.unlock_bits=0x3F
atmega328_16.bootloader.lock_bits=0x0F
atmega328_16.build.mcu=atmega328p
atmega328_16.build.f_cpu=16000000L
atmega328_16.build.core=arduino
atmega328_16.build.variant=standard
Аккуратно вынимаем из панельки Arduino контроллер и ставим туда наш.
Запускам стандартную ArduinoIDE, выбираем в меню «Сервис->Программатор->USBasp», плату Atmega328 (3.3V, 8 MHz internal) или Atmega328_16 (3.3V, 16 MHz external) и нажимаем «Записать загрузчик». После окончания процесса загрузки мы получаем контроллер, в который можно уже в дальнейшем заливать программы через стандартный USB Ардуины.
В принципе, если вам не требуется низковольтное питание, можно не править фал board.txt, а пошить контроллер как Arduino Uno.
Дальнейшая работа с контроллером такая — либо шить его вставляя на плату Arduino Uno через стандартный USB порт этой платы. Прошив контроллер на работу с внутренним кварцем, можно сразу использовать его практически без всякой обвязки. Например, мигать светодиодом на 13-м порту, как на этой картинке.
Если же нужно постоянно использовать контроллер в своей плате, не переставляя его — то нужно собрать такую схему
и прошивать его через конвертер USB-RS232.
Контроллер с внешним кварцем работает быстрее и гораздо стабильнее.
Где это уже работает?
Контроллер управления вентилятором в ванной комнате
Контроллер управления светодиодной люстрой
А как же мозг не вскипел все это реализовывать?
Ну конечно же был помощник
Полезные ссылки к данной статье:
со своего сайта.
Моя борьба
Содержание:
Введение
С чего все началось
Выбираем среду разработки
Выбираем программатор
Какой MCU выбрать?
Почему MCU 8-битный и от Atmel?
Практикум — несколько примеров
А что у них с разгоном?
Идем дальше или не идем?
Месяца три-четыре назад появился у меня первый микроконтроллер от Atmel – Atmega 328P, в комплекте с небольшой платкой Arduino Duemilanove, с необходимой обвязкой, гнездами для I/O и мостом RT232RL для подсоединения к PC по USB. Об этом написано подробнее в статье «Моя домашняя лаборатория», и в то время я находился под эйфорией приобретения этой техноигрушки (на которые весьма падок, несмотря на давно уже не детский возраст).
Вообщем, группа товарищей-итальянцев, уже не первый год выпускающих изделия под маркой Arduino, предлагает новичкам простое и доступное устройство и соответствующее программное обеспечение для старта в мир микроконтроллеров. Автор этих строк, хоть и новичок в изделиях фирмы Atmel, но в прошлом веке имел опыт общения с микроконтроллерами — советскими клонами популярных 8035/8048/8051. Кстати, 8051 не собирается сдавать позиции и до сих пор — масса прикладного кода, неприхотливость и невысокая цена делает его крайне востребованным. Более того, он есть почти на каждой материнской плате для PC, конечно, не в виде отдельного корпуса, а внедренный в состав других микросхем.
И все бы было хорошо с Arduino, если бы не несколько «но».
Внешняя «красивость» Arduino, направленная на привлечение потенциальных покупателей, имеет обратную сторону. Плата имеет собственную нумерацию «цифровых» и «аналоговых» портов, которая отличается от оригинальной для MCU AVR, что создает неудобства тем, кто все же иногда читает документацию, а для тех, кто не читает, создает иллюзию вседозволенности и равнозначности выводов. Для простых задач это не составляет проблем, но они могут возникнуть тогда, когда их меньше всего ждешь, например, если кто-то надумает создавать критичные по времени программы, набрав шину данных из нескольких разных физических портов.
Во-вторых, программный интерфейс, если вы уже работали в интегрированных средах разработки от известных производителей, сразу бьет по глазам и создает стойкое впечатление ущербности продукта. Теоретически, с этим можно было бы и смириться, так как для разработки программ можно использовать и другие Си-компиляторы, поскольку Arduino использует популярные библиотеки avrc-lib. Но сама разбивка используемого языка программирования на базовую, расширенную и полную версии представляет, на мой взгляд, не лучшее решение.
Так как зажигать светодиоды — задача ниже моего достоинства (хоть сам я и не программист), то попробовал начать с разработки 1-wire интерфейса для подключения датчиков температуры и обработки результатов на ПК. После успешного решения этой проблемы на языке Си в среде Arduino, было принято решение в дальнейшем от Arduino отказаться. Как в аппаратном, так и в программном плане. Хоть сама плата и красивая, но самосбор подобного изделия обойдется в два раза дешевле, правда, может получиться чуть менее симпатично. Кроме того, разработчики намеренно добавили трудности для создания прототипов, подключаемых к разъемам I/O платы Arduino, сдвинув один из разъемов с шага сетки 2.54мм, тем самым искусственно стимулируя спрос на специализированные платы прототипов. Эта некрасивая мелочность и стала последней каплей.
Но, «пощупав» микроконтроллер, захотелось продолжить знакомство с AVR, но уже без Arduino. Так как познаний в области MCU AVR нет никаких, садимся за документацию, попутно подбираем среду разработки и оборудование для прототипов и экспериментов.
Выбираем среду разработкиТут выбор был недолгим. Лучше всего понять и почувствовать новый микроконтроллер можно на ассемблере. Это самый простой и понятный язык, ничего лишнего и все в твоих руках. Единственный минус — если нет готовых библиотек, то некоторые вещи придется делать очень долго. К примеру, арифметика чисел с плавающей точкой, ввод-вывод с различных устройств, но это трудности временные. Как и что бы не говорили апологеты «правильного» программирования, при прочих равных условиях (имеется в виду наличие необходимых библиотек и квалификация пользователя), программа не супер-мега размера на ассемблере делается не дольше, но всегда будет быстрее и компактнее. Впрочем, не язык программирования красит программиста, а творения его, сделанные на том языке, который он знает. Хорошую и полезную программу можно сделать на любом языке.
Итак, ассемблер. Производитель MCU предлагает свою версию IDE — Avr Studio, с набором необходимых заголовочных файлов для всех выпускаемых 8-битных MCU от AVR. Использование этих заголовочных файлов обеспечивает работоспособность всех примеров из руководства , что дает возможность использования мнемонических наименований различных регистров вместо трудно запоминающихся шестнадцатеричных адресов, и соответствующих мнемоник для относящихся к ним битам. Хотя нужно отметить, что ошибок и неточностей хватает и в руководствах, выпущенных даже в июне-июле 2009 года как обновления для давно уже выпускаемых MCU.
Первое впечатление от IDE AVR Studio осталось положительным. Кроме макроассемблера, можно работать и с C++, но нас сейчас интересует только ассемблер. Имеется встроенный отладчик и эмулятор, что дает достаточный, на первых порах, инструментарий для наших нетребовательных нужд, кроме того, очень хорошо для оптимизации кода, что считаются циклы процессора и на каждом останове можно это увидеть.
Кстати, редактированием конфигурационного файла можно добавить подсветку синтаксиса и собственным данным, например, можно сделать так, чтобы выбранные макросы подсвечивались тем же цветом, что и встроенные команды.
Выбираем программаторВ MCU при отладке нужно будет часто перезаписывать программу в его флэш-память. Для этого используется несколько интерфейсов, самый простой из которых — последовательный, задействующий у MCU блок выводов SPI и сброс. Применяются и другие методы, например, «высоковольтное», «параллельное» программирование, программирование через интерфейс JTAG (он есть не у всех MCU) и собственный двухпроводный интерфейс Atmel.
AVR Studio поддерживает всю гамму фирменных программаторов и отладочных плат, но такие устройства относительно дороги. В любительских условиях целесообразно использовать ISP-программаторы, самый простой из которых представляет собой переходник с параллельного порта PC с несколькими ограничивающими резисторами, иногда и с промежуточным буфером на 74хх245. Но мы воспользуемся другим популярным вариантом, AVRDude, многочисленные клоны которого подробно описаны в интернете. Для этого приобретем полуфабрикат от польского распространителя электронного ширпотреба www.sklep.avt.pl , AVT5172A+, в состав которого входит двухсторонняя PCB и запрограммированный MCU:
PCB программатора
Программатор в сборе
Если вы планируете работать в среде OC Windows Vista, то желательно установить стабилитроны на 3.3В после резисторов, подключенных к сигнальным выводам разъема USB.
Собранная плата некоторое время находилась в свободном размещении, для разных нужд было сделано несколько плоских кабелей с IDC разъемами, в том числе и переходник с 10-контактного на более современный 6-контактный разъем. Но было не очень удобно, так как программатор приходилось подключать к макетной плате проводниками, вставляемыми в IDC-разъем:
Установка программатора в корпус, наподобие фирменного AVR ISP, проблему кучи проводов не решает. Выход был найден после приобретения прототипной платы, состоящей из трех таких макетных плат, как на фотографии вверху. Программатор был закреплен в свободном месте на пластмассовом корпусе прототипа:
Следующим шагом нужно было убрать ненадежное подсоединение отдельными проводами от разъема плоского кабеля до элементов схемы. Для этого нужно смастерить специальный переходник, для чего потребуется ответная часть двухрядного разъема, кусочек от текстолитовой платы-прототипа и шестиконтактная однорядная гребенка, то есть, кроме трех сигналов SPI и сброса от программатора будет подаваться и напряжение питания. Так как программатор сам запитывается от разъема USB компьютера, то это ограничивает потребляемый ток схемой на прототипе примерно до 300мА, что в большинстве случаев позволяет обойтись без внешних источников питания. В необходимых случаях разрабатываемую схему можно запитать и от отдельного источника, для чего на пластмассовом корпусе прототипа есть 4 разъема, к которым можно подсоединить и клемму под винт, и штекер. При этом нужно снять перемычку на программаторе, через которую на программируемую схему подается напряжение.
Вот как выглядит переходник:
Переходник
Соединение на обратной стороне, для скорости, было выполнено не перемычками, а чудовищным слоем припоя, немного не эстетично, зато очень быстро, благо практически все соединения — прямые линии, за исключением земли и питания.
Программатор установлен стационарно, ничего не мешает (разве что было бы лучше, если USB разъем располагался бы на длинной стороне PCB программатора).
Но программатор — не только hardware, необходимо и программное обеспечение. С AVR Dude
прекрасно можно работать в режиме командной строки, но проще было бы использовать простенькую графическую оболочку, если она будет обеспечивать минимальные дополнительные манипуляций с мышью и клавиатурой, то есть чтобы процесс программирования MCU выполнялся бы с наименьшими усилиями. Такая оболочка для программатора была найдена на просторах интернета — товарищ из Ирана сделал, на мой взгляд, лучший вариант — Khazama AVR Programmer
http://www.khazama.com/project/programmer/ . Лучший потому, что для того, чтобы запрограммировать контроллер после компиляции в AVR Studio достаточно одного щелчка мыши по кнопке, к тому же пара других подобных программ с моей версией программатора просто не заработала с первого включения. Khazama AVR Programmer обеспечивает программирование фьюзов, несколько опций программатора, просмотры файлов, и имеет опцию окна «постоянно поверх других», которая у меня всегда включена и для заливки программы достаточно просто нажать на кнопку Auto Program:
Программа запоминает и использует при следующем включении необходимые *.hex и *.epr файлы и свои координаты. Пару раз после включения программа не появлялась на рабочем столе — в ее конфигурационном файле «setting» оказывались записанными некорректные значения координат X и Y, тогда нужно просто записать там 0,0 и, после запуска, перетащить окно в требуемое место; для меня комфортнее всего для этого подходит правый нижний угол IDE AVR Studio:
К моему удивлению, программа не поддерживает программирование фьюзов для некоторых видов процессоров, по которым давно уже имеется документация. Вероятно, автор не смог получить такие MCU в свое распоряжение и без практической проверки не внедрил такую поддержку, хотя сама основная программа прошивается без проблем. В моем случае неприятным сюрпризом явилась невозможность перепрограммирования служебной области у Atmega328P.
Необходимость в Atmega328P возникла потому, что имеющиеся у меня младшие модели MCU серии Atmega 168 и 88 имеют только 1КБ SRAM на борту. А для программирования графического дисплея был нужен (для экспериментов по созданию графической библиотеки) объем RAM, равный графической памяти обычного монохромного дисплея размером 128х64 точки, то есть 1КБ, плюс примерно еще столько же должно оставаться под дополнительные нужды и стек. Некоторое время тренировался на Atmega88 c 1КБ RAM, используя дополнительный буфер только под половину экрана:
Объем RAM 2КБ и выше имеют те модели AVR, где установлено 32КБ флэш памяти. Самый современный из них, имеющий исполнение DIP, это как раз Atmega328P. Можно, конечно, воспользоваться внешней памятью, применив соответствующий MCU, например, 8515, но это уже совсем другая песня. В принципе, такой MCU, внешняя SRAM и регистр-защелка серии 573, нужный для демультиплексирования шины адреса-данных, тоже имеется, он используется в качестве прототипа для устройства на базе планарного Atmega128, которое пока в разработке.
Прежде, чем приступить к программированию фьюзов Atmega328P, стоит упомянуть о полезной программе, онлайновому калькулятору фьюзов и лок-битов микропроцессоров AVR. Его можно найти по адресу http://www.engbedded.com/fusecalc . Выбрав нужный вам MCU, легко получить нужные коды и, более того, приводится уже готовая строка для присоединения к командной строке AVR Dude, при программировании через выбранный программатор:
Тройной клик на верхней строке ее выделяет (это можно сделать и обычным выделением), и ее можно вставить в командную строку:
(кликните по картинке для увеличения)
Выполнение командной строки
Не стоит пугаться ошибки верификации — об этом об этом и на предыдущей картинке красным цветом специально выделено. Программируемые регистры имеют неиспользуемые биты, которые будут читаться нулями, не зависимо от того, что туда будет записываться, то есть, в данном случае, после программирования efuse как 0xff (кстати, программирование байта в EEPROM значением 0xff означает просто ничего не делать) при чтении получено 0x07, то есть пять старших битов не установлены, что на самом деле не является ошибкой.
В данном случае Atmega328P запрограммирован на работу от внутреннего RC осциллятора 8МГц и подачей полной частоты на вывод 14 микросхемы (это бывает необходимо при мультипроцессорных конфигурациях, с этого вывода снимается тактовые импульсы для подачи на другие элементы схемы, а в нашем случае это используется для быстрого контроля правильности наших действий — после окончания программирования на этом выводе с помощью осциллографа можно увидеть меандр 8МГц. Кроме того, так будет удобно и калибровать внутренний RC-генератор, так как по умолчанию его точность установки 10%, а реально можно добиться точности на два порядка выше).
После проверки работоспособности MCU и его точной калибровки, если это необходимо (желательно все же ее провести, так как один из четырех MCU Atmegа88 попался с частотой по умолчанию в 7.2МГц, остальные были примерно на 8.1МГц), снимаем подачу тактовой частоты на 14-й вывод, выполнив еще одно программирование :
Фактически, мы вернулись к заводским настройкам. Так как цоколевка и назначение выводов во всей серии MCU Atmegа 48/88/168/328 совпадает, то все это можно проделать на всей этой серии микроконтроллеров, включая индексы P, A и PA, поставив соответствующие данные, полученные из калькулятора или определенные самостоятельно. Для простых Atmegа8, цоколевка также совпадает, но функции вывода тактовой частоты на 14-й вывод нет. Конфигурационный файл conf.txt – это просто переименованный стандартный, в котором прописана поддержка процессора MCU 328P.
Таким образом, плата прототипа, программатор, MCU и среда разработки определены.
Почему MCU 8-битный и от Atmel?Ничего против MCU других производителей и другой разрядности не имею. Более того, несколько раз сдерживался, чтобы не купить игрушки других производителей, к примеру, Propeller от Paralax или что-нибудь на ядре Cortex М3 или семитысячную атмелку.
Причина выбора Atmel предельно банальна — цена на нашем локальном рынке. MCU PIC от Microchip, в сравнении с сопоставимыми моделями Atmega, стоят в среднем в два раза дороже. А потом, естественно, уже срабатывает сила привычки. Но несколько пробных программок я написал и для PIC.
Кстати, существует интересный документ, ответ компании Microchip на громкие рекламные заявления корпорации Atmel по поводу выпуска ее первых 8-разрядных MCU. В частности, Atmel заявила, что это первые в мире микроконтроллеры, хотя Microchip на тот момент уже год как выпускала MCU с подобной функциональностью. Познавательно почитать и техническое сравнение, которое выглядит совсем вопреки PR-компании Atmel. Впрочем, документу уже много лет и перечисленные недостатки в значительной степени устранены и на тех и других MCU можно решать соответствующий их вычислительной мощности класс задач (для примера — по этому параметру MCU Atmega8 примерно соответствует процессору Intel 80286). Но следы пиарщиков Atmel видны и сегодня — наверное, была поставлена задача подавить конкурента расширенным в четыре раза (это у RISC архитектуры!) набором инструкций. Анализ операционного кода сразу показывает, что для ряда операционных кодов просто добавлена новая мнемоника (к примеру OR Rd,Rd и TST Rd, EOR Rd,Rd и CLR Rd и др.) что явно не соответствует понятию «новая инструкция», а вот некоторых команд действительно не хватает, например, сложения с константой, косвенных операций со стеком и т.д., хотя все это и не принципиально. Например, сложение с константой для любого регистра для 8-битной арифметики легко заменяется имеющейся командой вычитания константы.
Так же ценой определяется и то, что пока в экспериментах используются 8-битные процессоры. Например, 16-битный MCU ECOG1X14B5 от Cyаn стоит столько же, сколько и Atmega328P. При этом, ECOG1X14B5 имеет несравненно лучшие характеристики, вот таблица сравнения по некоторым параметрам:
Параметр | ECOG1X14B5 | ATmega328P |
---|---|---|
Флэш память | 512КБ | 32КБ |
SRAM | 24КБ | 2КБ |
Тактовая частота | 70МГц | 20МГц |
Memory Management | Есть | Нет |
External Memory | Есть | Нет |
Кэш команд | Есть | Нет |
USB интерфейс | Есть | Нет |
Ethernet интерфейс | 10/100 | Нет |
Smart Card Interface | Dual | Нет |
I2S digital audio | Есть | Нет |
LCD controller | 32х4 | Нет |
Таймеры | 13 | 4 |
По техническим параметрам, при равной стоимости изделий, MCU Atmel и близко не стоит с MCU Cyan. Почему же сразу не отбросить в сторону 8-разрядные MCU Atmel?
К сожалению, кроме стоимости самого MCU нужно учитывать и «стоимость владения», то есть стоимость оборудования для создания прототипов. Более развитые MCU обычно не имеют корпусов типа DIP, с которыми прекрасно можно работать на обычных макетных платах-прототипах. Подобные MCU имеют 100 выводов и более и конструктив корпуса QPFN или даже BGA, что в несколько раз повышает стоимость создания прототипов и для любительского конструирования такие затраты не всегда приемлемы.
Кроме того, более сложные MCU, обладая повышенным набором интерфейсов, внедряют сложные механизмы управления памятью, многочисленные режимы DMA и другие усовершенствования, что повышает и сложность создания программ.
Рассматривая одну тенденцию, когда разработчики повышают разрядность и производительность своих MCU, соответственно увеличивая энергопотребление и размеры за счет дополнительной необходимой обвязки, можно заметить и другую, когда архитектурные решения платформы х86 спускаются по производительности от «обычного» PC, в направлении сверху вниз, в виде, например, picoITX решений. Конечно, для PDA и малогабаритных медиаплееров решения x86 пока не могут конкурировать с RISC-процессорами, но в промышленном сегменте, при создании web-приложений конкуренция обостряется. Рано или поздно, но, с развитием технологий, постепенно границы между платформами будут размываться.
К примеру, вот вид референсной платы Atmel на базе 32-битного MCU AP7000:
Примерно аналогичная по стоимости и назначению плата (практически, готовый web-сервер) под Cyan, правда с одним сетевым портом и без установленного кардридера, выглядит так:
С другой стороны, если использовать 8-битные MCU серии Xmega, или даже Atmegs128 с внешней SRAM, Ethernet контроллером, то PCB будет выглядеть не намного проще.
PicoITX решение VIA EPIA PX10000G, размером 10х7.2см стоит заметно подороже, но зато это уже относительно полноценный x86-компьютер:
Но прежде, чем создавать такие вещи на продвинутых MCU, нужно попрактиковаться на чем-нибудь попроще, для наших задач начального уровня выбор 8-разрядных MCU AVR вполне логичен. Соответственно, понятен и класс задач, решаемый такими устройствами, это, прежде всего, несложная автоматика, обработка данных датчиков, коммуникация и вывод информации на LED-индикаторы, текстовые или графические дисплеи с небольшим разрешением и глубиной цвета. Для просмотра видео вычислительной мощности этих МCU будет недостаточно. С простеньких примеров и начинаем. Практикум — несколько примеров
Как повелось при изучении нового языка общения с компьютерными железяками, первая программа – “Hello, World!”.
Работа с текстовым дисплеем тривиальна, хотя получилось и не с первого раза — я ориентировался на документацию, в частности, на временные параметры, указанные производителем дисплея RayStar, но производитель себе несколько льстит, хотя это и не критично. После общения с несколькими графическими и текстовыми дисплеями было принято решение, что операции чтения из дисплея, включая признак занятости, это абсолютно ненужные операции – для каждого типа дисплея подбираются задержки, гарантирующие корректную работу. Для этого пришлось написать и отладочный макрос, позволяющий автоматически устанавливать точные задержки, вне зависимости от тактовой частоты микроконтроллера.
Парочка текстовых дисплеев и графический сенсорный дисплей DOGM-128e с интерфейсом SPI
Более того, вполне естественное решение — устроить промежуточный буфер во встроенной SRAM, равный размеру экранной области, и формировать изображения в нем, а операцию перезаписи в RAM дисплея организовать в обработчике прерывания по таймеру. Такая операция гораздо удобнее, так как запись одного символа в RAM дисплея требует около 40мкс, в то время как запись в SRAM, при тактовой частоте 8МГц, требует всего 2 такта, то есть 250нс. Таким образом, нет нужды и в прочих аппаратных особенностях, связанных со скроллингом, морганием и т.д., все просто и быстро реализуется программно, если в этом есть необходимость.
Большей частью такие преимущества проявляются в графических дисплеях с внутренним контроллером и RAM, так как общее пространство пикселей сегментируется по возможностям примененных контроллеров дисплея и часто требуется переустановка адреса страницы перед выводом пиксела.
Текстовые дисплеи на распространенных контроллерах имеют возможность запрограммировать 10 стандартных символов. Если ROM дисплея не содержит кириллицы, то получить полноценный русский шрифт будет тяжело.
Русский шрифт зашит в ROM. Сверху парочка ЦАП TDA8444, подключенных по интерфейсу I2C
А вот для корректировки начертания некоторых символов этого вполне хватит. Например, бросается в глаза буква «ц», буквы «в», «ь» и некоторые другие получили укороченный размер, можно подкорректировать и знаки препинания:
В нижней строке дисплея исправлены буквы «ц», «в», «ь», «ы» и запятая опущена на один пиксел вниз
Впрочем, это мелочи и все это делалось с тренировочной целью, так как в процессе моих экспериментов я ставил своей целью охватить максимально возможный объем функционала как микропроцессоров, так и тех устройств, которые с ними сопрягаются. Более практичным, в плане программирования дополнительных символов, может быть, к примеру, программирование показа уровней сигнала аудиоплеера по частотам, после обработки этого сигнала преобразованием Фурье.
Вот пример более полезного использования 4-х строчного текстового дисплея, для вывода содержимого 32 байт памяти (или регистров общего назначения), так как не всегда это удобно делать под отладчиком без дополнительного аппаратного обеспечения в условиях обработки внешних сигналов. В данном случае часть программы и текстовый дисплей как раз и являются таким дополнительным оборудованием.
(кликните по картинке для увеличения)
Следующим шагом, по горячим следам после статьи «Microlab Solo6C – сигналы управления», стала реализация этих самых сигналов управления на базе микроконтроллера Atiny2313, как одного из самых дешевых в семействе Atmel. Впрочем, он все равно явно дороже примененного китайцами MCU NSR2251, который стоит менее 1 юаня (0.15$), но у меня нет доступа ни к NSR2251, ни к документации по нему.
Вместо двухзнакового LED-дисплея использовался 4-х знаковый, что более практично, так как пришлось разрабатывать обработчик IR-сигналов по стандарту NEC, на фото как раз видны принятые от ПДУ Solo6C адрес 0х01 и команда 0х0d. Несмотря на работу от калиброванного внутреннего генератора тактовой частоты, управляющие импульсы для микросхемы регулировки громкостью и тембром не имеют провалов по длительности, как под руководством оригинального NSR2251.
NSR2251
Atiny2313
Неравномерности на верхнем рисунке могут быть вызваны тем, что разрешены вложенные прерывания. Например, более приоритетное прерывание по приему IR-сигнала, но оно не может быть чаще, чем через 562.5мкс. Может наложиться и мультиплексирование знаков дисплея, но тогда слишком затянуто. Хорошо заметно пять больших аномалий, которые, по логике, не могут быть отнесены на счет одного и того же вложенного прерывания, так что, чем еще занимается
процессор NSR2251, видимо, навсегда останется для меня загадкой. Ну и ладно, возвращаемся к нашей работе.
Вся программа занимает чуть более одного килобайта. Впрочем, до практических испытаний дело не дошло, так как, во первых, немножко надоело, а, во-вторых, и потребовалось расширить функционал — для сохранения текущих настроек и различных профилей темброблока требовалось наличие явного сигнала выключения — ведь не записывать же в EEPROM эти данные после каждого изменения! Это можно реализовать и с помощью имеющегося пульта, например, измеряя время непрерывного нажатия кнопки «Mute», если мы ее назначаем ответственной за включение-выключение. Скажем, непрерывное нажатие в течение 3 секунд включает или выключает устройство, при этом сам контроллер и цепи управления запитываются от отдельного источника. Сразу хочется идти дальше — встроить часы реального времени, тюнер, и т.д.
На тот момент эта идея меня не вдохновила. Но вот как уже пару недель я к ней вернулся. Так что, возможны варианты.
Для полноценных графических приложений (разумеется, в рамках производительности выбранных MCU), нужно использовать графические дисплеи.
Поскольку не планировалось (пока) приобретение дисплеев с размером экрана выше 128х64 точек, то для обработки графики разрабатывались программы (по алгоритмам Брезенхема) в 8-битной арифметике, что наложило некоторые ограничения, например, на размер окружностей.
Четвертинки по углам дисплея имеют максимальный радиус в 43 пиксела, после которого начинается уже некоторое искажение вида окружности. Впрочем, низкое разрешение 128х64 само по себе не подарок.
Без прямых линий, прямоугольников и вывода времени, формирование такой картинки в SRAM занимает примерно 9.5мс (при тактовой частоте MCU 8 МГц), со всем остальным — менее 12 мс. Учитывая, что запись одного байта в VRAM дисплея занимает около 6мкс, перезапись всего экранного буфера из SRAM в VRAM займет около 6 мс, что, с учетом 12 мс времени рисования, обеспечит вывод более 50 кадров в секунду.
Кстати, разработка собственных графических процедур и началась после того, как на сайте Arduino я увидел библиотеку на Си, которая гордится выводом аж в целых 6 fps. При мощности MCU в 1 MIPS/МГц это просто курам на смех.
Реализация алгоритма Брезенхема для вывода окружности не оптимизирована и использует вызов функции PlotXY, вычисляющей координаты каждого пиксела. Это не оптимально с точки зрения быстродействия, так как точки примыкают друг к другу и приращение координат (если есть) всегда выполняется на один пиксел. Для вывода отрезков (прямых и под произвольным углом) реализация алгоритма сделана с оптимизацией. Прямые горизонтальные линии рисуются (в буфер) быстрее всего — несколько миллионов точек в секунду.
Но высокий fps, достижимый при программировании на ассемблере, разбивается об инерционность недорогого дисплея. Для имеющихся у меня графических дисплеев Raystar с желтозеленой и RGB подсветкой, типовое время включения и выключения пиксела составляет 200мс, максимальное — 300!
Поэтому такие дисплеи не пригодны для вывода динамического изображения, ради примера я запрограммировал квадратик, двигающийся в левой половине экрана и отражающийся от его границ, при этом стабилизируется fps=30:
Тут и сказать в общем-то нечего. Абсолютный неуд, при любых скоростях, соответствующих плавному перемещению квадратика, вплоть до стробоскопического эффекта.
Для сравнения, вот «статичные» пикселы того же дисплея и той же голубой подсветкой (у него она RGB):
Ну и, за компанию, пикселы текстового негативного дисплея с голубой подсветкой RC2004A-BIW-CSX:
Проверим динамику и с аппаратным скроллингом. Исходная картинка:
Правая половина будет сдвигаться аппаратно, левая — программно. Результат при медленной скорости:
Программный кажется чуть поярче, но это, вероятно, неравномерность подсветки и влияние светочувствительности объектива, на глаз неравномерность выражена гораздо слабее. Контрольный забег без подсветки и чуть побыстрее:
Более ничего и не скажешь. В запасе есть еще один мониторчик, с SPI интерфейсом и сенсорным покрывалом, но он занят пока в другом проекте. Но в то, что он будет заметно лучше, верится с трудом. Это — мониторы для промышленной автоматики. Надо пробовать более быстродействующие дисплеи или вывод на стандартный VGA-монитор. Правда, придется поизвращаться, но на просторах инета такие вещи описаны, даже сделаны подсоединение ISA-интерфейса и работа со стандартными ISA видеокартами типа Trident9000 и некоторыми другими. Это тоже своего рода оверклокингский спорт — как выжать из устройства то, на что оно явно не рассчитано.
К слову, о графических дисплеях. Поскольку это тоже была моя первая встреча с ними, то первый приобретенный дисплей оказался без генератора отрицательного напряжения, о необходимости которого я даже и не подозревал. К моему удивлению и негодованию, устройства на макетной плате, многократно пересобранные и перепроверенные, как для полета в космос, не могли высветить не единой точки на дисплее. Контрастность тоже не регулировалась и массива пикселов не было видно. Только через позорно долгое время я выяснил причину.
Слева – дисплей без установленной IC 7660, хотя разводка под нее есть, на фото справа такая IC установлена
На «полноценных» графических дисплеях ставится микросхема — преобразователь DC/DC, генерирующая необходимое для дисплея отрицательное напряжение, которого нужно 4 вольта с хвостиком. Обычно используется микросхема типа LM7660. С ходу под рукой таковой не оказалось, и я решил сгенерировать отрицательное напряжение, выпрямив импульсное со специально выделенного вывода MCU. Но моя затея провалилась – так как я запитывал всю схему от USB, то итоговое напряжение питания проседало до 4.6-4.7В (не из-за генерации минуса, там ток мизерный), что в итоге давало, в лучшем случае, -3.22В. Изображение было не контрастным, хотя и различимым. Изменение частоты и параметров выпрямителя существенного эффекта не дали, приемлемый контраст появлялся только при -3.7..-4.2В. Нужно было запитывать схему от источника 5.5В или делать схему умножения. И то, и другое нецелесообразно, поэтому просто были куплены микросхемы 7660 в DIP корпусе. Для конкретных поделок правильнее купить их в планарном корпусе и распаять на плате дисплея, благо место есть и нужно еще всего два конденсатора, а для экспериментов как раз и DIP корпуса.
Разумеется, были проделаны манипуляции по многоканальным измерениям с использованием как АЦП, так и ЦАП преобразований, измерения температуры. Опробован и метод адресного расширения пространства под периферию. Шина данных у большинства 8-разрядных MCU чисто внутренняя. Так как число выводов ограничено, то, в некоторых случаях, их может просто не хватить. Например, только 4-х знаковый LED “съест” 12 выводов. А если нужна, например, матрица клавиш 4х4, требующая еще 8 выводов, и другая периферия? На MCU с внешней шиной (Atmega8515, Atmega128 и др.) это решается просто, а что делать на остальных? На самом деле, и для LED (вывод), и для клавиатуры (ввод), можно обойтись гораздо меньшим числом выводов, используя, соответственно, регистры последовательный вход-параллельный выход (74НС164) и параллельный вход-последовательный выход (74НС165). Для примера, вот реализация клавиатуры на шесть клавиш на 74НС165:
Блок клавиатуры
Одна микросхема рассчитана на восемь клавиш, но здесь собран эмулятор джойстика, так как не попалось такового, пригодного для макетирования, есть только в smd-корпусе. 74НС165 имеет выходы для каскадирования, так что количество клавиш не ограничено, как и число одновременно нажатых. Любое количество микросхем требует только трех выводов MCU, причем возможна и работа через SPI или USART. Конечно, если не ставится цель сделать подешевле, то для таких целей и получения большей функциональности можно использовать и отдельный микроконтроллер. В этом смысле, например, ассортимент многочисленных расширителей шины I2C от Philips, стоящих в несколько раз выше длстаточно продвинутых MCU, вообще не имеет ни экономического, ни технического смысла.
Но эти вещи довольно тривиальны (по крайней мере, для меня), а вот, с чем я впервые столкнулся, так это с бытовыми RF приемниками, передатчиками и трансиверами. Устройства ZigBee и BT, хоть и доступны по цене и наличию, но для первого раза показалось, что они отнимут относительно много времени на изучение и поэтому были отложены. А вот несколько приемников и передатчиков диапазона 868 Мгц, с дальностью связи в несколько сот метров (так и хочется назвать это набором начинающего террориста), были приобретены:
Вполне адекватная замена IR связи и проводным соединениям автоматики в пределах дома. Для интереса пока проверил только скорость передачи. На вход передатчика подавался меандр, сигнал на выходе приемника контролировался по осциллографу. Скважность начинает уходить от 50% в районе 4.5КГц и к 30КГц начинает твориться черти что с выпадением импульсов. Так что аудио-видео не потянет, но прочие потребности умного дома вполне обслужит. А при использовании протокола от 1Wireинтерфейса возможна организации по одному каналу полудуплексного обмена с необходимым числом устройств. Осталось подумать, как оптимально защититься от сигналов соседей, если и они интенсивно будут использовать подобные устройства, радиус действия ведь не маленький. Канал один, чем больше народу — тем меньше свободного эфира.
Разумеется, область применения MCU не ограничивается описанными случаями. Но для первого знакомства, наверное, достаточно.
А что у них с разгоном?А с разгоном у них хорошо. Наверное. Пока руки до этого не дошли, но сбоев в относительно длительной работе (пара суток) пары 20Мгц MCU с кристаллом 29.8МГц не было. Конечно, это не говорит об их полной стабильности, тем более есть несколько хитрых внутренних увязок по частотам, но это показывает, что такая возможность есть. PLL-ки с подходящим диапазоном у меня нет, но есть кварцы на 40 и 50МГц, в smd исполнении. Так что, когда судьба сподвигнет на припайку двух ножек к каждому резонатору, обязательно проверим поведение MCU на этих частотах. Пока условно засчитаем, что рубеж 30МГц они взяли.
Идем дальше или не идем?Честно говоря, даже не знаю — нужны ли детальные описания моей борьбы с микроконтроллерами, в частности — концептуальный подход по выбору элементной базы и схемотехническим решениям, подходы и приемы программирования на ассемблере для AVR, работа с препроцессором и макросами, работа с многоразрядными 7-сегментными индикаторами, текстовыми и графическими дисплеями, реализация алгоритма Брезенхема для построения графических примитивов, спрайтовая анимация, часы, периферия I2С, SPI, etc..
Если интерес к таким проблемам есть — задавайте вопросы в теме обсуждения статьи.
Комментарии, вопросы и предложения здесь.
zauropod,
специально для www.overclockers.ru
август 2009 года
ATmega. Прошивка ATmega через USBasp и avrdude. Подключение и прошивка микроконтроллера ATmega328P-PU с помощью Arduino ISP программатора Прошивка atmega 328
Данное руководство пошагово описывает процесс записи/обновления загрузчика (прошивки) в микроконтроллер на плате «Cosmo Black Star» (аналог Ардуино) посредством использования внутрисхемного программатора AVRISP mkII и AVR Studio 4.
- Загрузите и установите на своем компьютере AVR Studio 4
- Подключите к компьютеру программатор (AVRISP mkII) посредством USB-кабеля (тип A-B)
- Подключите программатор посредством 6-ти жильного шлейфа к ISP разъему на плате
ISP разъем расположен рядом с кнопкой сброса. Обратите внимание на красную полоску на шлейфе, он указывает ориентацию на 1 pin (смотрите маркировку на плате). 1 pin и красная полоска должны быть с одной стороны.
Когда программатор не подключен к микроконтроллеру, а также когда на микроконтроллер не подается питание, второй индикатор на программаторе расположенный рядом со шлейфом, показывает индикацию красным светом.
- Подключите к гнезду питания на плате штекер от внешнего источника и подайте на плату напряжение 7-12 вольт
На плате «Cosmo» должен загореться POWER индикатор зеленого цвета.
Обратите внимание, что при подаче на микроконтроллер питания на программаторе второй индикатор сменил цвет с красного на зеленый.
- Установите соединение с микроконтроллером
Для этого запустите на вашем компьютере AVR Studio . В главном меню программы раскройте вкладку «Tools » и далее выберите Program AVR → Connect
В открывшемся диалоге выберите в левой части программатор AVRISP mkII , а затем в правой части укажите порт USB . После этого жмите по кнопке «Connect »
- Укажите опции прошивки
При установлении соединения с микроконтроллером в AVR Studio откроется диалоговое окно, на вкладках которого нужно будет указать опции прошивки.
Ранее производил прошивку МК средствами Arduino IDE, на эту тему есть отдельная статья . Время идет, пора переходить на более тонкие инструменты, в частности C и avrdude. Программируем, собираем, прошиваем.
Задача
Тестовую программу мигания светодиодом на C, скомпилировать в файл прошивки и загрузить результат в МК ATmega 328 P.
Решение
Разработку, прошивку и дальнейшее описание буду вести на Debian 9 , но все необходимые компоненты есть и под Windows.
Подготовка окружения
Первым делом подготовим окружение, как писал выше: разработка на C , компиляция прошивки средствами avr-gcc , загрузка прошивки средствами avrdude , через программатор USBasp .
Для установки необходимого собрал следующий набор:
# apt-get install avr-libc gcc-avr binutils-avr avrdude
В Debian драйвера для USBasp устанавливать не надо, они есть в составе ядра. Для Windows необходимо скачать и установить драйвер с сайта разработчика fischl.de .
Подключение оборудования
На данном этапе не должно вызвать вопросов, но для порядка опишу подключение. Подключаем микроконтроллер к программатору USBasp : выводы SCK , MISO , MOSI , RESET , VCC . Так же не забываем к выходу D0 через резистор 220 Ом подключить анод светодиода, катод к GND .
Написание кода
На данный момент нет разницы в чем будет написан код, для себя выбрал Atom . Создаем файл с расширением .c , например main.c , в котором напишем код мигания светодиодом:
#define F_CPU 16000000UL // Частота работы МК от внешнего кварца #include #include void main() { DDRD = 0xFF; // Все выводы порта D как выход PORTD = 0x00; // На всех выводах установим 0 while (1) { PORTD |= (1
Первой строкой явно указываю частоту с которой должен работать МК, т.к. у меня подключен внешний кварцевый резонатор на 16 МГц. Остальное ясно из комментариев.
Компиляция кода
Для компиляции будем пользоваться двумя командами(полного описания команд и их ключей приводить не буду, ибо каждая из них повод для отдельных статей и они легко находятся в интернете):
avr-gcc — производит компиляцию C в объектный файл.
К данной команде используем ключи:
- -mmcu ATmega 328P ;
- -DF_CPU для указания частоты с которой работает МК.
main.o
avr-objcopy — производит преобразование объектного файла в hex .
Avr-objcopy -O ihex main.o main.hex
После выполнения команды в каталоге появится файл main.hex . Файл прошивки готов, необходимо загрузить его на МК.
Внимание avrdudeВоспользуемся утилитой avrdude , к данной команде используем ключи:
- -c для указания программатора, в данном случае USBasp ;
- -p для указания типа МК, в данном случае ATmega 328P ;
- -U ключ для указания с каким типом памяти мы работаем, что именно делаем, и указываем файл источник/приемник. В данном случает производится запись во flas-память МК из файла main.hex .
Мне понравилось описание ключей и примеров на сайте ph0en1x.net .
Avrdude -c usbasp -p atmega328p -U flash:w:main.hex
После выполнения команды МК оживает и начинает выполнять заложенные в код алгоритмы.
Изменение FUSE-битов
!!! Внимание Настоятельно рекомендую перед выполнением команды avrdude ознакомиться с описанием ключей и все операции производить только после проверки написанного, во избежание окиричивания МК. Все дальнейшие расчеты на свой страх и риск!
Но не все так гладко. В коде между включением и выключением указана задержка в 1 секунду, а на практике светодиод горит более 10 секунд. Вооружился секундомером, замер показал 16 секунд. Получается МК работает на частоте 1 МГц , вместо 16 МГц .
Чтение документации показало, что необходимо МК указать на какой частоте он должен работать при подключении внешнего кварцевого резонатора. Для ATmega 328P указывается 3 байтами: lock , lfuse , hfuse .
Для расчета значений этих байтов есть калькуляторы фьюзов, обязательно необходимо проверить получившиеся значения с документацией! Для себя собрал следующую команду:
Avrdude -c usbasp -p atmega328p -U lock:w:0xFF:m -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m
После выполнения команды МК начал работать на положенной ему частоте.
10.01.2018 3478Если Вы сам деятель науки или просто любознательный человек, и Вы частенько смотрите или читаете последние новости в сфере науки или техники. Именно для Вас мы создали такой раздел, где освещаются последние новости мира в сфере новых научных открытий, достижений, а также в сфере техники. Только самые свежие события и только проверенные источники.
В наше прогрессивное время наука двигается быстрыми темпами, так что не всегда можно уследить за ними. Какие-то старые догмы рушатся, какие-то выдвигаются новые. Человечество не стоит на месте и не должно стоять, а двигателем человечества, являются ученые, научные деятели. И в любой момент может произойти открытие, которое способно не просто поразить умы всего населения земного шара, но и в корне поменять нашу жизнь.
Особая роль в науке выделяется медицине, так как человек, к сожалению не бессмертен, хрупок и очень уязвим к всякого рода заболеваниям. Многим известно, что в средние века люди в среднем жили лет 30, а сейчас 60-80 лет. То есть, как минимум вдвое увеличилась продолжительность жизни. На это повлияло, конечно, совокупность факторов, однако большую роль привнесла именно медицина. И, наверняка 60-80 лет для человека не предел средней жизни. Вполне возможно, что когда-нибудь люди перешагнут через отметку в 100 лет. Ученые со всего мира борются за это.
В сфере и других наук постоянно ведутся разработки. Каждый год ученые со всего мира делаю маленькие открытия, потихоньку продвигая человечество вперед и улучшая нашу жизнь. Исследуется не тронутые человеком места, в первую очередь, конечно на нашей родной планете. Однако и в космосе постоянно происходят работы.
Среди техники особенно рвется вперед робототехника. Ведется создание идеального разумного робота. Когда-то давно роботы – были элементом фантастики и не более. Но уже на данный момент некоторые корпорации имеют в штате сотрудников настоящих роботов, которые выполняют различные функции и помогают оптимизировать труд, экономить ресурсы и выполнять за человека опасные виды деятельности.
Ещё хочется особое внимание уделить электронным вычислительным машинам, которые ещё лет 50 назад занимали огромное количество места, были медленными и требовали для своего ухода целую команду сотрудников. А сейчас такая машина, практически, в каждом доме, её уже называют проще и короче – компьютер. Теперь они не только компактны, но и в разы быстрее своих предшественников, а разобраться в нем может уже каждый желающий. С появлением компьютера человечество открыло новую эру, которую многие называют «технологической» или «информационной».
Вспомнив о компьютере, не стоит забывать и о создании интернета. Это дало тоже огромный результат для человечества. Это неиссякаемый источник информации, который теперь доступен практически каждому человеку. Он связывает людей с разных континентов и молниеносно передает информацию, о таком лет 100 назад невозможно было даже мечтать.
В этом разделе, Вы, безусловно, найдете для себя что-то интересное, увлекательное и познавательное. Возможно, даже когда-нибудь Вы сможете одним из первых узнать об открытии, которое не просто изменит мир, а перевернет Ваше сознание.
Постоянно используя отладочные платы типа Arduino в своих проектах, рано или поздно вы придете к мысли: «- А как же удешевить свои устройства и сделать их более компактными и с меньшим количеством проводов???» Всё это происходит потому, что отладив проект на Arduino, у нас остается много не задействованных разъемов, различных выходов и интерфейсов, занимающих дополнительное место. И первое с чем обычно всем хочется разобраться, это как подсоединиться напрямую к микроконтроллеру, к какой лапке что подключить и создать свою так называемую схему взаимодействия с ним, использую только все самое необходимое в своем проекте.
Разбираться будем на примере микроконтроллера ATmega328P-PU , который используется во всем известной плате Arduino Uno.
Начнем с самого простого и быстрого старта, используя в качестве программатора для нашего микроконтроллера любую имеющуюся у вас под рукой плату Arduino. Это гораздо проще, чем начать разбираться с различными существующими программаторами, их поисками или созданием. Море информации в интернете по настройке различных фьюзов микроконтроллера и каких-то других тонкостей, многих сразу пугает новыми непонятными терминами и количеством необходимых манипуляций для этих самых настроек. Поэтому мы не будем сейчас забивать этим мозг, у нас и так все что надо пропишется, и все как надо будет работать. А все прочие тонкости, если будет необходимость, изучите из других статей.
Сначала мы рассмотрим самую простую схему подключения микроконтроллера без использования внешнего кварцевого резонатора, так как данный микроконтроллер может работать от внутреннего кварца на частоте от 1 до 8 МГц, и этого вам с головой хватит во многих проектах.
Создаем Arduino ISP программатор из любой платы Ардуино.
В качестве программатора будем использовать плату Arduino Nano. Если у вас какая-то другая из плат Arduino, разницы нет ни какой, всё делаем так же. Подключаем плату Arduino к компьютеру. Запускаем программу Arduino IDE. В меню “Инструменты” выбираем как обычно нашу плату Ардуино и порт, с которым работаем. Открываем из примеров в программе скетч ArduinoISP “Файл” – “Примеры” – “ArduinoISP”
и загружаем его в нашу плату .
Всё! Наш Arduino ISP программатор готов!
*На заметку!!! Что такое ISP и SPI и в чем отличия! Несколькими словами это можно охарактеризовать так:
ISP – это метод внутрисхемного программирования, способ записи программы, программное обеспечение.
SPI – последовательный периферийный интерфейс, протокол, шина, стандарт обмена данными между устройствами.
Наш микроконтроллер ATmega328P-PU DIP28 имеет 28 ножек, по 14 с каждой стороны. Собирая схему, обратим внимание на выемку с одной из сторон на корпусе микроконтроллера ATmega328P-PU, которая поможет правильно сориентироваться в нумерации лапок микроконтроллера в соответствии с приведенными ниже схемами.
Соединяем Arduino Nano с микроконтроллером ATmega328P-PU через SPI интерфейс .
Для того чтобы понять, что и к какой лапке микроконтроллера мы подсоединили, воспользуемся для подсказки схемой распиновки микроконтроллера ATmega328P-PU.
И схемой распиновки платы Arduino Nano.
Теперь мы видим, что пин питания 5V платы Arduino Nano мы направили к лапкам VCC и AVCC микроконтроллера. Пин GND платы Ардуино мы направили на лапки GND микроконтроллера. Таким образом, мы обеспечили полностью питанием наш микроконтроллер ATmega328P-PU. Далее соединяем пины MISO (D12), MOSI (D11), SCK (D13) платы Arduino Nano с лапками MISO, MOSI, SCK микроконтроллера ATmega328, а пин SS (D10) от Ардуино подводим к лапке reset микроконтроллера. Если вы используете другую плату Arduino в качестве ISP программатора, просто найдите схему распиновки вашей платы Arduino и определитесь, где у неё находятся пины MISO, MOSI, SCK и SS. После чего соедините их с соответствующими лапками микроконтроллера ATmega328P-PU.
*На заметку!!!
Пины SPI интерфейса платы Arduino Mega : MISO (50), MOSI (51), SCK (52), SS (53)
Пины SPI интерфейса платы Arduino Uno : MISO (12), MOSI (11), SCK (13), SS (10)
Прошивка бутлоадера (загрузчика) в ATmega328P-PU через SPI интерфейс с помощью Arduino ISP программатора.
Теперь нам необходимо залить бутлоадер (загрузчик операционной системы) в наш микроконтроллер ATmega328P-PU. Для этого будем использовать Arduino загрузчик, настроенный специально для работы с внутренним кварцем на 8 МГц.
Понимание битов предохранителей в ATmega328P для повышения эффективности программирования Arduino
В этом руководстве мы поговорим о предохранителях. Когда я учился в колледже и узнал обо всех крутых вещах в электронике, я впервые услышал термин предохранитель в AVR, моя первоначальная мысль по этой теме была, о! что-то внутри AVR взорвется, если я сделаю что-то не так. В то время в Интернете было не так много ресурсов, через которые можно было бы пройти. Я довольно много поискал, чтобы выяснить, что эти предохранители относятся к некоторым специальным битам внутри микроконтроллера AVR .Эти биты похожи на крошечные переключатели внутри AVR, и, включив / выключив их, мы можем включить / выключить некоторые специальные функции AVR. Включение и выключение означает настройку и сброс.
Мы собираемся воспользоваться этой возможностью, чтобы обсудить все, что есть о битах предохранителя в AVR . Для простоты мы возьмем в качестве примера плату Arduino, на которой установлен популярный микроконтроллер ATmega328P . Здесь вы узнаете, как установить эти предохранители для включения и выключения некоторых из этих функций, что очень удобно в реальных приложениях.Итак, давайте перейдем к делу.
В наших предыдущих публикациях мы построили множество проектов микроконтроллеров AVR, таких как Интерфейсный модуль GSM с микроконтроллером AVR и Интерфейс HC-05 с микроконтроллером AVR. Вы можете ознакомиться с ними, если хотите узнать больше об этих проектах.
Что такое предохранители в АРН – подробное объяснениеКак мы обсуждали ранее, предохранители в микроконтроллере похожи на маленькие переключатели, которые можно включать и выключать для включения и отключения различных функций микроконтроллера AVR.Это та часть, где возникает наш следующий вопрос, так как же нам установить или сбросить эти предохранители? Ответ на этот вопрос прост: мы делаем это с помощью регистра предохранителей .
В микросхеме ATmega328P всего 19 бит предохранителя, которые разделены на три байта предохранителя. Они определены как «Байт расширенного предохранителя», «Байт старшего предохранителя», и «Байт младшего предохранителя».
Если вы посмотрите на Таблицу 27 спецификации ATmega328 / P Rev: 7810D – AVR – 01/15, вы сможете узнать все мелкие детали о битах предохранителей.Но изображение ниже даст вам лучшее представление о разделе с предохранителями в таблице данных.
Теперь, когда вы немного узнали о предохранителях, давайте пройдемся по таблице данных и выясним все необходимые подробности об этой ИС.
Удлиненные биты предохранителя:
Щелкнув вкладку Fuse Bits и немного прокрутив ее вниз, вы найдете Таблицу 27-5: в которой показана таблица для «Extended Fuse Byte» , обычно известного как « EFUSE». Изображение ниже показывает именно это.
В этой таблице есть только три используемых бита, а остальные три зарезервированы. Эти три бита имеют дело с уровнем обнаружения сбоев в работе . Как вы можете видеть в примечании, если мы посмотрим на Таблицу 28-5, мы сможем найти более подробную информацию об этом.
Как вы можете видеть в приведенной выше таблице, у нас есть таблица для Обнаружение сбоев . Обнаружение пониженного напряжения – это функция, которая сбрасывает микроконтроллер, когда напряжение питания падает ниже определенного уровня.В микросхеме ATmega328P мы можем полностью отключить обнаружение отключения питания или установить его на уровни, указанные в приведенной выше таблице.
Старшие байты предохранителя:
Как вы можете видеть на изображении ниже, в таблице 27-6: таблицы данных показаны биты старшего предохранителя микросхемы ATmega328P.
High fuse выполняет различные задачи внутри микроконтроллера ATmega328. В этом разделе мы поговорим о предохранителях высшего класса и их работе.Начнем с битов BOOTRST, BOOTSZ0 и BOOTSZ1. Эти три бита отвечают за установку размера загрузки ; Размер загрузки относится к объему памяти, зарезервированной для установки загрузчика .
Загрузчик – это специальное программное обеспечение, которое запускается поверх микроконтроллера и управляет различными задачами. Но в случае с Arduino загрузчик используется для загрузки скетча Arduino внутрь микроконтроллера. В одной из наших предыдущих статей мы показали вам, как записать загрузчик в ATmega328P с помощью Arduino.Вы можете проверить это, если вам интересна тема. Возвращаясь к нашей теме, назначение других битов в старшем байте достаточно ясно, бит EESAVE предназначен для сохранения памяти EEPROM во время выполнения цикла стирания чипа. Бит WDTON предназначен для включения или отключения сторожевого таймера .
Сторожевой таймер – это специальный таймер в микросхеме ATmega328P, который имеет отдельные часы и работает независимо. Если сторожевой таймер включен, то вам нужно очистить его с определенным периодом, иначе сторожевой таймер сбросит микроконтроллер.Это полезная функция, которая присутствует во многих микроконтроллерах, если процессор застревает; сторожевой таймер сбросит его, чтобы предотвратить повреждение конечного приложения.
Бит DWEN используется для включения отладочного провода ; это подготовительный протокол, который встроен в их оборудование и используется для программирования и отладки процессоров. Если эта функция включена, вы можете прошивать и отлаживать процессор с помощью одного подключенного провода. Но для его использования вам понадобится специальное оборудование, которое подготовит к работе с Atmel.
Остальные два бита – это те биты, которых вам следует избегать, если вы точно не знаете, что делаете. Это бит-7 RSTDISBL и бит-5 SPIEN. RSTDISBL (Отключение внешнего сброса), как следует из названия, отключает вывод внешнего аппаратного сброса, а бит SPIEN используется для отключения интерфейса программирования SPI. Отключение любого из этих двух битов может полностью заблокировать ваш AVR; так что оставить их в покое – хорошая идея.
Младшие байты предохранителя:
Как вы можете видеть на изображении ниже, в таблице 27-7: таблицы данных показаны биты нижнего предохранителя микросхемы ATmega328P.
Этот байт предохранителя отвечает за установку источника синхронизации и некоторых других параметров часов внутри AVR. В этом разделе мы узнаем обо всем этом.
7-й бит или флаг CKDIV8 могут быть установлены для деления источника тактовой частоты на 8, это очень удобно, о чем вы, возможно, уже знаете, если пытались самостоятельно программировать AVR. Следующий бит – это бит CKOUT, и это 6-й бит младшего байта предохранителя. Программирование будет выводить внутренний тактовый сигнал на PORTB0 микроконтроллера.
Биты 5 и 4 SUT1 и SUT0 управляют временем запуска микроконтроллера. Это предотвращает любые действия по запуску, которые могут произойти или не произойти до того, как напряжение питания достигнет приемлемого минимального порогового уровня. И последние четыре бита CKSEL0 – 4 используются для выбора источника синхронизации микроконтроллера. Приведенная ниже таблица дает вам лучшее представление об этих четырех битах, которые отвечают за настройку источника тактовой частоты. Вы можете найти эту таблицу в разделе «Источник тактовой частоты» таблицы.
Теперь, прежде чем мы продолжим, я должен рассмотреть еще одну вещь – это таблица задержки запуска генератора. Под задержкой запуска мы имеем в виду биты 4 и 5 младшего байта предохранителя. Задержки необходимо устанавливать в зависимости от условий, в которых будет работать схема, и типа используемого вами генератора. Значения по умолчанию установлены для медленного увеличения мощности с 6 тактовыми циклами при выполнении последовательности включения или выключения питания. Затем следует еще одна задержка в 14 тактов с задержкой 65 мс после запуска.
Уф! Это было много информации, которую нужно было переварить. Но прежде чем продолжить, давайте закончим этот раздел небольшой заметкой.
Примечание:
Если вы внимательно просмотрели техническое описание, то, должно быть, заметили, программирование бита предохранителя означает установку его на низкий уровень, то есть 0 (ноль), что является противоположностью тому, что мы обычно делаем, чтобы сделать порт высоким или низким. Вы должны помнить об этом при настройке предохранителей.
Предохранители в ArduinoМы много говорили о предохранителях в предыдущем разделе, но в этом разделе давайте поговорим о том, как их настроить и как записать их в микроконтроллер.Для этого нам понадобится инструмент под названием Avrdude. Это инструмент, который можно использовать для чтения, записи и изменения памяти микроконтроллеров AVR. Он работает с SPI и имеет длинный список поддержки для разных типов программистов. вы можете скачать инструмент по ссылке ниже. Также мы будем использовать наш любимый микроконтроллер Arduino.
Теперь, когда у вас есть Avrdude, вам нужно извлечь его и открыть командное окно в этой папке. Кроме того, если вы планируете использовать его позже, вы можете добавить путь к папке в раздел переменных среды Windows.Но я поставлю его на свой рабочий стол и открою там командное окно. Как только мы это сделаем, мы подключим программатор USBasp к нашему ПК и убедимся, что у нас есть подходящий драйвер для нашего программатора USBasp. Как только мы это сделаем, все готово, и мы сначала прочитаем значение предохранителя по умолчанию. Для этого вам нужно выполнить следующую команду.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Если все в порядке, эта команда прочитает байты предохранителя и поместит их в три отдельных текстовых файла. Изображение ниже даст вам лучшее представление о процессе.
Как видите, Avrdude прочитал биты предохранителей на Arduino nano и сохранил их в трех отдельных текстовых файлах. Теперь мы открыли их и получили три значения; для EFUSE: 0xFD, для HFUSE: 0XDA, для LFUSE: 0xFF. Это значение предохранителя по умолчанию, которое мы получили для Arduino nano.Теперь давайте преобразуем эти биты в двоичные и сравним их со значением по умолчанию из таблицы. Таблица ниже показывает именно это.
Для удобства биты предохранителей записаны в шестнадцатеричных значениях, но если мы преобразуем их в двоичные значения и сравним с таблицей данных, мы узнаем, что происходит. Начнем с младшего байта предохранителя. Как видно из приведенной выше строки, для него установлено значение 0XFF , а двоичное значение будет 0B11111111.
Сравнение штатных младших байтов предохранителя с Arduino:
Младший байт предохранителя | Бит № | Значение по умолчанию в АРН | Значение по умолчанию для Arduino |
CKDIV8 | 7 | 0 (запрограммировано) | 1 (не запрограммировано) |
CKOUT | 6 | 1 (не запрограммировано) | 1 (не запрограммировано) |
SUT1 | 5 | 1 (не запрограммировано) | 1 (не запрограммировано) |
SUT0 | 4 | 0 (запрограммировано) | 1 (не запрограммировано) |
CKSEL3 | 3 | 0 (запрограммировано) | 1 (не запрограммировано) |
CKSEL2 | 2 | 0 (запрограммировано) | 1 (не запрограммировано) |
CKSEL1 | 1 | 1 (не запрограммировано) | 1 (не запрограммировано) |
CKSEL0 | 0 | 0 (запрограммировано) | 1 (не запрограммировано) |
Старший байт предохранителя имеет значение 0XDA в двоичном виде, то есть 0B11011010.
Старший байт предохранителя в двоичном формате:
Старший байт предохранителя | № бита | Значение по умолчанию в АРН | Значение по умолчанию для Arduino |
RSTDISBL | 7 | 1 (не запрограммировано) | 1 (не запрограммировано) |
DWEN | 6 | 1 (не запрограммировано) | 1 (не запрограммировано) |
SPIEN | 5 | 0 (запрограммировано) | 0 (запрограммировано) |
WDTON | 4 | 1 (не запрограммировано) | 1 (не запрограммировано) |
EESAVE | 3 | 1 (не запрограммировано) | 1 (не запрограммировано) |
БОТИНКИZ1 | 2 | 0 (запрограммировано) | 0 (запрограммировано) |
БОТИНКИZ0 | 1 | 0 (запрограммировано) | 1 (не запрограммировано) |
ЗАДНИЙ | 0 | 1 (не запрограммировано) | 0 (запрограммировано)) |
Параметр байта расширенного предохранителя установлен на 0XFD, в двоичном виде это 0B11111101.
Расширенный байт предохранителя в двоичном формате:
Байт расширенного предохранителя | № бита | Значение по умолчанию в АРН | Значение по умолчанию для Arduino |
– | 7 | 1 | 1 |
– | 6 | 1 | 1 |
– | 5 | 1 | 1 |
– | 4 | 1 | 1 |
– | 3 | 1 | 1 |
BODLEVEL2 | 2 | 1 (не запрограммировано) | 1 (не запрограммировано) |
BODLEVEL1 | 1 | 1 (не запрограммировано) | 0 (запрограммировано) |
BODLEVEL0 | 0 | 1 (не запрограммировано) | 1 (не запрограммировано) |
На этом заканчивается этот раздел.На данный момент мы многое узнали о микроконтроллере AVR и его предохранителях. Итак, давайте завершим эту статью, проверив нашу теорию, изменив и экспериментируя с некоторыми предохранителями в Arduino Nano.
Компоненты, необходимые для проверки предохранителей в АРНМы много говорили о предохранителях в приведенной выше части. Но чтобы продолжить работу над этой статьей, нам понадобятся некоторые аппаратные компоненты и некоторые программные инструменты. В этом разделе мы поговорим о них.Список необходимых компонентов с изображениями приведен ниже.
- Макетная плата – 1
- Ардуино Нано – 1
- Программатор USBasp AVR – 1
- Кабель USB – 1
- Преобразователь 10-контактного в 6-контактный AVR – 1
- Avrdude (Программный инструмент для программирования AVR)
- светодиод – 1
- Резистор 330R – 1
- Кабельные перемычки
Настройка тестирования оборудования показана ниже в этой настройке.Мы подключили Arduino Nano к ПК с помощью USB-кабеля, а также подключили к ПК программатор USBasp. Цель этой статьи – запрограммировать предохранители в AVR. По этой причине мы подключили программатор USBasp к Arduino. Изображение ниже даст вам лучшее представление о настройке.
Проверка предохранителей в АРНСхема тестирования показана ниже. Как видите, мы подключили Arduino и программатор USBasp к USB моего ноутбука.
Теперь давайте откроем IDE Arduino и загрузим базовый скетч мерцания. Содержание базового скетча мигания не требует пояснений, поэтому я не стал вдаваться в подробности о нем.
На видео вы увидите, что светодиод на контакте № 13 мигает должным образом. Теперь давайте настроим настройки предохранителя и установим для него значения по умолчанию. И как мы ранее видели в таблице данных; EFUSE – 0XFF; HFUSE – D9; LFUSE: 62. Теперь давайте настроим его с помощью Avrdude, запрограммируем и посмотрим, что произойдет.Код, который мы будем использовать, –
.avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Как только я это сделаю, вы увидите, что светодиод будет мигать очень медленно, потому что мы рассчитали и запрограммировали значение для тактовой частоты 16 МГц, и теперь, после сжигания предохранителей, это только внутренний RC-генератор на 1 МГц. Вот почему светодиод так медленно мигает. Теперь попробуем еще раз загрузить скетч. Мы увидим, что Arduino выдает ошибку и код не загружается.Потому что, изменив предохранители, мы также испортили настройки загрузчика. Вы можете видеть это на изображении ниже.
Чтобы исправить это и вернуть Arduino в прежнее состояние, нам нужно просто снова записать загрузчик для Arduino. Для этого перейдите в Инструменты -> Программист – USBasp , и как только мы это сделаем, мы снова сможем перейти к инструментам и нажать на опцию записи загрузчика. Это снова сожжет стандартный загрузчик на вашем Arduino, и все вернется к прежнему состоянию.
После того, как загрузчик был прошит обратно в Arduino, он вернулся в исходное состояние, и на последнем изображении отображается мигающий светодиод после того, как загрузчик снова был записан.
И на этом статья заканчивается. Надеюсь, вам понравилась статья и вы узнали что-то новое. Если у вас есть какие-либо вопросы по статье, не стесняйтесь оставлять комментарии ниже.
avrdude – Невозможно программировать Arduino 328P после первого использования ICSP Sparkfun AVR Pocket Programmer
Надеюсь, проблема в ваших подключениях.Проверьте свои соединения, и если проблема не в них, у вас есть над чем поработать:
После того, как я посмотрел на ваши предохранители, я поискал несколько вещей и увидел вот это. Значения предохранителей по умолчанию:
- Низкий предохранитель 0xFF
- Высокий предохранитель 0xDE
- Расширенный предохранитель 0x05
Вы перепутали предохранители выше. Я использовал AtmelStudio, чтобы проверить, что будут делать ваши предохранители:
avrdude -c usbtiny -p atmega328p -U lfuse: w: 0xff: m -U hfuse: w: 0x05: m -U efuse: w: 0xfc: m
Это изменит значение RSTDISBL
и включит RSTDISBL.Согласно даташиту, это даст
Установка предохранителя отключения сброса приведет к прекращению работы программирования JTAG и ISP. Может быть сброшено только с помощью программирование высокого напряжения
Таким образом вы заблокируете свой чип. Теперь вы хотите отменить это. Единственный способ сделать это дешево, не покупая модный STK500, – это купить новый Atmega328p или использовать другой Arduino Uno, чтобы использовать высоковольтное программирование, чтобы полностью стереть ваш блокированный.
Чтобы сделать это, следуйте этому руководству, чтобы стереть свой чип.В этом руководстве используется перфокарта, но вы можете сделать то же самое на макетной плате.
Теперь, когда вы удалите блокировку Arduino, вы должны установить правильные предохранители.
По умолчанию:
- Низкий предохранитель 0xFF
- Высокий предохранитель 0xDE
- Расширенный предохранитель 0x05
Теперь вы хотите изменить напряжение пониженного напряжения на 4,3 В
верно? Используя AtmelStudio, я снова придумал следующие предохранители:
- Низкий предохранитель 0xFF
- Высокий предохранитель 0xDE
- Расширенный предохранитель 0x04
После того, как вы запрограммируете это, у вас должен быть рабочий Arduino!
Если вам нужно запрограммировать Arduino с помощью программного обеспечения Arduino через USB, а не с помощью программатора AVR, вам придется запрограммировать загрузчик.Ответьте, если вам нужна помощь. Тем не менее, если с этого момента вы всегда будете использовать программатор AVR, загрузчик может не понадобиться.
Это решит вашу проблему и исправит ваше пониженное напряжение!
Всегда трижды проверяйте предохранители, используя что-нибудь вроде AtmelStudio, потому что вы можете в конечном итоге проделать много дополнительной работы, как в этом случае.
Вычислитель предохранителейAtmega328p. Atmega328p внутренний генератор
Вычислитель предохранителей Atmega328p
Свяжитесь с нами по электронной почте.В этом руководстве мы настроим микроконтроллер ATmegaP для работы с внешним кварцевым кристаллом, работающим при. Убедитесь, что внешний кристалл подключен к вашему микроконтроллеру, прежде чем пытаться это сделать. Мы не рассматриваем платформу Arduino непосредственно в этой статье. ATmegaP можно синхронизировать с помощью 6 опций, как показано ниже. Нас интересуют только следующие варианты синхронизации. По умолчанию. Таким образом, эффективная тактовая частота составляет 1 МГц. ATmega имеет три 8-битных байта предохранителя. Остальные значения можно найти в таблице времени запуска Crystal.Таким образом, значение байта младшего предохранителя равно 0xFF. Здесь мы используем USBasp, поэтому команда программирования выглядит следующим образом. После нажатия на «Программирование устройства» вы увидите окно, показанное ниже. Выберите интерфейс как ISP. В окне также отображается напряжение микроконтроллера, подключенного к отладочной плате. Обратите внимание, что программирование не произойдет, если напряжение, считываемое IDE, будет низким, например, для 1. Чтобы получить желаемые настройки предохранителя. Мы снимем отметку с НИЗКОГО. Флажок CKDIV8. После того, как вы внесете указанные выше изменения, ваше окно настроек будет выглядеть примерно так, как показано на рисунке ниже.Мы внесли изменения только в LOW. Нажмите кнопку программирования, чтобы настроить предохранители.
Atmega328p лист данных
Страницы: [1] 2 Наконец-то я получил девственный ATMegap, и, не загружая загрузчик, я загрузил простую версию Blink и думал, что он сломался, пока не понял, что из-за того, что я не установил предохранители, MCU просто использовал внутренние часы и работал на частоте 1 МГц вместо 16 МГц. Я включил кристалл на свою плату. Но я не могу найти, какими должны быть байты – может кто-нибудь сказать мне, пожалуйста, я отказался от попыток прочитать их из моего Uno И, конечно же, если предохранители должны быть другими для ATMegap без загрузчика с тактовой частотой 16 МГц, чем мой Уно, не могли бы я получить их вместо Саймона.У меня была точно такая же проблема, когда я программировал свой первый! PS – Если вам просто нужны те же, что и в стандартном Arduino, вы можете найти их на платах. Формальная проверка критически важного для безопасности программного обеспечения, разработка программного обеспечения, а также электронное проектирование и создание прототипов. Пожалуйста, не просите бесплатную помощь через личку, используйте форум. Код: [Выбрать]. Привет, эти настройки сделали это и для меня. Вы слышали фразу «на день позже и на доллар меньше» в zeroland? Что было добавлено этим сообщением в устаревшую ветку, чего еще не было сказано в самом первом ответе? Цитата: dc42 6 сентября, pm.Когда я использую Arduino IDE для прошивки загрузчика, он всегда устанавливает правильные предохранители без какого-либо взаимодействия от моего имени. Теперь с неограниченными размерами досок Eagle! Я проделал то же самое – записал загрузчик Uno для установки предохранителей. Затем загрузите мой скетч через File: Upload using programmer. Цитата: clivemist от 29 октября, PM. Цитата: dc42 от 30 октября, утра. Так задерживают ли вызовы в загружаемых вами скетчах на нужное время или нет? Цитата: dc42 от 6 ноября, утра. Цитата: clivemist от 06 ноября, утра.
Внутренний генератор Atmega328p
Предохранители – чрезвычайно важная часть программирования микросхемы, но их редко объясняют подробно. Вам нужно установить их только один раз, но если вы не сделаете это правильно, это катастрофа! Вы знаете о флэш-памяти, eeprom и RAM как о частях чипа. Я не упомянул, что есть также 3 байта постоянного за постоянным, я имею в виду, что они остаются после отключения питания, но вы можете менять их столько раз, сколько хотите, хранилище, называемое предохранителями. Предохранители определяют, как будет работать чип, есть ли у него загрузчик, с какой скоростью и напряжением он любит работать и т. Д.Обратите внимание, что, несмотря на то, что они называются «предохранителями», они могут быть повторно настроены и не имеют ничего общего с защитой от перегрузки, как предохранители в доме. Предохранители задокументированы в таблицах данных, но лучший способ проверить предохранители – это посмотреть на калькулятор предохранителей, такой как вычислитель предохранителей avr из проекта palmavr. Щелкните эту ссылку в новом окне и выберите ATtiny для расчета предохранителей. Первый вариант – как работает микросхема. Каждый процессор использует часы. Часы отслеживают время для чипа, как правило, одна инструкция кода сборки запускается за каждый тактовый цикл.Тот, что находится на вашем ПК, имеет тактовую частоту 1 ГГц или выше. Этот маленький чип работает намного медленнее. Если вы посмотрите на меню, вы увидите огромный список опций, но если внимательно присмотритесь, то увидите две группы: Источник часов и Запуск часов. Это довольно редко, если у вас нет микросхемы, генерирующей часы. Не используйте это, если вы не уверены, что вы имеете в виду, что Internal Clock означает, что внутри микросхемы есть небольшой осциллятор, он не очень точен, но подходит для большинства проектов, в которых нет проблем с точной синхронизацией.Часы меняются в зависимости от температуры и напряжения источника питания. Тактовая частота кГц предназначена для приложений с очень низким энергопотреблением, когда очень медленная работа микросхемы помогает экономить энергию. Наличие внутреннего генератора означает, что нам не нужно подключать кристалл, и мы можем использовать контакты часов для наших собственных гнусных целей. Внешний кристалл Если вам нужна особая тактовая частота, например 3. Кристаллы выглядят примерно так: Керамические генераторы выглядят так:. Кристаллы бывают разных упаковок, они могут быть цилиндрическими или больше, чем показано на изображении.В обоих случаях скорость указывается сверху или сбоку, почти всегда в МГц. Время запуска – это время, в течение которого источник часов должен успокоиться с момента первого включения питания. Следующая опция – Clock Out на PortD2, что, по сути, означает, что независимо от того, какой входной тактовый сигнал является внутренним, внешним, кварцевым и т. Д., Прямоугольная волна той же частоты появится на выводе D2.Предохранители Arduino uno
Это калькулятор предохранителей AVR на основе JavaScript. У вас должен быть включен javascript, чтобы использовать это.Есть много мест с замещающим текстом при наведении указателя мыши, которые могут помочь. Вы можете выбрать микросхему AVR в раскрывающемся меню вверху страницы. Если микросхема помечена как «подобная», это означает, что микросхема имеет такие же предохранители и предустановленные наборы, что и текущая выбранная микросхема. Когда вы выбираете другую микросхему, настройки предохранителя из текущей микросхемы будут применены к новой микросхеме, даже если микросхемы не похожи. Пресеты – это известные определенные настройки, доступные для выбранного вами чипа AVR. Изменение предустановки автоматически применяет изменения к битам предохранителя.Ручное управление битами предохранителя также заставит калькулятор найти предустановку, которая соответствует настройке бит предохранителя. Некоторые биты, которые не определены, не могут быть проверены как правильные, но, поскольку они не определены, это обычно не проблема. Убедитесь, что вы не испортили свой чип, отключив функции программирования или полностью заблокировав чип. Не гарантируется, что информация, представленная калькулятором, будет верной, и мы не несем ответственности за правильность любой представленной информации.Пожалуйста, используйте этот инструмент на свой страх и риск. Пожалуйста, отправляйте любые отчеты об ошибках или комментарии к этому сообщению в блоге. Авторские права Фрэнк Чжао. Crystal Osc. RC Osc. Ваш javascript отключен, этот калькулятор работать не будет. Если микросхема помечена как «подобная», это означает, что микросхема имеет такие же предохранители и предустановленные наборы, что и текущая выбранная микросхема. Когда вы выбираете другую микросхему, настройки предохранителей из текущей микросхемы будут применены к новой микросхеме, даже если микросхемы не похоже. Пожалуйста, отправляйте любые отчеты об ошибках или комментарии к этому сообщению в блоге. Авторские права Франк Чжао.Режим 1: не включены функции блокировки памяти. Режим 2: Дальнейшее программирование отключено. Режим 3: Дальнейшее программирование и проверка отключены. Неопределенная предустановка 1: 0x01 0b Бит 7. Бит 6. Бит 5. Бит 4. Бит 3. Бит 2. Бит 1. Бит 0.
Сброс предохранителей atmega328p
Это калькулятор предохранителей AVR на основе JavaScript. У вас должен быть включен javascript, чтобы использовать это. Есть много мест с замещающим текстом при наведении указателя мыши, которые могут помочь. Вы можете выбрать микросхему AVR в раскрывающемся меню вверху страницы. Если микросхема помечена как «подобная», это означает, что микросхема имеет такие же предохранители и предустановленные наборы, что и текущая выбранная микросхема.Когда вы выбираете другую микросхему, настройки предохранителя из текущей микросхемы будут применены к новой микросхеме, даже если микросхемы не похожи. Пресеты – это известные определенные настройки, доступные для выбранного вами чипа AVR. Изменение предустановки автоматически применяет изменения к битам предохранителя. Ручное управление битами предохранителя также заставит калькулятор найти предустановку, которая соответствует настройке бит предохранителя. Некоторые биты, которые не определены, не могут быть проверены как правильные, но, поскольку они не определены, это обычно не проблема.Убедитесь, что вы не испортили свой чип, отключив функции программирования или полностью заблокировав чип. Не гарантируется, что информация, представленная калькулятором, будет верной, и мы не несем ответственности за правильность любой представленной информации. Пожалуйста, используйте этот инструмент на свой страх и риск. Пожалуйста, отправляйте любые отчеты об ошибках или комментарии к этому сообщению в блоге. Авторские права Фрэнк Чжао. Ваш javascript отключен, этот калькулятор работать не будет. Если микросхема помечена как «подобная», это означает, что микросхема имеет такие же предохранители и предустановленные наборы, что и текущая выбранная микросхема. Когда вы выбираете другую микросхему, настройки предохранителей из текущей микросхемы будут применены к новой микросхеме, даже если микросхемы не похоже.Пожалуйста, отправляйте любые отчеты об ошибках или комментарии к этому сообщению в блоге. Авторские права Франк Чжао.Распиновка Atmega328p
В этом проекте представлены плавкие вставки ATmegaP и показано, как настроить их на использование внешнего кварцевого генератора 16 МГц. Эта статья объяснит, что это за операции в ATmegaP и как их настроить в целом. Принципиальная схема, полный список деталей и детали конструкции приведены в предыдущей статье. Как видите, весь байт расширенного предохранителя имеет дело с уровнем обнаружения сбоев.В случае ATmegaP, одно из трех различных напряжений номинально 1. Возможно, самая важная вещь, на которую следует обратить внимание из таблицы, – это то, что программирование бита предохранителя заключается в установке его низкого уровня, т.е. Например, обратите внимание, что каждый бит незапрограммирован, когда он установлен на высокий логический уровень, т.е. Этот несколько необычный метод применяется ко всем битам во всех байтах предохранителей в ATmegaP. Биты используются для установки размера загрузки для ATmegaP; Размер загрузки относится к объему памяти, зарезервированной для установки «Загрузчика», аналогичного по функциям загрузчику, используемому в линейке плат разработки Arduino.Назначение остальных битов в старшем байте предохранителя достаточно понятно из записей таблицы. Однако общий процесс программирования всех предохранителей аналогичен. Этот младший байт предохранителя выбирает источник синхронизации для ATmegaP и управляет некоторыми деталями работы часов. Таблица из даташита воспроизводится ниже. Не забывайте, что программирование бита предохранителя заключается в его установке на низкий уровень, т.е. Теперь вы должны понимать, что младший байт предохранителя запрограммирован заранее, что в шестнадцатеричной системе счисления равно 0x62, и что это означает для работы микроконтроллера.Если какая-то часть этого неясна, не удивляйтесь; это сложный предмет. Возможно, вы также помните, что UNO имеет схему внешнего генератора, состоящую из кристалла с частотой 16 МГц и двух небольших керамических конденсаторов, часто около 22 пФ каждый. Можете ли вы определить его рабочую скорость по умолчанию при отгрузке с завода? Вы знаете, что тактовая частота по умолчанию ATmegaP – это внутренний RC-генератор, но помните ли вы его скорость? Ответ находится в примечании 2 к таблице 8 МГц. Таким образом, рабочая скорость ATmegaP по умолчанию равна. Но предположим, что ваш проект требует для ATmegaP тактовой частоты 16 МГц; вы бы знали, как этого добиться? Как обычно, здесь задействовано как аппаратное, так и программное обеспечение.Чтобы запустить ATmegaP на частоте 16 МГц, вам необходимо добавить внешний кварцевый генератор в схему, показанную в самом начале этой статьи. Требуются только три новых детали: кристалл Jameco на 16 МГц и два керамических конденсатора Jameco 22 пФ. Результирующая принципиальная схема воспроизводится непосредственно ниже, а фотография макетной схемы – чуть ниже схемы. Не меняйте источник тактовых импульсов на внешний кристалл, если он на самом деле не установлен. Если вы это сделаете, для ATmegaP не будет часов, и, следовательно, не будет возможности его перепрограммировать.В таблице указано, что для работы с 8. Продолжайте читать. Таким образом, бит 7 равен 1, бит 6 равен 1, бит 5 равен 1, бит 4 равен 1, биты наконец-то достигли цели! Avrdude – это утилита, управляемая из командной строки, которая более подробно описывается в этой статье. Номера строк были добавлены к фрагменту экрана, чтобы упростить обращение к определенным частям сеанса программирования. Строка 5 показывает, что активный каталог изменен на место, где был установлен avrdude.Кристаллический конденсатор Atmega328p
Частью программирования автономных микросхем ATmega является установка байтов предохранителя, это специальные настройки, которые можно использовать для изменения работы микросхем ATmega.В Интернете есть много статей, но я не смог найти ни одного источника, который бы собрал всю информацию и полностью объяснил, что на самом деле делают предохранители. Важно помнить, что некоторые предохранители могут использоваться для блокировки определенных аспектов микросхемы и потенциально могут сделать ее непригодной для использования. Однако, проявив некоторую осторожность, довольно просто понять и использовать настройки предохранителя. Отказ от ответственности, я относительно новичок в программировании предохранителей, и это заметки, которые я написал, чтобы помочь мне запомнить вещи.Также есть четвертый байт, который используется для программирования битов блокировки. Биты блокировки в этой статье не рассматриваются. Каждый байт составляет 8 бит, и каждый бит представляет собой отдельную настройку или флаг. При программировании предохранителей вы можете использовать двоичное представление или, чаще, шестнадцатеричное представление. Для 8 бит 1 байт мы можем использовать B или 0xFF. Оба имеют одинаковую ценность. Предохранитель младшего байта определяет источник синхронизации, скорость работы микросхемы и время ожидания при запуске. Микросхемы ATmega могут работать на разных скоростях или частотах, а частота определяется используемым источником тактовой частоты.Arduinos обычно использует внешний кристалл с частотой 16 МГц. Распространенной ошибкой является то, что кристалл правильно подключен в схему, но забывают указать микросхеме, чтобы он его использовал. Arduinos обычно используют кварцевый генератор малой мощности. Опция внешних часов позволяет микросхеме использовать внешний тактовый сигнал прямоугольной формы. Это используется, когда у вас есть схема с собственными часами, с которыми вы хотите синхронизировать ATmega, или если вы хотите использовать отдельную микросхему часов. Кристаллы и генераторы требуют достаточного напряжения для правильной работы.Когда вы запускаете микросхему ATmega, может потребоваться некоторое время, чтобы напряжение достигло максимального значения. Пока напряжение растет, источник тактовых импульсов может не работать с правильной скоростью или частотой. Чтобы часы могли стабилизироваться, можно установить задержку запуска. Новые микросхемы поставляются с этим набором в качестве источника синхронизации и активным предохранителем CKDIV8, что дает 1. Время запуска установлено на максимальное значение, а период тайм-аута включен. Этот параметр используется для того, чтобы все пользователи могли выполнить желаемую настройку источника синхронизации с помощью любого доступного интерфейса программирования.CKDIV8 следует использовать, если выбранный источник синхронизации имеет более высокую частоту, чем максимальная частота микросхемы ATmega. Микросхемы ATmega можно использовать при очень низких напряжениях, однако, чем ниже напряжение, тем медленнее им нужно работать. Тактовый сигнал может быть направлен на PB0.
Частота генератора Atmega328p
Плата Arduino, такая как Uno, может быть программатором для автономного чипа ATmega. Для ATmegaP, который используется в Uno, на домашней странице arduino есть руководство. Это позволяет записать загрузчик в чип без необходимости в другом оборудовании.В этом посте показано, как использовать одну и ту же конфигурацию для чтения и записи предохранителей на микросхеме. Моя настройка такая же, как в учебнике. Записать загрузчик легко, если все сделано в точности так, как описано в руководстве. Таким образом, должна быть возможность не только записать загрузчик, но и напрямую взаимодействовать с программируемым чипом. Я хотел прочитать и записать предохранители микросхемы. Программное обеспечение, которое делает это возможным, – avrdude. Когда у вас установлена IDE Arduino, в вашей системе также есть avrdude.Мне потребовалось некоторое время, чтобы найти правильные аргументы для его запуска, и это основная причина, по которой я пишу этот пост. Мой компьютер работает с Debian Wheezy, поэтому инструкции проверены на Debian. Если у вас другая ОС, вам нужно изменить имя вашего виртуального последовательного соединения. Для выполнения следующих задач вам необходимо иметь скетч ArduinoISP из примеров, загруженных на вашу плату Arduino. Вы можете узнать это, когда у вас будет запущена IDE Arduino. Это порт, который подключается к вашему Arduino, который является программатором для вашего чипа.В моей системе он работает с avrisp. В конце этого отчета отображается подпись устройства и настройки предохранителей: lfuse – предохранитель младшего байта, hfuse – предохранитель старшего байта, а efuse – предохранитель расширенного байта. По подписи вы можете проверить, какой контроллер у вас на самом деле. Предохранители подробно описаны в техническом описании ATmegaP. Также есть полезный онлайн-инструмент. В нижней части страницы вы можете ввести настройки, которые вам дал avrdude. Тогда вы видите выше объяснения.Вы можете изменить настройки, а затем получить значения предохранителей, а также аргументы для avrdude. В качестве примера мы хотим изменить настройки обнаружения пониженного энергопотребления. Они контролируются тремя младшими битами расширенного предохранителя, битами от 0 до 2. Avrdude считывает и записывает их как логический 0. Когда мы устанавливаем уровень обнаружения пониженного напряжения на 1. Теперь инструкция для avrdude следующая: При неправильных настройках вы легко можете вывести свой чип из строя. Спасибо за это. Детали важны. 50. Arduino для производства! AVR – сведения о битах предохранителейКак использовать предохранители AVR
Надежный технический паспорт ATmega328 мало что говорит нам о том, что такое байты предохранителей, поэтому давайте начнем с объяснения непрофессионала.ATmega328 имеет ряд настроек, которые разработчики изначально хотели отделить от кода, выполняемого на микроконтроллере. Эти настройки содержатся в трех байтах предохранителя: High, Low и Extended, и предназначены для настройки с помощью внешнего программатора. Теперь есть способы изменить их с помощью кода (спасибо GCC), но нет смысла изменять некоторые настройки с помощью кода.
Какие настройки контролируют байты предохранителя?
В трех таблицах ниже представлены биты предохранителей для ATmega328P.Просмотрите их, прежде чем продолжить.
Байт расширенного предохранителя:
Имя бита | Бит Нет | Описание | По умолчанию |
---|---|---|---|
– | 7 | – | 1 |
– | 6 | – | 1 |
– | 5 | – | 1 |
– | 4 | – | 1 |
– | 3 | – | 1 |
BODLEVEL2 | 2 | Уровень срабатывания обнаружения пониженного напряжения | 1 (незапрограммировано) |
BODLEVEL1 | 1 | Уровень срабатывания обнаружения пониженного напряжения | 1 (незапрограммировано) |
BODLEVEL0 | 0 | Уровень срабатывания обнаружения пониженного напряжения | 1 (незапрограммировано) |
Байт старшего предохранителя:
Имя бита | Бит Нет | Описание | По умолчанию |
---|---|---|---|
RSTDISBL | 7 | Отключение внешнего сброса | 1 (незапрограммировано) |
DWEN | 6 | debugWIRE Включить | 1 (незапрограммировано) |
SPIEN | 5 | Включить последовательную программу и загрузку данных | 0 (запрограммировано) |
WDTON | 4 | Сторожевой таймер всегда включен | 1 (незапрограммировано) |
EESAVE | 3 | EEPROM сохраняется с помощью Chip Erase | 1 (незапрограммировано) |
БОТИНКИZ1 | 2 | Выберите размер загрузки | 0 (запрограммировано) |
БОТИНКИZ0 | 1 | Выберите размер загрузки | 0 (запрограммировано) |
БУТЕРСТ | 0 | Выбрать вектор сброса | 1 (незапрограммировано) |
Байт младшего предохранителя:
Имя бита | Бит Нет | Описание | По умолчанию |
---|---|---|---|
CKDIV8 | 7 | Разделить часы на 8 | 0 (запрограммировано) |
CKOUT | 6 | Тактовый выход | 1 (незапрограммировано) |
SUT1 | 5 | Выберите время запуска | 1 (незапрограммировано) |
SUT0 | 4 | Выберите время запуска | 0 (запрограммировано) |
CKSEL3 | 3 | Выбрать источник синхронизации | 0 (запрограммировано) |
CKSEL2 | 2 | Выбрать источник синхронизации | 0 (запрограммировано) |
CKSEL1 | 1 | Выбрать источник синхронизации | 1 (незапрограммировано) |
CKSEL0 | 0 | Выбрать источник синхронизации | 0 (запрограммировано) |
Теперь, когда вы изучили эти таблицы, чувствуете ли вы себя полностью комфортно с предохранителями и готовы ли вы закончить этот пост? Маловероятно, если вы хоть немного похожи на меня! Даже обращение к техническому паспорту заставило меня листать туда-сюда, пытаясь понять, что, черт возьми, означают все эти предохранители.Поработав со всеми описаниями, таблицами и перекрестными ссылками, я наконец понял, что единственный байт предохранителя, о котором мне действительно нужно беспокоиться (по крайней мере, для моих приложений), это младший байт предохранителя – он контролирует тактовую частоту и источник тактовой частоты микроконтроллер.
Следует иметь в виду, что значение «1» не означает, что функция включена, а «0» не означает, что она отключена. Вот что означают аннотации «запрограммировано» и «незапрограммировано» в таблице выше.
Расширенные и старшие байты предохранителей
Байт расширенного предохранителя управляет уровнем напряжения, при котором запускается сброс обнаружения пониженного напряжения (BOD). Функция обнаружения пониженного напряжения контролирует уровни входного напряжения (VCC) микроконтроллера и переходит в состояние сброса, если они опускаются ниже определенного уровня.
Старший байт предохранителя содержит настройки, относящиеся к программированию и отладке вашего проекта. Это более сложные темы, которые бесполезны для любителей или энтузиастов, если только вы не собираетесь заниматься такими вещами, как написание загрузчиков или программистов.Биты SPIEN end DWEN часто используются программистами и отладчиками – их изменение самостоятельно может сделать ваш чип непрограммируемым. В случае сомнений убедитесь, что для SPIEN установлено значение «0», поскольку это позволяет вам программировать микросхему с помощью программатора SPI. Единственный бит, который вы можете использовать, – это бит WDTON , который определяет, включен ли сторожевой таймер постоянно или нет (хотя его можно переопределить программно).
Младший байт предохранителя
Несмотря на то, что описания младшего байта предохранителя не требуют пояснений, они не дают большой информации о том, какие значения следует программировать в отдельные биты.Здесь в игру вступает калькулятор предохранителей, и я полагаюсь на него исключительно (лист данных не так прост в использовании). Мне очень нравится вариант от Engbedded: вы выбираете функциональность, которую хотите установить, и внизу отображается значение предохранителя. Вот некоторые подробности об отдельных битах:
CKDIV8: установка этого параметра на «0» делит тактовую частоту на 8, что фактически приводит к тому, что микроконтроллер работает в 8 раз медленнее, чем внутренний или внешний источник тактовой частоты, используемый MCU.
CKOUT: установка этого параметра на «0» приводит к тому, что тактовые импульсы выводятся на выводе PB0.
SUT1 – 0: определяют время запуска микроконтроллера после подачи питания. Я бы оставил это значение на самое долгое время (это дает всем вашим периферийным устройствам время на разогрев перед запуском MCU), если у вас нет особых требований для максимально быстрого запуска. Самая длинная настройка заканчивается на «+65 мс».
CKSEL3 – 0: они управляют тем, от какого источника тактовой частоты работает MCU – и существует множество вариантов выбора.Ключевые из них:
- “Внутр. RC Osc. 8MHz », который запускает MCU от его внутреннего генератора 8MHz
- «Ext Crystal Osc .: Frequency 8.0- MHz», который использует внешний кристалл, работающий на частоте более 8 МГц – вы можете использовать это, например, если вы подключили внешний кристалл с частотой 16 МГц.
- «Ext Crystal Osc .: Frequency 3.0-8.0 MHz», который использует внешний кварцевый резонатор от 3 до 8 МГц
Да, мы знаем, что означают биты и как решить, с какими значениями они должны быть запрограммированы – но как мы на самом деле запрограммируем предохранители?
Я использую Atmel Studio для всех своих проектов и два типа программатора / отладчика – USBTiny и Atmel ICE.Atmel ICE изначально поддерживается Atmel Studio, поэтому я могу использовать функциональные возможности Atmel Studio для программирования предохранителей. USBTiny не поддерживается Atmel Studio, поэтому мне нужно полагаться на AVRDude для программирования предохранителей. Если вы используете другую среду IDE, то AVRDude, вероятно, станет для вас лучшим выбором.
Программирование из Atmel Studio
Использовать Atmel Studio очень просто. В меню Tools выберите Device Programming . Щелкните вкладку Fuses и введите значения предохранителей в открывшемся диалоговом окне. Обычно я ввожу значения из калькулятора предохранителей, а не использую флажки и раскрывающиеся списки, поскольку калькулятор предохранителей для меня менее загадочен.
Установка предохранителей в Atmel Studio
Затем щелкните Программа , и готово!
Программирование с помощью AVRDude
Предполагая, что вы уже загрузили AVRDude, выполните следующие 3 шага, чтобы запрограммировать предохранители:
- Откройте командную строку и перейдите в папку, в которой AVRDude.exe хранится в
- Введите следующее, чтобы прочитать настройки предохранителя:
avrdude –c [programmer] -p [MCU] -U lfuse: r: -: h
- Введите следующее, чтобы запрограммировать предохранитель:
avrdude –c [programmer] -p [MCU] -v -U lfuse: w: 0xFF: m
Где:
- [программист] – это код AVRDude для конкретного программатора, который вы используете (например,usbtiny для USBTinyISP) – обратитесь к файлу avrdude.conf для получения списка этих
- [MCU] – это код AVRDude для конкретного программируемого MCU (например, m328p для ATmega328P)
- lfuse – это программируемый предохранитель – используйте lfuse, hfuse или efuse в зависимости от ситуации
- 0xFF – номинал устанавливаемого предохранителя – при необходимости измените его
Итак, чтобы запрограммировать младший байт предохранителя на ATmega328P, используя программатор USBTiny, со значением 0xFF вы должны ввести:
avrdude -c usbtiny -p m328p -v -U lfuse: w: 0xFF: m
Что ж, еще не совсем – но, надеюсь, это короткое обсуждение помогло вам разобраться с одним из самых страшных аспектов работы с байтами предохранителя AVR.Есть еще несколько ошибок, которые ждут вас, и некоторые тонкости AVRDude, которые вам, возможно, придется использовать (документация здесь), но большую часть пути вы определенно достигнете.
Если вы нашли этот пост полезным и хотите больше отличного бесплатного контента, зарегистрируйтесь ниже, и я позабочусь о том, чтобы в первую очередь отправлять будущие посты вам!
Выходите за рамки Arduino
Я только что завершил свое новое руководство Arduino to AVR: начало работы за 3 шага .
Получите на Payhip всего за 1 доллар.65.
Испытайте себя и узнайте, как получить гибкость и дополнительный контроль, которые предлагает микроконтроллер AVR.
В качестве бесплатного бонуса получите шпаргалку с распиновкой ATmega328P.
Настройки предохранителя Arduino / ATmega 328P
Частью программирования автономных микросхем ATmega является установка байтов предохранителя, это специальные настройки, которые можно использовать для изменения работы микросхем ATmega.
Вот некоторые вещи, которые можно сделать, изменив номинал предохранителей:
- выбрать разные источники тактовой частоты и изменить скорость работы микросхемы,
- устанавливает минимальное напряжение, необходимое для работы микросхемы.
- устанавливает, используется ли загрузчик,
- устанавливает, сколько памяти выделяется загрузчику,
- отключить сброс.
- отключить последовательное программирование
- остановить стирание данных eeprom при загрузке нового скетча.
В Интернете есть много статей, но я не смог найти ни одного источника, который бы собрал всю информацию и полностью объяснил, что на самом деле делают предохранители.
Важно помнить, что некоторые предохранители могут использоваться для блокировки определенных аспектов микросхемы и потенциально могут заблокировать ее (сделать ее непригодной для использования).Однако, проявив некоторую осторожность, довольно просто понять и использовать настройки предохранителя.
Заявление об ограничении ответственности, я относительно новичок в программировании предохранителей, и это заметки, которые я написал, чтобы помочь мне запомнить вещи. Информация основана на техническом описании чипа ATmega, результатах поиска в Интернете и вопросах, которые я задавал на форумах (особенно на форуме Arduino).
Всего 3 байта:
- предохранитель младшего байта,
- старший байт предохранитель,
- предохранитель удлиненный
Существует также четвертый байт, который используется для программирования битов блокировки.Биты блокировки в этой статье не рассматриваются.
Каждый байт составляет 8 бит, и каждый бит представляет собой отдельную настройку или флаг. Когда мы говорим о настройке / не настройке, запрограммированных / не запрограммированных предохранителях, мы фактически используем двоичные. 1 означает, что не установлен / не запрограммирован, а 0 (ноль) означает, что установлен / запрограммирован.
При программировании предохранителей вы можете использовать двоичное представление или, чаще, шестнадцатеричное представление. Для 8 бит (1 байт) мы можем использовать B11111111 или 0xFF. Оба имеют одинаковую ценность.
Примечание. Для всех предохранителей значение 1 означает, что они не установлены, а значение 0 (ноль) означает, что они установлены.
ATmega 328P 28 Схема PDIP
Младшие предохранители
Предохранитель младшего байта определяет источник синхронизации, скорость работы микросхемы и время ожидания при запуске.
Микросхемы ATmega могут работать на разных скоростях или частотах, и частота определяется используемым источником тактовой частоты. Источник синхронизации устанавливается с помощью предохранительных битов CKSEL.
CKSEL (источники тактовой частоты / выбор тактовой частоты)
Тактовый сигнал может поступать от внутреннего генератора, внешнего кварцевого резонатора / резонатора или внешнего сигнала.Arduinos обычно использует внешний кристалл с частотой 16 МГц.
Вот кристалл 16 МГц, используемый на макетной плате Arduino, подключенной к XTAL1 и XTAL2. Необходимо указать микросхеме ATmega использовать внешний кристалл, и это делается путем установки битов CKSEL. Распространенной ошибкой является то, что кристалл правильно подключен в схему, но забывают указать микросхеме, чтобы он его использовал.
Различные варианты для CKSEL:
Arduinos обычно использует кварцевый генератор малой мощности.
ATmega имеет 2 встроенных генератора, RC-генератор 128 кГц и откалиброванный RC-генератор.
Опция внешних часов позволяет микросхеме использовать внешний тактовый сигнал прямоугольной формы. Это используется, когда у вас есть схема с собственными часами, с которыми вы хотите синхронизировать ATmega, или если вы хотите использовать отдельную микросхему часов. Внешний тактовый сигнал должен быть подключен к контакту CLOCK-IN
Опции кварцевого генератора
CKSEL3 = 1 CKSEL2 = 1 CKSEL1 = 1 CKSEL0 = 1 выбирает кристалл в диапазоне от 8 МГц до 16 МГц и является нормальной настройкой для Arduinos.
Если вы хотите использовать более медленный кристалл, например 6 МГц, вы должны использовать CKSEL3 = 1 CKSEL2 = 1 CKSEL1 = 0 CKSEL0 = 1 (3.От 0 до 8,0).
Чтобы использовать внутренний RC-генератор на частоте 8 МГц, настройки: CKSEL3 = 0 CKSEL2 = 0 CKSEL1 = 1 CKSEL0 = 0
SUT1 / SUT0 (время запуска)
Кристаллам и генераторам требуется достаточное напряжение для правильной работы. Когда вы запускаете микросхему ATmega, может потребоваться некоторое время, чтобы напряжение достигло максимального значения. Пока напряжение растет, источник тактовых импульсов может не работать с правильной скоростью или частотой. Чтобы часы могли стабилизироваться, можно установить задержку запуска.
CKSEL0 используется вместе с SUT1 и SUT0 для установки времени задержки запуска.
BOD – это обнаружение перебоев в работе, которое обсуждается позже.
Arduino использует максимальную задержку запуска 14CK + 65 мс (CKSEL0 = 1, SUT1 = 1, SUT0 = 1), которые также являются настройками по умолчанию для новых чипов ATmega 328 / 328P.
CHDIV8 (разделение часов)
Микросхемы ATmega 328 / 328Pимеют встроенный RC-генератор с частотой 8,0 МГц. Новые микросхемы поставляются с этим набором в качестве источника тактовой частоты и активным предохранителем CKDIV8, что дает 1.Системные часы 0 МГц. Установлено максимальное время запуска и включен период ожидания. (CKSEL = «0010», SUT = «10», CKDIV8 = «0»). Этот параметр используется для того, чтобы все пользователи могли выполнить желаемую настройку источника синхронизации с помощью любого доступного интерфейса программирования.
CKDIV8 следует использовать, если выбранный источник синхронизации имеет более высокую частоту, чем максимальная частота микросхемы ATmega.
Микросхемы ATmega можно использовать при очень низких напряжениях, однако, чем ниже напряжение, тем медленнее им нужно работать.CHDIV8 можно использовать для установки низкой тактовой частоты в соответствии с низким напряжением.
CKOUT (Выходной сигнал)
Тактовый сигнал может быть направлен на PB0. Это полезно, если вам нужен тактовый сигнал для управления другими цепями. Это работает для всех источников синхронизации, и настройка по умолчанию для новых микросхем CKOUT = 1 (не установлена).
Старшие байтовые предохранители
Предохранитель старшего байта имеет несколько различных настроек. Обычно интерес представляют (по крайней мере, для меня, как любителя) сторожевой таймер, сохранение или стирание EEPROM и настройки атрибутов загрузчика.
RSTDISBL (блокировка внешнего сброса)
PC6 – это вывод сброса, удерживайте его на низком уровне (на массу), и микросхема сбросится. Так работает переключатель на Arduino. Когда вы нажимаете кнопку сброса, он подключает PC6 к земле и сбрасывает микросхему.
PC6 также может использоваться как обычный вывод IO, но это означает отключение функции сброса, что, в свою очередь, означает, что микросхема больше не может быть встроена в программирование (для линейного программирования требуется сброс). Это один из вариантов, который лучше не менять.
Я полагаю, что RSTDISBL реализован по соображениям безопасности, чтобы остановить перепрограммирование чипа или загрузку прошивки.
При программировании RSTDISBL время запуска (SUT1 SUT0) увеличивается до 14CK + 4,1 мс, чтобы обеспечить возможность входа в режим программирования.
По умолчанию значение RSTDISBL = 1 (не установлено).
DWEN (включение debugWIRE)
МикросхемыATmega имеют встроенные средства отладки, которые по умолчанию отключены. Предохранитель DWEN используется для их включения.
DWEN использует тот же контакт, что и сброс (PC6), и когда DWEN включен (и биты блокировки не установлены), контакт сброса становится контактом связи, и нормальный сброс больше не работает. Например, если вы включите DWEN на Arduino, кнопка сброса больше не будет работать.
Для использования встроенной отладки вам потребуется совместимый программатор, например AVR Dragon. Поскольку я никогда не пользовался AVR studio и у меня нет подходящего программатора, я никогда не использовал и не знаю, как использовать отладку. Если вы хотите узнать больше, есть хорошая статья на http: // www.hilltop-cottage.info/blogs/adam/debugging-arduino-using-debugwire-atmel-studio-and-an-avr-dragon/, чтобы вы начали.
Это один из предохранителей, о котором следует позаботиться. Если вы включите DWEN, а также включите биты блокировки, вы больше не сможете программировать чип обычным способом.
Если вы только начинаете, оставьте DWEN не заданным. В конце концов, сброс очень полезен.
SPIEN (включить последовательное программирование и загрузку данных)
МикросхемыATmega могут быть запрограммированы с использованием последовательного программирования.Последовательное программирование используется для программирования на борту с использованием последовательного протокола через ISP (встроенный последовательный программатор) или UART (универсальный асинхронный приемник / передатчик).
Обычный метод программирования микросхем ATmega – через интерфейс SPI с использованием контактов SCK (часы), MOSI (вход) и MISO (выход). Если вы отключите последовательное программирование, вы больше не сможете использовать SPI для программирования чипа. Вы также можете отключить последовательное программирование с помощью битов блокировки.
Для нормального использования и разработки оставьте SPIEN включенным, однако, если у вас есть окончательное устройство и дальнейшее программирование не требуется, вы можете использовать эту опцию, чтобы предотвратить доступ людей к чипу через последовательную связь.
По умолчанию SPIEN включен, SPIEN = 0.
Предохранители RSTDISBL, SPIEN и DWEN могут заблокировать микросхему ATmega или, по крайней мере, затруднить ее повторное использование. Для общего использования, особенно если вы только начинаете программировать автономные микросхемы, вам не следует изменять эти настройки предохранителей. Вам также следует дважды убедиться, что вы не меняете их, когда вы переписываете другие настройки предохранителя.
WDTON (сторожевой таймер всегда включен)
Сторожевой таймер – это, по сути, таймер, который вызывает сброс микросхемы, если он не получает сигнал ОК в определенное время.
Это может быть полезно, если у вас нестабильный код или система, которая не должна постоянно блокироваться.
Когда сторожевой таймер включен, в случае сбоя или зависания скетча таймер истечет по таймауту и сбросит чип, вызывая перезапуск, аналогичный нажатию кнопки сброса при работающем Arduino.
Сторожевой таймер можно активировать программно, поэтому настройки предохранителя не требуется. По умолчанию сторожевой таймер выключен, WDTON = 1.
На форуме Arduino по адресу ttp: // forum есть прекрасное мини-руководство по сторожевому таймеру от za_nic.arduino.cc/index.php/topic,63651.0.html
У Пола Мартинсена есть руководство по использованию сторожевого таймера для обнаружения зависаний на http://www.megunolink.com/how-to-detect-lockups-using- Ардуино-сторожевой таймер /
EESAVE (сохранить память EEPROM)
При программировании микросхемы ATmega память стирается непосредственно перед загрузкой нового кода. В нормальных условиях стирается память eeprom, а также память программ. Предохранитель EESAVE может использоваться, чтобы сказать микросхеме не стирать EEPROM.Это полезно, если вы хотите обновить код, но сохранить пользовательские настройки, хранящиеся в EEPROM.
Значение по умолчанию – EESAVE = 1, не установлено, и память EEPROM стирается во время цикла стирания чипа при программировании.
Я привык ставить этот предохранитель; EEPROM имеет ограниченный жизненный цикл, поэтому чем меньше вы напишете на него, тем лучше. Стирание eeprom не влияет на загрузку нового кода, и в большинстве моих проектов память eeprom не используется, поэтому не стереть ее.DropController хранит настройки и время сброса в eeprom, поэтому я установил EESAVE для сохранения данных при загрузке новых версий кода.
BOOTSZ1 & BOOTSZ0 (Размер загрузчика)
Микросхемы ATmega могут использовать загрузчик, это небольшая программа, которая запускается при первом запуске микросхемы или при ее сбросе. Загрузчики обычно используются для инициализации устройства и проверки внешней связи. Arduino использует загрузчик для связи с подключенным компьютером, чтобы узнать, есть ли новая программа для загрузки.Это причина, по которой Arduino сбрасывается, когда вы загружаете новый код, при сбросе запускается загрузчик, загрузчик проверяет, есть ли у вас новый код.
Загрузчик хранится в памяти программ, той же памяти, которая используется для пользовательского приложения, и, поскольку загрузчик может быть разного размера, вы можете указать микросхеме ATmega, сколько места следует зарезервировать. Обычный (старый) загрузчик Arduino имеет размер 2 килобайта (КБ), но более новый Optiboot (используемый в UNO) составляет всего 0,5 КБ (512 байтов). Если вы используете Optiboot и соответственно устанавливаете размер загрузчика, вы получаете дополнительно 1.5 КБ для вашей собственной программы. 1,5 КБ может быть много места, поэтому я начал программировать автономные микросхемы ATmega в первую очередь из-за нехватки места для программы. Код dropController стал слишком большим для обычного Arduino, поэтому я удалил загрузчик.
Загрузчик хранится в верхней части памяти программ
Если у вас есть загрузчик, то BOOTSZ необходимо использовать вместе с BOOTRST. BOOTRST сообщает микросхеме ATmega адрес памяти, с которой запускается загрузчик.Если BOOTRST не установлен, то пользовательское приложение может использовать всю память независимо от настроек BOOTSZ.
Конфигурация размера загрузки для 328 / 328P
Обратите внимание, что указанные выше размеры указаны в словах (слово – 2 байта), а 256 слов – это 512 байтов.
По умолчанию для новых чипов BOOTSZ1 = 0 BOOTSZ0 = 0, что означает, что у них 4 КБ зарезервировано для загрузчика.
BOOTRST Выбрать вектор сброса
МикросхемыATmega могут использовать загрузчик, это небольшая программа, которая запускается при перезагрузке микросхемы.Если у вас есть загрузчик, вам нужно сообщить MCU, и это делается с помощью настройки предохранителя BOOTRST. Когда установлен BOOTRST Fuse, при сбросе устройство перейдет к адресу загрузчика. Если не установлен, микросхема перейдет к стартовому адресу программы 0x0000.
Значение по умолчанию – BOOTRST = 1 (не задано).
Если BOOTRST не установлен (нет загрузчика), предохранители BOOTSZ игнорируются.
Удлиненные биты предохранителя
Расширенные предохранители используются только для установки уровня обнаружения обесточивания (BOD).
Чипы ATmega могут стать нестабильными или ненадежными при использовании с недостаточным напряжением. Например, 328 / 328P может безопасно работать на частоте 16 МГц, если он имеет как минимум 4 В. Все, что ниже 4 В, означает, что микросхема может неправильно себя вести. Это было бы проблемой, если бы устройство использовалось с датчиками для измерения или полагалось на точное время.
Для обеспечения достаточного входного напряжения микросхемы можно установить минимальный уровень напряжения. Если напряжение упадет ниже этого уровня, микросхема перезагрузится.Это называется уровнем детектора потемнения. Обычно, если подаваемое напряжение ниже BOD, микросхема сохраняет низкий уровень сброса.
Значения по умолчанию для новых микросхем: BODLEVEL2 = 1 (не установлено), BODLEVEL1 = 1 (не установлено), BODLEVEL0 = 1 (не установлено).
Настройки предохранителя по умолчанию
Новый чип ATmega 328P.
Новые микросхемы 328 / 328P обычно имеют следующие настройки предохранителей:
Низкий предохранитель = 0x62 (B01100010)
Высокий предохранитель = 0xD9 (B11011001)
Расширенный предохранитель = 0xFF (B11111111)
Arduino Duemilanove или Nano с настройками предохранителя по умолчанию для ATmega328
Предохранитель низкого уровня = 0xFF (B11111111)
Предохранитель высокого уровня = 0xDA (B11011110)
Расширенный предохранитель = 0x05 (B00000101)
Загрузчик Optiboot
Если вы загружаете загрузчик Optiboot, то старший байт предохранителя должен быть установлен как 0xDE (B11011110).Единственное отличие – это место, отведенное для загрузчика.
Полный список настроек предохранителей по умолчанию для различных Arduinos см. На странице Cody’s Arduino Default Fuse Settings.
Фиксирующие биты
Биты блокировки могут использоваться для ограничения доступа на чтение / запись к программной памяти. Раздел загрузки и раздел приложения имеют свои собственные биты блокировки, и доступ к каждой области можно контролировать отдельно.
Вы можете заблокировать микросхему ATmega, если вы включите биты блокировки, и вы не должны их менять.
Я постараюсь более подробно осветить биты замка в более поздней публикации.
Фактическое программирование предохранителей
Для программирования автономных чипов ATmega я использовал Arduino Nano в качестве программиста, увидел Arduino Nano в качестве ISP-программиста и обнаружил, что самый простой способ установить предохранители – это записать загрузчик (предохранители устанавливаются как часть процесса). Затем загрузчик можно будет перезаписать позже, когда вы загрузите скетч. Отредактировав файлboards.txt в папке установки Arduino, вы можете использовать любые значения предохранителей.
Вот запись, которую я добавил в файлboards.txt для использования с макетной платой Arduinos. Он имеет предохранитель младшего байта на 0xFF, предохранитель высокого байта на 0xDF, расширенный предохранитель на 0x05 и использует загрузчик Optiboot. Значения битов блокировки были скопированы из записи Arduino Uno.
atmegasa16.name = Автономный ATmega328P (Arduino в качестве интернет-провайдера)
atmegasa16.upload.protocol = stk500
atmegasa16.upload.maximum_size = 32768
atmegasa16.upload.speed = 115200
atmegasa16.upload.using = arduino: arduinoisp
atmegasa16.bootloader.low_fuses = 0xff
atmegasa16.bootloader.high_fuses = 0xdf
atmegasa16.bootloader.extended_fuses = 0x05
atmegasa16.bootloader.path = optiboot
atmegasa16.bootloader.file = optiboot_atmega328.hex
atmegasa16.bootloader.unlock_bits = 0x3F
atmegasa16.bootloader.lock_bits = 0x0F
atmegasa16.build.mcu = atmega328p
atmegasa16.build.f_cpu = 16000000L
atmegasa16.build.core = arduino
atmegasa16.build.variant = arduino: стандартный
Полезные ссылки
На сайте Ника Гаммона есть много действительно полезной информации о создании собственного Arduino и загрузке загрузчиков:
Как сделать минимальную плату, совместимую с Arduino (похожую на мою).
Решение проблем с загрузкой программ в ваш Arduino.
ATmega bootloader programmer.
Моя собственная Arduino на макетной плате объясняет, как настроить автономный чип ATmega, а «Использование Arduino Nano для программирования микросхемы ATmega328P» объясняет, как использовать Arduino в качестве программиста ISP.
Техническое описание ATmega 328P можно загрузить с веб-сайта Amtel по адресу http://www.atmel.com/Images/doc8161.pdf
http://eleccelerator.com и http://www.engbedded.com имеют калькулятор предохранителей, где вы выбираете, какие параметры вы хотите, и на странице представлены настройки предохранителей, которые нужно использовать.Я предпочитаю не пользоваться калькуляторами, так как считаю, что легко ошибиться, но это только мое личное мнение.
NIck Gammon также имеет полезный скетч, который определяет типы микросхем ATmega. Эскиз можно найти на http://www.gammon.com.au/forum/?id=11633. На скетче отображаются настройки предохранителей, биты блокировки и информация о загрузчике, если он есть. Я нашел этот скетч очень полезным, когда только начал напрямую программировать микросхемы.
Настройки предохранителя Arduino по умолчанию
Написано на июнь 25-е, 2011 г. от Коди СнайдерВот настройки предохранителей по умолчанию для каждой платы Arduino.txt, входящий в состав программного обеспечения для разработки Arduino.
Чтобы узнать больше о настройках предохранителей для вашего микроконтроллера, посетите Engbedded’s AVR Fuse Calculator.
Для записи настроек предохранителя вам понадобится программист с этой возможностью. Я использую спасательный высоковольтный экран Mighty Ohm, который можно найти здесь.
Arduino Uno
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDE |
Расширенный предохранитель | 0x05 |
Arduino Duemilanove или Nano с ATmega328
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDA |
Расширенный предохранитель | 0x05 |
Arduino Diecimila, Duemilanove или Nano с ATmega168
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
Arduino Mega 2560
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xD8 |
Расширенный предохранитель | 0xFD |
Arduino Mega (ATmega1280)
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDA |
Расширенный предохранитель | 0xF5 |
Ардуино Мини
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
Ардуино Фио
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDA |
Расширенный предохранитель | 0x05 |
Arduino BT с ATmega328
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xD8 |
Расширенный предохранитель | 0x05 |
Arduino BT с ATmega168
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
LilyPad Arduino с ATmega328
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDA |
Расширенный предохранитель | 0x05 |
LilyPad Arduino с ATmega168
Низкий предохранитель | 0xE2 |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
Arduino Pro или Pro Mini (5 В, 16 МГц) с ATmega328
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDA |
Расширенный предохранитель | 0x05 |
Arduino Pro или Pro Mini (5 В, 16 МГц) с ATmega168
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
Arduino Pro или Pro Mini (3.3 В, 8 МГц) с ATmega328
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDA |
Расширенный предохранитель | 0x05 |
Arduino Pro или Pro Mini (3,3 В, 8 МГц) с ATmega168
Низкий предохранитель | 0xC6 |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
Arduino NG или более ранняя версия с ATmega168
Низкий предохранитель | 0xFF |
Высокий предохранитель | 0xDD |
Расширенный предохранитель | 0x00 |
Arduino NG или более ранняя версия с ATmega8
Низкий предохранитель | 0xDF |
Высокий предохранитель | 0xCA |
ATmega328P Примечания
Примечания к ATmega328P- 32K Флэш-память программ
- 2K SRAM
- 1K EEPROM
- Два 8-битных таймера / счетчика
- Один 16-битный таймер / счетчик
- Шесть каналов ШИМ
- Шестиканальный 10-разрядный АЦП
- Один последовательный USART
- Один последовательный интерфейс SPI Master / Slave
- Один 2-проводный последовательный интерфейс (совместим с Philips I2C)
Ссылки
Таймеры
При тактовой частоте 16 МГц clockCyclesPerMicrosecond () 16000000/1000000 или 16 тактов в микросекунду.- timer0 является 8-битным
используется millis () и micros ()
использовал контакты 5 и 6 ШИМ
запрограммирован на 4 мкс на счет. - timer1 16-битный
использовал контакты 9 и 10 ШИМ - timer2 8-битный
использовал контакты 3 и 11 ШИМ - серийный0
использовали контакты ШИМ? а также ?
Прерывания
- PCINT0 на d8
- PCINT1 на d9
- PCINT2 на d10
- PCINT3 на d11
- PCINT4 на d12
- PCINT5 на d13
- PCINT6 на d6
- PCINT7 на d7
- PCINT8 на d14
- PCINT9 на d15
- PCINT10 на d16
- PCINT11 на d17
- PCINT12 на d18
- PCINT13 на d19
- PCINT14 при СБРОСЕ
-
- PCINT16 на d0 (RXD)
- PCINT17 на d1 (TXD)
- PCINT18 / INT0 на d2
- PCINT19 на d3
- PCINT20 на d4
- PCINT21 на d5
- PCINT22 на d6
- PCINT23 на d7
ATmega328P
Общий | |||
---|---|---|---|
Физический | Логический | Функция | Описание |
7 | В CC | ||
8 | ЗЕМЛЯ | ||
20 | AV CC | ||
21 | AREF | ||
22 | AGND |
Порт B | |||
---|---|---|---|
Физический | Логический | Функция | Описание |
14 | d8 | ||
15 | d9 | ШИМ | |
16 | d10 | SS | SPI |
17 | d11 | MOSI | SPI |
18 | d12 | MISO | SPI |
19 | d13 | SCK | SPI |
9 | XTAL1 | ||
10 | XTAL2 |
Порт C | |||
---|---|---|---|
Физический | Логический | Функция | Описание |
23 | d14 | a0 | |
24 | d15 | A1 | |
25 | d16 | A2 | |
26 | d17 | A3 | |
27 | d18 | SDA | TWI |
28 | d19 | SCL | TWI |
1 | СБРОС |
Порт D | |||
---|---|---|---|
Физический | Логический | Функция | Описание |
2 | d0 | RXD | USART |
3 | d1 | TXD | USART |
4 | d2 | INT0 | |
5 | d3 | ШИМ | |
6 | d4 | ||
11 | d5 | ||
12 | d6 | ||
13 | d7 |
Авторские права © 2011, 2012, 2013, 2015, 2017, 2018, 2019, 2020
Крейг Лерес