Site Loader

Про фьюзы – RoboCraft

Теперь о том, почему я так загонялся на тему сбоев при прошивке.
Дело в том что в памяти атмеги есть ячейки отвечающие за параметры конфигурации всего МК — фьюз-биты.

Про фюз-биты, как обычно, можно почитать у ДиХальта.
От себя добавлю что фьюз биты МК Atmega8 расположены в два байта – старший фьюз-байт (high _fuses) и младший фьюз-байт ( low_fuses)
А у Atmega168 есть ещё и дополнительный фьюз-байт(extended_fuses)

Если при программировании МК произойдёт сбой, то с некоторой долей вероятности (у меня пару раз было =) в эти ячейки может залезть мусор, что приведёт к галюцинированию или неработоспособности.
Шьются они специальными командами по 3 байта каждая+1байт данных (“куда писать”+”что писать”) т.е. вероятность, что помеха совпадёт именно с одной из них невелика, однако при прошивке ненадёжным программатором (или в условиях сильных помех) непосредственно фьюз-битов, вероятность попадания в них хлама существенно возрастает (мы сами подаём команду на запись фьюзов и если она каким-то чудом прорвалась сквозь наводки то данные похерить проще (они могут быть произвольными) и МК с радостью схавает шум эфира)

Наиболее неприятные фьюзы:

Ячейка RSTDISBL
при записи в неё “0” превращает вывод резет в обычную ногу и
прошить МК по SPI будет уже невозможно (вначале программирования необходимо “прижать к земле” RESET – подать “0”)

Ячейка SPIEN
при записи в неё “1” запрещено программирование по SPI. Пишут что при
программировании по последовательному каналу данная ячейка недоступна, так что нам вроде не грозит, однако проверять нехочется=)

Ячейки CKOPT и CKSEL
отвечают за тактирование МК и могут встать в такую позу, что

контроллер будет ждать внешнего тактового сигнала или не сможет раскачать ваш кварц.

Первое и второе лечится только параллельным программатром (может и JTAG поможет)
Второе лечится “тактированием от пальца” (мне пару раз помогло=). Тыкаете в XTAL1 (у атмеги8 — 9 нога) иголкой (или отвёрткой неизолированной) и шьёте как обычно — через SPI (может не с первого раза получится =) – можно, конечно использовать внешний генератор, но это если он есть или его не лень сделать =)
Сбои при программировании остальных фьюзов, лок-битов (биты отвечающие за защиту прошивки) и самого бутлоадера могут доставить неприятности лечимые простой (через SPI) перепрошивкой.

Процесс прошивки бутлодера состоит из четырёх этапов:

Разблокирование секции загрузчика вообще-то, по умолчанию, вся память атмеги и так
доступна для чтения/записи.

Установка фюз-битов — настраивает МК на работу в ардуине.

Прошивка собственно бутлодера

Запись лок-битов, защищающих секцию загрузчика от самостоятельной перезаписи (в общем случае бутлоадер может модифицировать или вообще сносить сам себя)

Настройки процесса прошивки бутлодера и значеня фьюз- и лок-битов можно просмотреть в arduino-0015\hardware\boards.txt в соотвествующей нашему МК секции (atmega8.bootloader)

atmega8.bootloader.programmer (по умолчанию: stk500) протокол используемый бутлодером.

atmega8.bootloader.path(по умолчанию: atmega8 ) путь где файл бутлодера лежит

atmega8.bootloader.file(по умолчанию: ATmegaBOOT.hex) собственно, сам бутлоадер

Теперь самое интересное:

atmega8.bootloader.unlock_bits (по умолчанию: 0x3F) значение записываемое в лок-байт для разблокирования секции бутлодера. Сбрасывает все лок-биты в 1 т.е. разрешаем любые изменения секции прикладной программы и бутлаодера.

atmega8.bootloader.high_fuses

(по умолчанию: 0xCA) значение записываемое в старший фьюз-байт.

atmega8.bootloader.low_fuses (по умолчанию: 0xDF) значение записываемое в младший фьюз-байт

atmega8.bootloader.lock_bits (по умолчанию:0x0F) значение записываемое в лок-байт для блокирования секции бутлодера — запрещается запись/чтение секци бутлоадера (программатором конечно можно, но ни агрессивный скетч ни суицидально настроенный бутлоадер не смогут=)

Рассмотрим что же именно пишется во фьюз-биты МК:

Atmega8

Младший фьюз-байт

BODLEVEL   1 порог срабатывания схемы BOD 2.7В
BODEN      1 но BOD у нас запрещён=)
SUT1       0 эта пара определяет длительность задержки сигнала RESET после включения 
SUT0       1 питания - 16тыс тактов (при 16МГц кварце это 1с) 
CKSEL3     1 эти фьюзы
CKSEL2     1 определяют тип 
CKSEL1     1 тактирования
CKSEL0     1 – кварцевый резонатор >1МГц

Старший фьюз-байт

RSTDISBL   1 ножка RESET – резет
WDTON      1 таймер вочдог – запускается программно
SPIEN      0 шить через ISP можно 
CKOPT      0 совместно с CKSEL3. ..0 определяет что усилитель тактового сигнала включен 
EESAVE     1 команда “стереть кристалл” стирает также EEPROM 
BOOTSZ1    0 размер секции 
BOOTSZ0    1 загрузчика 512байт
BOOTRST    0 вектор начального сброса находится в начале секции загрузчика - 
             МК при включении питания первым делом запустит бутлоадер 

Atmega168

Старший фьюз-байт

RSTDISBL   1 ножка RESET – резет
DWEN       1 работа отладчного интерфейса DebugWire запрещена
SPIEN      0  шить через ISP можно
WDTON      1  таймер вочдог – запускается программно
EESAVE     1 команда “стереть кристалл” стирает также EEPROM 
BODLEVEL2  1 порог срабатывания 
BODLEVEL1  0 схемы BOD
BODLEVEL0  1  = 2,7В

Младший фьюз-байт

CKDIV8     1  делитель тактового сигнала выключен
CKOUT      1  Выходной буфер системного тактового сигнала отключен от вывода МК
SUT1       1  эта пара определяет длительность задержки сигнала RESET после вкл.питания
SUT0       1  - 16тыс тактов+14тактов +65мс (при 16МГц кварце это немного больше 1с)
CKSEL3     1  эти фьюзы
CKSEL2     1  определяют тип
CKSEL1     1  тактирования
CKSEL0     1  - кварцевый резонатор >8МГц

Дополнительный фьюз-байт

-
-
-
-
-
BOOTSZ1    0  1024байта размер 
BOOTSZ0    0  секции бутлоадера
BOOTRST    0  вектор начального сброса находится в начале секции загрузчика - МК при  
              включении питания первым делом запустит бутлоадер

Ссылки
AVR. Учебный Курс. Конфигурация FUSE бит
AVR Fuse Calculator

По теме
Arduino/CraftDuino и WinAVR — программируем на чистом С
Делаем ISP-программатор из Arduino

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

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


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

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

фьюз-битов для AVR | AVR для нубов

Опубликовано 28 ноября 2011 автором pro2xy

Итак, вы перепутали свои предохранители. Верно? Благодаря этой странице  http://elecrom.wordpress.com/2010/04/03/avr-fuse-bits-settings/ у меня есть достойный ресурс, которым я могу поделиться с вами. Было неприятно узнать, что мне всегда нужно подключать xtal и две крышки, чтобы запустить мой mega8…. Я понял, что должен пойти дальше и изменить биты предохранителей на то, что, как я думал, заставит его работать на внутреннем генераторе. Я и не подозревал, что мне придется с ним попрощаться. Я повредил авр. Итак, я гуглил и гуглил, пока не нашел ЭТО!!!!

Микроконтроллер

H предохранитель

L предохранитель

Описание

ATmega16/32 0×99 0xE1 Заводские настройки по умолчанию для ATmega16/32. Предохранитель H: JTAG            : Включено OCD             : Выключено Программирование SPI : Включено CKOPT           : Не запрограммировано EEPROM Preserve : Не запрограммировано (EEPROM не сохранено) Размер BOOT       : 1024 слова : отключено Время запуска  : Источник синхронизации по умолчанию    : Внутренний, 1 МГц
ATmega16/32 0xD9 0xFF Внешний кристалл до 16 МГц, JTAG отключен. Остальные параметры: по умолчанию.
ATmega16/32 0xD9 0xE4 Внутренний генератор 8 МГц, JTAG отключен. Остальные параметры: по умолчанию.
ATmega8 0xD9 0xE1 Заводские настройки по умолчанию для ATmega8. Предохранитель H: Сброс Отключен  : Не запрограммирован (контакт сброса включен) Сторожевой таймер        : Выключен Программирование SPI : Включено CKOPT           : Не запрограммировано EEPROM Preserve : Не запрограммировано (EEPROM не сохранено) Размер BOOT       : 1024 слова : Обнаружение падения напряжения 2,7 В: Отключено Время запуска  : Источник тактовой частоты по умолчанию    : Внутренний, 1 МГц
ATmega8 0xD9 0xEF Внешний резонатор до 16 МГц. Остальные параметры: по умолчанию.
АТтини13 0xFF 0x6A Заводские настройки по умолчанию для ATtiny13. Предохранитель H: Самопрограммирование: Отключено debugWire       : Отключено Обнаружение отключения питания: Отключено Сброс Отключено  : Не запрограммировано (вывод сброса включен) Предохранитель L: Программирование SPI : Включено Сохранение EEPROM : Не запрограммировано (EEPROM не сохранено) Сторожевой таймер        : Выкл. Часы делят на 8  : Включено Время запуска : источник часов по умолчанию   : внутренний, 90,6 МГц
АТтини13 0xFF 0×69 Внутренний генератор 4,8 МГц, деление тактовой частоты на 8. Остальные параметры: по умолчанию
АТтини13 0xFF 0×79 Внутренний генератор 9,6 МГц, тактовая частота не делится на 8. Остальные параметры: по умолчанию.

Кроме того, пожалуйста, перейдите по ссылке на исходный пост выше, там вы также найдете пакетные файлы, созданные этим парнем, чтобы упростить работу….. 🙂

Всем спасибо: OMKAR KULKARNI   [http://elecrom.wordpress.com]

Нравится:

Нравится Загрузка…

О прокси

Энтузиаст электроники, рожденный в не очень энтузиастской семье, прикасается к интересным вещам, представленным на рынке. Большие дни: Сделал автоматический выдвижной ящик для штор в возрасте 14 лет…… начал с AVR всего год спустя, спроектировал свою первую печатную плату в 18 лет. Начну с другого блога сегодня, 27 августа 2011 г. Я сделал пару веб-сайтов ранее в моей жизни…. 🙂 Иметь прекрасную девушку :))

Просмотреть все сообщения от pro2xy →

Эта запись была размещена в Без рубрики. Добавьте постоянную ссылку в закладки.

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

Все мы знаем о том, как тактируется чип AVR ATmega32A. Во всех наших предыдущих уроках мы использовали внутреннюю тактовую частоту 1 МГц для управления чипом AVR. Это настройка часов по умолчанию, с которой микросхема ATmega поставляется с завода. В этом уроке мы научимся настраивать биты предохранителей AVR для использования разной тактовой частоты для различных приложений. Это важно там, где нам требуется очень точная и точная синхронизация, например, для реализации последовательного UART, связи USB. У нас есть предохранительные биты в микроконтроллерах AVR. Мы можем использовать эти фьюз-биты для тактирования микроконтроллера с желаемой частотой.

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

Что такое плавкие биты AVR?

Как мы все знаем, микроконтроллер AVR имеет три области памяти: FLASH, которая предназначена для программного кода, SRAM для переменных времени выполнения и EEPROM, которая может использоваться пользовательским кодом для хранения данных, которые должны быть сохранены. когда MCU выключен. Теперь замок/предохранители вместе образуют четвертую область памяти, доступную для программирования. Это содержит несколько байтов для предохранителей: младший байт, старший байт.

Прежде чем мы начнем анализировать биты фьюза и блокировки. Мы должны помнить, что бит, установленный в «0», означает, что он запрограммирован, а бит, установленный в «1», означает, что он не запрограммирован. Это немного сложно и очень важно отметить, прежде чем мы продолжим.

В этом уроке мы хотим показать, как можно синхронизировать микроконтроллер с разной частотой (настройка фьюз-битов avr). Обычно имеется только два байта предохранителя: старший и младший. Мы больше сосредоточимся на его использовании. Практический пример в этом руководстве позволит вам полностью понять концепцию, и вы будете готовы к дальнейшим экспериментам самостоятельно. Мы рассмотрим биты блокировки в следующем уроке. Расположение конкретных фьюз-битов различается среди всех фьюз-байтов в зависимости от используемой микросхемы AVR. Поэтому обязательно запишите их перед установкой. В качестве примера возьмем микроконтроллер ATmega32A и вот все байты фьюза для него.

Low Fuse Byte-AVRHigh Fuse Byte-AVR

Значение по умолчанию для бита предохранителя ATmega32/32A равно 0x99E1, т.е. старший предохранитель: 0x99 и низкий предохранитель: 0xE1, при этой настройке по умолчанию частота установлена ​​на 1 МГц, внутренний RC-генератор, время запуска: 6CK+64ms:

Отказ от ответственности:  Это руководство предназначено для информационных целей; делайте настройки фьюзов на свой страх и риск.

Объяснение каждого бита предохранителя:

BODLEVEL: С помощью этого бита предохранителя можно выбрать уровень срабатывания BOD (обнаружение отказа). Когда запрограммировано (0), уровень запуска составляет 4 В, а когда не запрограммирован (1), уровень запуска составляет 2,7 В.

BODEN: ATmega32A имеет встроенную схему обнаружения пониженного напряжения (BOD) для контроля уровня VCC во время работы путем сравнения его с фиксированным уровнем срабатывания. Когда BOD включен (запрограммирован BODEN) и VCC снижается до значения ниже уровня срабатывания, немедленно активируется сброс по отключению питания. Когда VCC увеличивается выше уровня запуска, он снова запускает микроконтроллер.

SUT1:0: Эти биты выбирают время запуска. Значение по умолчанию SUT1:0 приводит к максимальному времени запуска (6CK и дополнительная задержка 65 мс после RESET [см. таблицу: 8-9)., стр. №: 30].

CLKSEL [3-0]: Эти биты используются для выбора различных доступных параметров синхронизации. Значение по умолчанию CLKSEL[3..0] равно 0001, т.е. внутренний RC-генератор работает на частоте 1 МГц. Если вы хотите добавить внешний кварц, вам необходимо изменить значение в соответствии с [Таблица 8-1, страница №:26]. Некоторые общие значения фьюз-битов приведены в конце этой статьи.

OCDEN: Этот контакт используется для включения или отключения встроенной отладки. Это позволяет эмулировать работу микроконтроллера в реальном времени в целевой системе. По умолчанию он отключен, так как «1» означает, что он не запрограммирован.

JTAGEN: Имеется встроенный интерфейс JTAG для отладки. Он включен в новом микроконтроллере. По этой причине некоторые новички говорят: «PORTC ATmega32 не работает должным образом», отключите его, если вы не используете JTAG, установив JTAGEN бит 1 (высокий).

SPIEN: Значение 0 (запрограммировано) означает, что последовательное программирование ATmega32/32A включено. Не изменяйте это, если у вас нет параллельного программатора! Потому что однажды отключенный ATmega32A не может быть запрограммирован с помощью последовательного программатора.

CKOPT: Предохранитель CKOPT выбирает один из двух разных режимов усилителя генератора. Когда CKOPT запрограммирован, выход генератора будет колебаться с полным размахом от рельса к рельсу на выходе. Когда он не запрограммирован, осциллятор имеет меньший выходной размах. Если вы используете внешний генератор, лучше запрограммировать CKOPT, т.е. CKOPT = 0

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

BOOTSZ0 и BOOTSZ1: Эти биты используются для установки размера загрузчика.

Пример: установка битов предохранителя AVR

Теперь вы готовы синхронизировать микроконтроллер с разными частотами. В этом примере мы будем генерировать звуковой сигнал с помощью пьезодиска. И влияние будет показано с точки зрения изменения звуковых сигналов. Давайте посчитаем фьюз-биты для разных тактовых частот. Вот замечательная программа для расчета фьюз-битов для вас AVR Fuse Calculator

Случай 1: 1 МГц Внутренние часы (по умолчанию), Низкий предохранитель: 0xe1 Высокий предохранитель: 0x99

Случай 2: 8 МГц Внутренние часы, FUSE: 0xE4 High Fuse: 0x999 9012 .

Случай 3: Внешний кристалл 16 МГц, Low Fuse: 0xFF High Fuse: 0x99

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

Вот видео, которое представляет собой пошаговую инструкцию. Также влияние было продемонстрировано в ходе демонстрации в реальном времени: Установка битов предохранителя AVR