Любой новичок при программировании микроконтроллеров Атмел слышал про установку фьюзов и про большие опасности, которые ждут, если галочку не там поставить.
Вообще фьюзы это самое дебильное наследство микроконтроллеров родом конца прошлого века, когда фьюзы имели вид пережигаемых перемычек. Поэтому снятая галочка бита фьюза равняется единице, что не очень логично. Правда не во всех программах они одинаковы — у некоторых прошивальщиков фьюзы отображаются в инверсном виде (снятая галочка — ноль) что вносит еще больше неразберихи.
Для просмотра и настройки байтов конфигурации микроконтроллеров я советую пользоваться онлайн калькулятором: homes-smart.ru/fusecalc/?…=avrstudio&part=ATtiny13A Ссылка сразу же ссылается на ATtiny13A Выбираем нужные строчки или ставим нужные галки в конфигурации и ниже видим биты конфигурации, а в левом верхнем углу видим байты конфигурации. Можно делать наоборот: выставить например байт конфигурации и посмотреть получившиеся строчки. В интернете есть выбор онлайн калькуляторов, можно подобрать себе по вкусу, погуглив фразу "онлайн калькулятор фьюзов"
Байт конфигурации бывает нижним LOW и верхним HIGHT. Правда есть еще extended байт, но конкретно в ATtiny13A этот байт фьюзов не используется — про него молчим.
Нижний байт конфигурации, от старшего бита к младшему:
SPIEN. — разрешение последовательного программирования. Если используете последовательный SPI программатор, то этот бит не изменить. Логично. По умолчанию разрешено.
EESAVE — разрешить сохранение содержимого EEPROM при стирании чипа, при прошивке. Тут объяснять ничего не нужно. По умолчанию запрещено. Бывает полезно выставлять этот бит при отладке, когда часто заливается правленная прошивка а заливать каждый раз еепром — лишние движения.
WDTON — включить сторожевой таймер. Если используете сторожевой таймер, то необходимо разрешить этот бит. По умолчанию запрещен.
Напоминаю, чтоб сторожевой таймер работал в коде программы, необходимо его проинициализировать и выбрать предделитель, например
WDTCR=0x1F;
WDTCR=0x0F;
говорит о том, что сторожевой таймер включен с делителем 256k с выключеным прерыванием по таймауту. Затем в теле программы втыкаем ассемблерные вставки сброса сторожевого таймера
#asm("wdr")
CKDIV8 Включалка делителя на 8 тактовой частоты. По умолчанию включено!
Бит CKDIV8 определяет начальное значение CLKPS бита. CLKPS бит — это регистр предделителя тактовой частоты. Если CKDIV8 бит во фьюзах выключен, то первоначальная установка делителя CLKPS равна нулю. Если CKDIV8 бит установлен, то делитель регистра CLKPS сбрасывается при старте микроконтроллера в состояние 1100, что включает делитель на 8. То есть в проекте задали частоту 4.8 МГц, выставили во фьюзах CKSEL1 CKSEL0 и оставили включеным CKDIV8, то тактовая частота будет 4.8/8=600 кГц
Самое главное: не нужно использовать излишне высокую частоту тактирования, если в этом нет необходимости. Как правило, в большинстве случаев хватает дефолтной установки тактовой частоты — 1.2МГц.
Помните: чем выше частота — тем больше ток потребления в активном режиме. Нужно поморгать светодиодами — частота по дефолту. А вот нужно реализовать программный ШИМ, что б яркость регулировать — тактовую частоту нужно поднять, (к примеру сняв галочку CKDIV8 — будет 9.6МГц от дефолтной) ибо частоты ШИМа будет не хватать.
SUT1 и SUT0 — Выбор времени запуска внутреннего тактового генератора при запуске микроконтроллера .
Рекомендованные значения из даташита:
00 При использовании фьюза BODLEVEL (Brown-out Detector)
01 При быстрой подаче напряжения (напряжение питания нарастает быстро)
10 При медленной подаче напряжения. (по умолчанию)
11 Неиспользуется.
Подали питание — микроконтроллер ожил — смотрим фьюзы SUT1 и SUT0 — делаем задержку, если в этих фьюзах указанно — запускаем тактовый генератор — микроконтроллер заработал.
CKSEL1 CKSEL0 — Выбор источника тактового сигнала или выбор частоты внутреннего тактового генератора.
00 — используется внешний тактовых генератор
01 — используется внутренний генератор на 4.8 МГц
01 — используется внутренний генератор на 9.6 МГц
11 — используется внутренний генератор на 128 кГц
Старший байт конфигурации:
Здесь три старших бита не используются, поэтому начинаем с 4 бита:
SELFPRGEN Self Programming Enable, Разрешение самопрограммирования. По умолчанию выключен.
Хитрожопый фьюз, ибо в понипроге и CVARe он обзывается SPMEN
Нужен для того, чтоб в течении четырех тактов изменить регистр SPM — Store Program Memory
Используют этот фьюз бородатые дядьки-микроконтроллерщики, что б например писать данные во внутреннюю флэш память, когда в тиньке с памятью тесно.
DWEN DebugWire — интерфейс для отладки. По умолчанию отключен. Использует порт ножки ресета. Нужно помнить, что даже если поставить Lock биты, если DWEN включен, то он так и будет работать.
BODLEVEL1 и BODLEVEL0 Brown-out Detector trigger level, он же "коричневый выход", а если серьезно это сброс микроконтроллера по провалу напряжения питания. Если напряжение питания упадет ниже указанного порога более чем на 2 микросекунды — хана, микроконтроллер отресетится. Самое главное, что нужно помнить, то что с включенным BODLEVELом в спящем режиме микроконтроллер жрет больше электричества. По умолчанию отключен.
11 — отключен
10 — 1.8 вольта
01 — 2.7 вольта
00 — 4.3 вольта
RSTDISBL — отключение ножки ресета. По умолчанию выключена. Если отключить ножку ресета, то появиться работоспособный порт PB5, но при этом последовательное программирование по SPI больше не будет работать — программирование будет возможно только высоковольтным последовательным программатором. Я часто отключаю ресет, ибо не боюсь, у меня есть высоковольтная оживлялка ATTiny13.
Многие думают, что при подачи нуля на вход ресет и удержании низкого уровня микроконтроллер теряет сознание, лежит лапками к верху и не шевелится — не подавая признаков жизни. Это не так! Наличие низкого уровня на ножке ресет всего лишь переводит микроконтроллер в режим готовности к программированию, ожидая команд по SPI интерфейсу.
Если ножку ресет отключить, то вход в режим программирования будет недоступен, микроконтроллер не будет переводится в режим программирования. Но возможность прошить микроконтроллер остается — нужно активировать режим высоковольтного программирования. Высоковольтным он называется всего лишь из за того, что чтобы его активировать нужно подать 12 Вольт на ножку ресет. Данные при этом передаются тоже последовательно, но уже не по SPI интерфейсу.


Комментарии 18
Степан Палыч,
может подскажете куда копать?
Имелось некое устройство на атмега2561. Слетела прошивка.На просторах сети вроде нашел. Решил прошить. Но сразу наткнулся на то что был залочен по ISP и программатор ее не видел.
Изготовил FuseBit Doctor, раскирпичил . Сразу мега увиделась программатором и прочитала сигнатуру .
Но при попытках прошить- вроде заливается чтото… но по факту в содержимом одни FF . то есть ничего не заливается.
Куда копать ?
Здравствуйте Степан Палыч как называется в AVR Studio 5.1 "Хитрожопый фьюз, ибо в понипроге и CVARe он обзывается SPMEN" ? Объясните пожалуйста!
SELFPRGEN
Спасибо большое! И почему они все, одни и те же вещи по разному называют?!
Ссылка битая =(
Исправил — дополнил
Не ожидал про микрухи AVR, да еще и про фьюзы прочитать на drive2 :)
Маялся с attyny2313, ломал голову чего он заторможенный, напоролся на CKDIV8, а серии atmega его вроде не было :-D
Есть, к сожалению. И в серии AT90 тоже имеется
Если фьюзы CKSEL1 CKSEL0 в 00, т.е. от внешнего кварца, частоту любую можно выставлять? Например кварц 4 или 8 или 12 Мгц?
Да
Заводские настройки данного мк 1.2 Мгц?
Тогда не пойму, почему фьюзы источника тактового генератора не предпологают такого варинта?
Заводские настройки включают в себя настройку тактового генератора на 9.6МГц и плюсом еще фьюз CKDIV8 который делит тактовую частоту на 8. В итоге 9.6/8=1.2МГц
Если я подцеплю внешний кварц, ну скажем на 12МГц, выставлю фьюзы CKSEL1 CKSEL0 в 00 и оставлю заводским фьюз делителя CKDIV8 то в итоге получу тактовую частоту 12/8=1.5МГц
Да спасибо за разъяснение, про делитель не подумал.
Здесь нашол с картинками для начинающих разложены фьюзы: rfanat.ru/s20/Primer-AVR-fuse-bit.html
Палыч! Ты меня щас просто убил во втором абзаце! Конец прошлого века — это скорее PIC, а AVR — начало нынешнего… хоть разработка архитектуры и начата в 1997 году, до ума это все довели только примерно в 2003. Сложности и опасности при работе с фьюзами сводятся только к внимательному чтению даташитов. А гемор выплывает из-за неоднозначной интерпретации активного и пассивного состояния битов конфигурации в оболочках программаторов…
Да я имел ввиду общую картину, вспоминая пережигание К155РЕ3 и К556РТ4 в моей молодости. До сих пор где то валяется К155РЕ3 с прошитой мигалкой для гирлянды) Вот бы её найти и помигать)
Кстати, в далеком 1987 году я работал на военизированном заводе по выпуску полупроводниковых приборов. Вот как раз такие, что у тебя в авке и проверял на брак. Ох сколько их у меня было тогда, разных причем. Пораздарил все…
Огроменное спасибо за калькулятор фьюзов! Больше не надо самому все подбирать и боятся что не там галку поставил.
Эх, вот бы Ваши статейки почитать тогда, пару лет назад, когда я только начинал познавать что такое микроконтроллер! Толково пишите!