Fuse биты atmega328p: Фьюзы (Fuse Bits) в Arduino (ATmega328P): назначение, чтение, изменение

Содержание

Что такое Фьюзы. Чтение и запись фьюзов Ардуино

Сегодня я хочу рассказать о том, что такое фьюзы, за что они отвечают и как их можно прочитать и записать в Ардуино. Рекомендую также заглянуть в предыдущую публикацию, т.к. работа с фьюзами возможна только через программатор.

Фьюзы (от английского Fuse bits) — это конфигурационные биты микроконтроллера, отвечающие за его предварительную настройку. Эти биты расположены в отдельном адресном пространстве, доступном только при программировании. Биты объединяются в конфигурационные байты и их состав зависит от конкретной модели микроконтроллера.

При работе с конфигурационными битами нужно помнить один важный момент: если бит содержит логическую единицу, то это означает что он не запрограммирован, соответственно, запрограммированный конфигурационный бит содержит логический ноль. Такая логика основана на принципе хранения данных в EEPROM: чистая микросхема памяти содержит во всех ячейках единицы, а термин запрограммирована по отношению к такой ячейке означает, что в нее записали ноль.

Фьюзы ATmega328 / ATmega328p

Микроконтроллеры ATmega328 и ATmega328p, на базе которых построено большинство плат семейства Ардуино, имеют 3 байта конфигурации: младший, старший и дополнительный. Их описание приведено ниже в таблицах.

Младший конфигурационный байт ATmega328/P

Номер битаНаваниеОписаниеЗначение по умолчанию
7CKDIV8Divide clock by 80 (запрограммирован)
6CKOUTClock output1 (не запрограммирован)
5SUT1Select start-up time1 (не запрограммирован)
4SUT0Select start-up time0 (запрограммирован)
3CKSEL3Select Clock source0 (запрограммирован)
2CKSEL2Select Clock source0 (запрограммирован)
1CKSEL1Select Clock source1 (не запрограммирован)
0CKSEL0Select Clock source0 (запрограммирован)

Старший конфигурационный байт ATmega328/P

Номер битаНаваниеОписаниеЗначение по умолчанию
7RSTDISBLExternal Reset Disable1 (не запрограммирован)
6DWENdebugWIRE Enable1 (не запрограммирован)
5SPIENEnable Serial Program and Data Downloading0 (запрограммирован)
4WDTONWatchdog Timer Always On1 (не запрограммирован)
3EESAVEEEPROM memory is preserved through the Chip Erase1 (не запрограммирован)
2BOOTSZ1Select Boot Size0 (запрограммирован)
1BOOTSZ0Select Boot Size0 (запрограммирован)
0BOOTRSTSelect Reset Vector0 (запрограммирован)

Дополнительный конфигурационный байт ATmega328/P

Номер битаНаваниеОписаниеЗначение по умолчанию
71
61
51
41
31
2BODLEVEL2Brown-out Detector trigger level1 (не запрограммирован)
1BODLEVEL1Brown-out Detector trigger level1 (не запрограммирован)
0BODLEVEL0Brown-out Detector trigger level1 (не запрограммирован)

Таким образом, значения конфигурационных байтов в 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
0x3F0025611
0x3E0051210
0x3C00102401
0x3800204800

BOOTRST

Определяет положение вектора сброса. Если бит не запрограммирован, то вектор сброса располагается по адресу 0x0000, выполнение программы начнется именно с этого адреса. Если бит BOOTRST запрограммирован, то выполнение программы начнется с адреса начала секции загрузчика.

BODLEVEL

Конфигурационные биты BODLEVEL определяют порог срабатывания схемы BOD (Brown-Out Detection), которая отслеживает уровень напряжения источника питания. Если работа схемы BOD разрешена, то при снижении напряжения питания ниже установленного порога она переводит микроконтроллер в состояние сброса. Когда напряжение питания вновь увеличивается до порогового значения (данный порог чуть выше предыдущего за счет наличия гистерезиса), сигнал сброса снимается и происходит запуск микроконтроллера. Комбинации битов BODLEVEL и соответствующие им пороговые значения приведены в таблице:

Порог срабатывания схемы BOD (В)Значение BODLEVEL2..0
Схема BOD выключена111
Vcc = 1.8110
Vcc = 2.7101
Vcc = 4.3100

Теперь можно понять начальное состояние микроконтроллеров 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 означает, что мы хотим прочитать содержимое младшего байта конфигурации, считанное значение выводим на экран в шестнадцатеричном виде.

Более подробную информацию о параметрах запусках avrdude можно найти по ссылке https://ph0en1x.net/77-avrdude-full-howto-samples-options-gui-linux.html

Ниже приведен мой результат выполнения данной команды:

Как видно из скриншота, младший конфигурационный байт моей 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, после чего производит контрольное считывание и сообщает об успешном выполнении операции.

В принципе нет ничего сложного в работе с конфигурационными битами. Главное быть внимательным при их изменении, чтобы не залочить микроконтроллер.

Фьюзы в Arduino UNO

Тактовая частота микроконтроллера и некоторые другие параметры определяются установкой специальных регистров в 0 или 1. Биты этих восьми-битных регистров называют фьюзами (fuses).

Подключив к Arduino Uno программатор USBasp, при помощи программы avrdude мы считали сигнатуру микроконтроллера и его фьюзы. В микроконтроллере ATMega328P, установленном на плате Arduino UNO их 3: LOW, HIGH, EXTENDED.

sudo avrdude -p m328P -c usbasp

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0. 00s

avrdude: Device signature = 0x1e950f (probably m328p)

avrdude: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude done.  Thank you.

Здесь значения фьюзов представлены в шестнадцатеричной системе счисления.

  • LOW : FF
  • HIGH: DE
  • EXTENDED: FD

Если установить фьюзы микроконтроллера ATMega328P в E:FD, H:DF, L:E2, то микроконтроллер сможет работать на частоте 8 MHz без кварца.

sudo avrdude -p m328P -c usbasp -Uhfuse:w:0xdf:m -Ulfuse:w:0xe2:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "0xdf"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xdf:
avrdude: load data hfuse data from input file 0xdf:
avrdude: input file 0xdf contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0. 00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xe2"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xe2:
avrdude: load data lfuse data from input file 0xe2:
avrdude: input file 0xe2 contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK (E:FD, H:DF, L:E2)

avrdude done.  Thank you.

Но, следует учесть, что не будет работать загрузчик (BootLoiader) и программы в микроконтроллере будут выполняться медленнее. Например, измеряемое с помощью датчика UltraSonic расстояние будет определено как в несколько раз меньше реального.

В следующей статье «ATMega328 в Arduino без кварца» показано, как перезаписать загрузчик для ATMega328, работающего на частоте 8 МГц без кварца и как его полноценно использовать в среде разработки Ардуино.

  • Arduino

  • Назад

  • Вперед

Понимание фьюз-битов в ATmega328P для повышения эффективности программирования Arduino

В этом уроке мы поговорим о фьюзах. Еще когда я учился в колледже и узнавал обо всех интересных вещах в электронике, я впервые услышал термин «предохранитель» в AVR, и моей первоначальной мыслью по этой теме было: «О! внутри AVR есть что-то, что взорвется, если я сделаю что-то не так. В то время в Интернете было не так много доступных ресурсов. Я довольно долго искал, чтобы узнать, что эти предохранители относятся к какому-то специальные биты внутри микроконтроллера AVR . Эти биты подобны крошечным переключателям внутри AVR, и, включая/выключая их, мы можем включать/выключать некоторые специальные функции AVR. Включение и выключение означает настройку и сброс.

Мы собираемся воспользоваться этой возможностью, чтобы обсудить все, что есть о битах Fuse в AVR . Для простоты возьмем в качестве примера плату Arduino, на которой размещен популярный микроконтроллер ATmega328P . Здесь вы узнаете, как установить эти предохранители для включения и выключения некоторых из этих функций, что очень удобно в реальных приложениях. Итак, давайте приступим к делу.

В наших предыдущих сообщениях мы создали множество проектов микроконтроллеров AVR, таких как интерфейс GSM-модуля с микроконтроллером AVR и интерфейс HC-05 с микроконтроллером AVR. Вы можете проверить их, если хотите узнать больше об этих проектах.

Что такое фьюзы в AVR — подробное объяснение

Как мы обсуждали ранее, фьюзы в микроконтроллере похожи на маленькие переключатели, которые можно включать и выключать для включения и отключения различных функций микроконтроллера AVR. Это та часть, где возникает наш следующий вопрос, так как же нам установить или сбросить эти предохранители? Ответ на этот вопрос прост: Делаем это с помощью предохранитель регистрирует .

В микросхеме ATmega328P всего 19 фьюз-битов, и они разделены на три фьюз-байта. Они определяются как «Расширенные байты предохранителя», «Старший байт предохранителя» и «Младший байт предохранителя».

Если вы посмотрите на Таблицу 27 спецификации ATmega328/P Rev: 7810D–AVR–01/15, вы сможете узнать все мелкие подробности о фьюз-битах. Но изображение ниже даст вам лучшее представление о разделе технических данных, посвященном плавким битам.

Теперь, когда вы немного узнали о фьюз-битах, давайте пройдемся по техническому описанию и узнаем все необходимые подробности об этой микросхеме.

Расширенные Fuse Bits:

Щелкнув на вкладке Fuse Bits и прокрутив немного вниз, вы найдете Таблицу 27-5: в которой показана таблица для «Расширенный Fuse Byte» , обычно известный как « ЭФУЗЕ». На изображении ниже показано именно это.

В этой таблице используются только три бита, а остальные три зарезервированы. Эти три бита имеют дело с Уровень обнаружения отключения питания . Как вы можете видеть в примечании, если мы посмотрим на Таблицу 28-5, мы сможем найти более подробную информацию об этом.

Как видно из приведенной выше таблицы, у нас есть таблица для Обнаружение отключения питания . Обнаружение падения напряжения — это функция, которая сбрасывает микроконтроллер, когда напряжение питания падает ниже определенного уровня. В микросхеме ATmega328P мы можем полностью отключить определение понижения напряжения или установить уровни, указанные в таблице выше.

Старшие байты предохранителя:

Как вы можете видеть на изображении ниже, в таблице 27-6: таблицы данных показаны старшие биты предохранителя микросхемы ATmega328P.

Предохранитель High выполняет различные задачи внутри микроконтроллера ATmega328. В этом разделе мы поговорим о более высоких фьюз-битах и ​​их работе. Начнем с битов BOOTRST, BOOTSZ0 и BOOTSZ1. Эти три бита отвечают за установку размера загрузки ; размер загрузки относится к объему памяти, зарезервированному для установки загрузчик.

Загрузчик — это специальная программа, работающая поверх микроконтроллера и управляющая различными задачами. Но в случае с Arduino загрузчик используется для загрузки скетча Arduino внутрь микроконтроллера. В одной из наших предыдущих статей мы показали вам, как записать загрузчик в ATmega328P с помощью Arduino. Вы можете проверить это, если вам интересна тема. Возвращаясь к нашей теме, назначение других битов в старшем байте достаточно ясно, бит EESAVE предназначен для сохранения памяти EEPROM во время выполнения цикла стирания микросхемы. Бит WDTON должен включать или отключать Сторожевой таймер .

Сторожевой таймер — это специальный таймер в микросхеме ATmega328P, который имеет отдельные часы и работает независимо. Если сторожевой таймер включен, то его нужно сбросить с определенным периодом, иначе сторожевой таймер сбросит микроконтроллер. Это полезная функция, которая присутствует во многих микроконтроллерах, если процессор зависает; сторожевой таймер сбросит его, чтобы предотвратить повреждение конечного приложения.

Бит DWEN используется для включения провод отладки ; это подготовительный протокол, который встроен в их оборудование и используется для программирования и отладки процессоров. Если эта функция включена, вы можете прошивать и отлаживать процессор с помощью одного подключенного провода. Но для его использования вам понадобится специальное оборудование, которое является подготовительным к Atmel.

Оставшиеся два бита — это те биты, которых вам следует избегать, если вы точно не знаете, что делаете. Это бит 7 RSTDISBL и бит 5 SPIEN. RSTDISBL (отключение внешнего сброса), как следует из названия, отключает вывод внешнего аппаратного сброса, а бит SPIEN используется для отключения интерфейса программирования SPI. Отключение любого из этих двух битов может полностью испортить ваш AVR; так что оставить их в покое — хорошая идея.

Младшие байты Fuse:

Как вы можете видеть на изображении ниже, в таблице 27-7: таблицы данных показаны младшие биты Fuse микросхемы ATmega328P.

Этот байт фьюза отвечает за установку источника тактового сигнала и некоторых других параметров тактового сигнала внутри AVR. В этом разделе мы узнаем обо всем этом.

7-й бит или флаг CKDIV8 можно установить для деления источника тактового сигнала на 8, это очень удобно, о чем вы, возможно, уже знаете, если пробовали программировать AVR самостоятельно. Следующий бит — это бит CKOUT, и это 6-й бит в младшем байте предохранителя. Если его запрограммировать, внутренний тактовый сигнал будет выводиться на порт PORTB0 микроконтроллера.

Биты 5 и 4 SUT1 и SUT0 управляют временем запуска микроконтроллера. Это предотвращает любые пусковые действия, которые могут произойти или не произойти до того, как напряжение питания достигнет приемлемого минимального порогового уровня напряжения. И последние четыре бита CKSEL0 — 4 используются для выбора источника тактирования микроконтроллера. Таблица, показанная ниже, дает вам лучшее представление об этих четырех битах, которые отвечают за настройку источника тактового сигнала. Вы можете найти эту таблицу в разделе «Источник тактового сигнала» таблицы данных.

Теперь, прежде чем мы продолжим, есть еще одна вещь, которую я должен пройти – это таблица задержки запуска генератора. Под задержкой запуска мы имеем в виду биты 4 и 5 младшего байта предохранителя. Задержки необходимо устанавливать в зависимости от условий, в которых будет работать схема, и типа используемого генератора. Значения по умолчанию установлены для медленного увеличения мощности с 6 тактовыми циклами, когда выполняется последовательность включения или выключения питания. Далее следует еще одна задержка в 14 тактов с задержкой 65 мс после запуска.

Фу! Это было много информации для переваривания. Но прежде чем двигаться дальше, давайте закончим этот раздел краткой заметкой.

Примечание:

Если вы внимательно изучили техническое описание, то должны были заметить, что программирование фьюз-бита означает установку его на низкий уровень, то есть 0 (ноль), что противоположно тому, что мы обычно делаем, чтобы сделать порт высокий или низкий. Вы должны помнить об этом при настройке фьюзов.

Fuse Bits в Arduino

Мы много говорили о фьюзах в предыдущем разделе, но в этом разделе поговорим о том, как их настроить и как записать в микроконтроллер. Для этого нам понадобится инструмент под названием Avrdude. Это инструмент, который можно использовать для чтения, записи и изменения памяти в микроконтроллерах AVR. Он работает с SPI и имеет длинный список поддержки для разных типов программистов. Вы можете скачать инструмент по ссылке, указанной ниже. Также мы будем использовать наш любимый микроконтроллер Arduino.

  • Скачать Avrdude Version 6.3 Windows-ming32

Теперь, когда у вас есть 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.

Сравнение стандартных младших байтов Fuse с Arduino:

Нижний байт предохранителя

Номер бита

Значение по умолчанию в AVR

Значение по умолчанию для Arduino

CKDIV8

7

0 (запрограммировано)

1 (не запрограммировано)

СКАУТ

6

1 (не запрограммировано)

1 (не запрограммировано)

СУТ1

5

1 (не запрограммировано)

1 (не запрограммировано)

СУТ0

4

0 (запрограммировано)

1 (не запрограммировано)

CKSEL3

3

0 (запрограммировано)

1 (не запрограммировано)

CKSEL2

2

0 (запрограммировано)

1 (не запрограммировано)

CKSEL1

1

1 (не запрограммировано)

1 (не запрограммировано)

CKSEL0

0

0 (запрограммировано)

1 (не запрограммировано)

Старший байт предохранителя имеет значение 0XDA в двоичном виде, то есть 0B11011010.

Старший байт предохранителя в двоичном формате:

Старший байт предохранителя

Номер бита

Значение по умолчанию в AVR

Значение по умолчанию для Arduino

РСТДИСБЛ

7

1 (не запрограммировано)

1 (не запрограммировано)

ДВЭН

6

1 (не запрограммировано)

1 (не запрограммировано)

ШПИЕН

5

0 (запрограммировано)

0 (запрограммировано)

ВДТОН

4

1 (не запрограммировано)

1 (не запрограммировано)

СОХРАНИТЬ

3

1 (не запрограммировано)

1 (не запрограммировано)

САПОГИZ1

2

0 (запрограммировано)

0 (запрограммировано)

САПОГИZ0

1

0 (запрограммировано)

1 (не запрограммировано)

ЗАГРУЗКА

0

1 (не запрограммировано)

0 (запрограммировано))

Для расширенного байта предохранителя установлено значение 0XFD, в двоичном формате это 0B11111101.

Расширенный Fuse-байт в двоичном виде:

Расширенный байт предохранителя

Номер бита

Значение по умолчанию в AVR

Значение по умолчанию для Arduino

7

1

1

6

1

1

5

1

1

4

1

1

3

1

1

БОДЛЕВЕЛ2

2

1 (не запрограммировано)

1 (не запрограммировано)

БОДЛЕВЕЛ1

1

1 (не запрограммировано)

0 (запрограммировано)

БОДЛЕВЕЛ0

0

1 (не запрограммировано)

1 (не запрограммировано)

На этом раздел заканчивается. На данный момент мы многое узнали о микроконтроллере AVR и его фьюз-битах. Итак, давайте завершим эту статью, проверив нашу теорию, изменив и поэкспериментировав с некоторыми фьюз-битами в Arduino Nano.

Компоненты, необходимые для проверки предохранителей в AVR

Мы много говорили о предохранителях в предыдущей части. Но чтобы двигаться дальше в статье, нам потребуются некоторые аппаратные компоненты и некоторые программные инструменты. В этом разделе мы поговорим о тех. Список необходимых компонентов с изображениями показан ниже.

  • Макет — 1
  • Ардуино Нано — 1
  • Программатор USBasp AVR — 1
  • USB-кабель — 1
  • Преобразователь с 10-контактного на 6-контактный AVR — 1
  • Avrdude (Программный инструмент для программирования AVR)
  • Светодиод — 1
  • 330R Резистор — 1
  • Соединительные кабели

Схема тестирования плавких битов в AVR

Схема тестирования оборудования показана ниже в этой настройке. Мы подключили Arduino Nano к ПК с помощью USB-кабеля, а также подключили программатор USBasp к ПК. Целью этой статьи является программирование фьюз-битов в AVR. По этой причине мы подключили программатор USBasp к Arduino. Изображение ниже даст вам лучшее представление о настройке.

Проверка предохранителей в AVR

Схема тестирования показана ниже. Как видите, мы подключили Arduino и программатор USBasp к USB моего ноутбука.

Теперь давайте откроем Arduino IDE и загрузим базовый скетч мигания. Содержание базового эскиза мерцания не требует пояснений, поэтому я не стал вдаваться в подробности.

На видео вы увидите, что светодиод на контакте № 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. Для этого перейдите в Tools -> Programmer-USBasp , и как только мы это сделаем, мы снова можем перейти к инструментам и нажать на опцию записи загрузчика. Это снова сожжет стандартный загрузчик на вашем Arduino, и все вернется к тому, что было раньше.

После того, как загрузчик был прошит обратно в Arduino, он вернулся в исходное состояние, и на последнем изображении вы видите мигающий светодиод после повторного прожига загрузчика.

На этом статья заканчивается. Надеюсь, вам понравилась статья и вы узнали что-то новое. Если у вас есть какие-либо вопросы относительно статьи, не стесняйтесь оставлять комментарии ниже.

Настройки фьюзов 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 встроенных генератора, 128 кГц RC-генератор и калиброванный RC-генератор.
Опция внешнего тактирования позволяет микросхеме использовать внешний тактовый сигнал прямоугольной формы. Это используется, когда у вас есть схема с собственными часами, с которыми вы хотите синхронизировать ATmega, или если вы хотите использовать отдельный чип часов. Внешний тактовый сигнал необходимо подключить к контакту CLOCK-IN 9.0005

 Параметры кварцевого генератора

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 для установки времени задержки запуска.

БПК является Обнаружение Брауна и обсуждается позже.

Arduino использует максимальную задержку запуска 14CK + 65 мс (CKSEL0=1, SUT1=1, SUT0=1), которая также является настройками по умолчанию для новых микросхем ATmega 328/328P.

CHDIV8 (Clock Divide)

Микросхемы ATmega 328/328P имеют встроенный RC-генератор с частотой 8,0 МГц. Новые чипы поставляются с этим набором в качестве источника тактовых импульсов и активным предохранителем CKDIV8, в результате чего системные часы работают на частоте 1,0 МГц. Время запуска установлено на максимальное значение, а время ожидания включено. (CKSEL = «0010», SUT = «10», CKDIV8 = «0»). Эта настройка используется для того, чтобы все пользователи могли задать желаемую настройку источника тактового сигнала с помощью любого доступного интерфейса программирования.

CKDIV8 следует использовать, если выбранный источник синхронизации имеет более высокую частоту, чем максимальная частота чипа ATmega.

Чипы ATmega можно использовать при очень низком напряжении, однако чем ниже напряжение, тем медленнее они должны работать. CHDIV8 можно использовать для установки низкой тактовой частоты в соответствии с низким напряжением.

CKOUT (Clock Out)

Тактовый сигнал может быть направлен на PB0. Это полезно, если вам нужен тактовый сигнал для управления другими схемами. Это работает для всех источников синхронизации, а для новых микросхем по умолчанию установлено значение CKOUT=1 (не установлено).

 

Предохранители старшего байта

Предохранитель старшего байта имеет несколько различных настроек. Нормальный интерес (по крайней мере, для меня как любителя) представляют собой сторожевой таймер, сохранение или стирание настроек eeprom и атрибутов загрузчика.

RSTDISBL (отключение внешнего сброса)

PC6 — контакт сброса, удерживайте его на низком уровне (на землю), и микросхема сбросится. Вот как работает переключатель на Arduino. Когда вы нажимаете кнопку сброса, она соединяет PC6 с землей и сбрасывает микросхему.

PC6 также можно использовать в качестве обычного вывода ввода-вывода, но это означает отключение функции сброса, что, в свою очередь, означает, что микросхема больше не может быть встроена в программирование (для линейного программирования требуется сброс). Это один из вариантов, который лучше не менять.

Я полагаю, что RSTDISBL реализован из соображений безопасности, чтобы остановить перепрограммирование чипа или загрузку прошивки.

При программировании RSTDISBL время запуска (SUT1 SUT0) увеличивается до 14CK + 4,1 мс, чтобы обеспечить возможность входа в режим программирования.

По умолчанию параметр RSTDISBL=1 (не задан).

DWEN (debugWIRE enable)

Микросхемы 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 (Сторожевой таймер всегда включен)

Сторожевой таймер — это, по сути, таймер, который вызывает сброс микросхемы, если она не получает сигнал OK в определенное время.

Это может быть полезно, если у вас нестабильный код или система, которая не должна постоянно зависать.

Когда сторожевой таймер включен, в случае сбоя или зависания скетча таймер истечет время ожидания и сбросит чип, что приведет к перезапуску, аналогичному нажатию кнопки сброса на работающем Arduino.

Сторожевой таймер можно активировать в программном обеспечении, поэтому на самом деле нет необходимости использовать настройки предохранителей. По умолчанию сторожевой таймер выключен, WDTON=1.

Существует хорошее мини-руководство по сторожевому таймеру от za_nic на форуме Arduino по адресу ttp://forum.arduino.cc/index.php/topic,63651.0.html
У Пола Мартинсена есть руководство по использованию сторожевого таймера. таймер для обнаружения зависаний на http://www.megunolink.com/how-to-detect-lockups-using-the-arduino-watchdog/

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.

New 328/328P chips generally have the following fuse settings:

Low fuse = 0x62 (B01100010)
High fuse = 0xD9 (B11011001)
Extended fuse = 0xFF (B11111111)

 

Arduino Duemilanove or Nano w / ATmega328 Default Fuse Settings

Низкий предохранитель = 0xFF (B11111111)
Высокий предохранитель = 0xDA (B11011110)
Расширенный предохранитель = 0x05 (B00000101)

должен быть установлен как 0xDE (B11011110). Единственная разница — это место, выделенное для загрузчика.

Полный список настроек предохранителей по умолчанию для различных Arduino см. на странице Коди с настройками предохранителей по умолчанию для Arduino.

 

Биты блокировки

Биты блокировки могут использоваться для ограничения доступа на чтение/запись к памяти программ. Раздел загрузки и раздел приложений имеют свои собственные биты блокировки, и доступ к каждой области можно контролировать отдельно.

Вы можете заблокировать чип ATmega, если вы включите биты блокировки, и вы не должны их менять.

Я постараюсь более подробно рассказать о битах блокировки в следующем посте.

 

 

Собственно программирование фьюзов

Для программирования автономных чипов ATmega я использовал Arduino Nano в качестве программатора, см. Arduino Nano в качестве программатора ISP и обнаружил, что самый простой способ установить фьюзы — это записать загрузчик ( предохранители устанавливаются как часть процесса). Затем загрузчик можно перезаписать позже, когда вы загрузите скетч. Отредактировав файл boards.txt в папке установки Arduino, вы можете использовать любые значения для фьюзов.

Вот запись, которую я добавил в файл boards.txt для использования с макетной платой Arduinos. Он имеет предохранитель младшего байта в 0xFF, предохранитель старшего байта в 0xDF, расширенный предохранитель в 0x05 и использует загрузчик Optiboot. Значения битов блокировки были скопированы из записи Arduino Uno.

atmegasa16.name=ATmega328P Stand Alone (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=ардуино
atmegasa16.build.variant=ардуино:стандарт
 

 

 Полезные ссылки

На сайте Ника Гэммона есть много действительно полезной информации о создании собственного Arduino и загрузке загрузчиков:
Как сделать минимальную плату, совместимую с Arduino (похожую на мою).
Решение проблем с загрузкой программ в программатор загрузчика Arduino
ATmega.

Мой собственный Arduino на макетной плате объясняет, как настроить автономный чип ATmega, а использование Arduino Nano для программирования чипа ATmega328P объясняет, как использовать Arduino в качестве программатора ISP.

Спецификацию ATmega 328P можно загрузить с веб-сайта Amtel по адресу http://www.atmel.com/Images/doc8161.pdf

http://eleccelerator.com и http://www.engbedded.com у обоих есть калькулятор предохранителей, где вы выбираете, какие параметры вы хотите, и на странице представлены настройки предохранителей для использования.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *