Фьюзы микроконтроллеров avr – как и с чем их едят

CAMOKAT-BETEPAHA › Блог › Программирование микроконтроллеров. Фьюzzы

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

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

Для просмотра и настройки байтов конфигурации микроконтроллеров я советую пользоваться онлайн калькулятором: homes-smart.ru/fusecalc/?…=avrstudio&part=ATtiny13A Ссылка сразу же ссылается на ATtiny13A Выбираем нужные строчки или ставим нужные галки в конфигурации и ниже видим биты конфигурации, а в левом верхнем углу видим байты конфигурации. Можно делать наоборот: выставить например байт конфигурации и посмотреть получившиеся строчки. В интернете есть выбор онлайн калькуляторов, можно подобрать себе по вкусу, погуглив фразу “онлайн калькулятор фьюзов”

Байт конфигурации бывает нижним LOW и верхним HIGHT. Правда есть еще extended байт, но конкретно в ATtiny13A этот байт фьюзов не используется — про него молчим.

Нижний байт конфигурации, от старшего бита к младшему:

SPIEN. — разрешение последовательного программирования. Если используете последовательный SPI программатор, то этот бит не изменить. Логично. По умолчанию разрешено.

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

WDTON — включить сторожевой таймер. Если используете сторожевой таймер, то необходимо разрешить этот бит. По умолчанию запрещен.

Напоминаю, чтоб сторожевой таймер работал в коде программы, необходимо его проинициализировать и выбрать предделитель, например

говорит о том, что сторожевой таймер включен с делителем 256k с выключеным прерыванием по таймауту. Затем в теле программы втыкаем ассемблерные вставки сброса сторожевого таймера

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 интерфейсу.

Доктор фьюзов для AVR

Всем привет! Наверное у каждого, кто занимается или занимался прошивкой микроконтроллеров были случаи, когда вы неправильно зашивали фьюз-биты и тем самым приводили микроконтроллер в «залоченное» состояние. В этой статье я расскажу о том, как сделать AVR doctor. AVR doctor – это устройство, которое позволяет вернуть к жизни микроконтроллер с неправильно прошитыми фьюзами. Идея собрать его появилась у меня после того, как испортил 3 микроконтроллера ATtiny2313. Выбросить их было жалко, поэтому и решил их «вылечить».

Схема доктора фузов

Вот принципиальная схема данного устройства:

Итак, приступим к сборке.

1) Печатная плата

Так как дорожки на плате не очень узкие, можно изготовить плату по технологии ЛУТ. Я так и сделал, но принтер у меня печатает не очень хорошо, поэтому получилось не совсем удачно. На фото процесс изготовления платы.

Сборка устройства

Для сборки нам понадобится:

1. Резисторы:

Читайте также:  Устройство автоматического отключения аудио-аппаратуры от сети

10к-1шт.
4,7к-2шт.
1к-19шт.
330 Ом – 1шт.

2. Конденсаторы:

100 мкФ 16в. – 1шт.
10 мкФ 16в. – 1шт.
10 нФ – 1шт.

3. Транзисторы:

BC547 – 1шт.
BC557 – 2шт.

4. Светодиоды – 2 шт. (красный и зеленый)

5. Панели под микроконтроллеры

40 выводов – 1шт.
28 выводов – 2шт.
20 выводов – 1шт.

6. Кнопка 4-х контактная – 1 шт.

7. Терминальный блок на 2 контакта – 1шт.

8. Стабилизатор напряжения 7805 в корпусе ТО-220 – 1 шт.

Вот собственно и все детали. Можно приступать к сборке АВР доктора.

Первым делом, нужно залудить контактные площадки на плате. Я обычно покрываю слоем припоя всю плату, так надежнее. Следует внимательно осмотреть плату на обрыв дорожек и другие дефекты. После того, как залудили плату, её нужно обмыть от флюса. Для этого можно воспользоваться водой с мылом или моющим средством. Если флюс не отмывается или вы использовали канифоль, следует промыть плату ацетоном или спиртом. Если нет не того, не другого, можете промыть плату перекисью водорода или на крайний случай растворителем. (при использовании растворителя, плата в дальнейшем будет иметь не очень приятный запах).

Когда все элементы впаяны, нужно еще раз промыть плату. После того как она высохнет, возьмите увеличительное стекло и внимательно осмотрите плату. Я иногда нахожу на плате сопли и непропаянные места. Если вы устраните все найденные дефекты до первого включения платы, вы можете избежать неприятностей. Вот так выглядит готовая плата:

Прошивка микроконтроллера

Следующим этапом будет прошивка микроконтроллера. Для этого вам нужно иметь:

  1. Микроконтроллер ATmega 8
  2. Программатор для AVR микроконтроллеров.

Чтобы прошить микроконтроллер нужно иметь программатор и компьютер с соответствующим программатору ПО. Я использую AVR Studio 4. Прошивку оставлю в архиве вместе с печатной платой и принципиальной схемой.

Фьюз-биты нужно установить следующим образом:

Lock Bits = 0x 3F; High Fuse = 0x D1; Low Fuse = 0x E1; Ext. Fuse = 0x 00

Если микроконтроллер успешно прошит, можно приступать к разблокировке микроконтроллеров. Для этого вставьте прошитую атмегу в панельку возле светодиодов. А «залоченный» мк вставьте в соответствующую ему пустую панельку. Далее нужно подключить питание к плате через терминальный блок, который вы припаяли. Напряжение следует подавать 6-12 вольт, иначе плата не запуститься. Когда питание подключили загорится красный светодиод (если конечно вы все правильно собрали).

Если светодиод горит, то нажимайте на кнопку. Должен загореться зеленый светодиод, а красный погаснет. Если все так и произошло, то поздравляю – плата собрана правильно и вы разблокировали микроконтроллер.

Теперь несколько слов о джампере, который стоит на плате. Если вы поставите на него перемычку, то при разблокировке МК также очиститься его память, то есть удалиться прошивка. Если же перемычки не будет – прошивка сохраниться.

Если при нажатии на кнопку не произошли действия описанные выше, то что-то пошло не так как нужно. Причина может быть в том, что вы ошиблись при сборке платы или прошивке атмеги. Также причина может быть в том, что микроконтроллер, который вы хотите восстановить, неисправен. Дополнительная информация – на форуме. Всем удачи!

Как восстановить неправильно выставленные фьюзы в ATtiny

Привет всем хабраюзерам. Думаю многие, кто занимается микроконтроллерами, имеют небольшой опыт в «блокировке» микроконтроллера неправильно выставленными фьюз-битами, например, неправильные настройки тактирования, в частности — очень низкая частота, например 16 КГц.

Так же данный метод должен подойти для случаев, когда были случайно изменённые фьюз-биты RSTDISBL, а конкретнее — порт RESET используется как порт ввода/вывода или же небрежное отношение к фьюз-биту SPIEN(разрешение на последовательное программирование), всё это исключает прошивку классическим способом по протоколу SPI(In-System Programming).

В этом видео я расскажу, и покажу, как можно разблокировать микроконтроллеры из серии ATtiny у которых не правильно выставленные фьюз-биты.

Данный метод годиться не для всех ATtiny, но подходит для большинства популярных, вот их список:

  • ATtiny13;
  • ATtiny24;
  • ATtiny25;
  • ATtiny44;
  • ATtiny45;
  • ATtiny84;
  • ATtiny85.

На видео я показал как можно восстановить заводские фьюз-биты при помощи Arduino, по сути информация представлена ниже дублируется в видеоформате.

Скажу сразу, за основу взят проект товарища Wayne Holder, за что ему большое спасибо, вот ссылка на его статью.
Итак, приступим, вот схема подключения на примере ATtiny13:

А вот так данная схема выглядит в моём исполнении:

Про подключение к ATtiny25/45/85/24/44/84 будет ниже.

Как Вы можете видеть, схема состоит из 6 резисторов номиналом в 1 КОм, 1 NPN транзистора 2n3904, вот его распиновка:

Можно взять советский КТ315, или его аналоги, ну собственно источника напряжения 11.5-12.5 В, как рекомендуют инженеры из ATmel в документациях к тех микроконтроллерах что упомянуты выше. Не думаю, что стоит завышать или занижать напряжение, так что перед восстановлением советую проверить напряжение на источнике питания вольтметром или мультиметром. На момент съёмки видео, напряжение на моём аккумуляторе было 12.4 В.

Пару слов где можно взять 12 В — это разного рода блоки питания для роутеров или модемов, вот например, мой DSL модем ASUS DSL-N10E как раз имеет 12 В блок питания, как правило на каждом блоке питания указано напряжение.
Так же 12 В можно взять из разъёма MOLEX компьютера:

А если точнее — жёлтый и чёрный.

Стоит упомянуть, что нужно соблюдать повышенную осторожность при подключении 12 В части, потому, что это напряжение запросто палит как микроконтроллеры так и другую периферию Arduino, например преобразователь USB-TTL, ссылаюсь на личный опыт. Поэтому следуем алгоритму:

  • Собираем схему;
  • Подаем питание на Arduino подключив к юсб;
  • Подаём +12В на транзистор;
  • Восстанавливаем микроконтроллер;
  • Отключаем +12В.

Именно таким образом я сбрасывал фьюз-биты ATtiny13(использовал порт Reset как порт ввод/вывода), уже раз 10-15 при отладке одного моего проекта, вот краткое его видео превью:

Подключаем к другим микроконтроллерам наш «восстановитель фьюз-битовов» следующим образом:

  • Порт RST ATtiny подключается между резистором на 1 КОм, тот что подключается к +12В, и коллектором транзистора VT1;
  • 13-й пин Arduino, он же PB5, подключается через резистор на 1 КОм к базе транзистора VT1;
  • 12-й пин Arduino, он же PB4, подключается через резистор на 1 КОм к SCI (Target Clock Input) ATtiny;
  • 11-й пин Arduino, он же PB3, подключается через резистор на 1 КОм к SDO (Target Data Output) ATtiny;
  • 10-й пин Arduino, он же PB2, подключается через резистор на 1 КОм к SII (Target Instruction Input) ATtiny;
  • 9-й пин Arduino, он же PB1, подключается через резистор на 1 КОм к SDI (Target Data Input) ATtiny;
  • 8-й пин Arduino, он же PB0, желательно подключить через резистор на 100-330 Ом к VCC ATtiny, на всякий случай.
  • GND — разумеется общий провод или другими словами «земля».

Всё это переназначается в коде, никаких проблем.

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

Моя предыдущая статья про то как превратить Arduino в полноценный AVRISP программатор. Там же можно почитать про упомянутый в видео софт по прошивке микроконтроллера.

Так же рекомендую посетить немного другой проект товарища Wayne Holder:

Суть та же, только не нужно искать источник 12 В.

4a4ik

30 октября 2013 г.

Как настроить Фьюзы на AVR и для чего они нужны

Фьюзы или fuse-биты, с их помощью можно настраивать некоторые параметры микроконтроллеров, как частота, зашита от копирования прошивки и т.д. Их 2 байта старший и младший.

Фьюзы различаются от МК к МК. Самое лучшее описание нужно всегда искать в даташите на определённый микроконтроллер.

Читайте также:  Регулируемый стабилизатор напряжения/тока

В Atmel AVR принято что за состояние ВКЛЮЧЕНО отвечает 0 а ОТКЛЮЧЕНО 1. Что не много раздражает, т.к. привычнее наоборот. Это нужно учитывать при чтении документации и при записи фьюзов, так как разные прошивальщики используют разные нотации, у некоторых как в Atmel, у некоторых наоборот.

Перед изменением Фьюзов, ВСЕГДА нужно сначала прочитать какие биты уже выставлены, проверить бит SPIEN, он всегда активен иначе программатор не определит МК. По нему можно узнать какая нотация используется в программе. Если там нет галочки или 0 то нотация Атмеловская и можно копировать с даташита, иначе инверсная.

Группа битов CKSEL — определяют источник и частоту работающего тактового генератора. Ошибочная установка комбинации этих битов может сделать МК «мертвым» — он не будет работать в схеме без подачи тактового сигнала на ножку XTAL1. AVR может работать от внутреннего источника тактов до 8МГЦ, от кварца и от внешнего источника сигналов.

CKOPT — бит, определяющий амплитуду колебаний на выходе кварца, влияет на энергопотребление, если включить, то размах напряжения на кварце будет от 0 до напряжения питания и МК будет устойчивее к помехам, если отключить снизится энергопотребление.

RESERVED — этот бит зарезервирован фирмой Atmel. Ни при каких условиях не рекомендуется менять его состояние (т. е. надо оставлять его таким, как он установлен при изготовлении МК).

OCDEN — Позволяет читать программу из МК (On Chip Debug ENable). Используют когда не хотят чтобы кто-то использовал прошивку в другом МК.

JTAGEN — Разрешает подключение отладчика к JTAG, можно видеть что происходит в МК. Когда активен МК потребляет больше тока и нельзя использовать выводы отвечающие за JTAG.

SELFPRGEN — бит, разрешающей программе МК производить запись в память программ, т. е. производить самопрограммирование.

DWEN — Разрешающий работу DebugWire – это интерфейс отладки по одному проводу.

EESAVE — Позволяет сохранять данные в EEPROM после перепрошивки.

SPIEN —Бит разрешающий работу интерфейса внутрисхемного программирования МК по SPI. Если его отключить перепрошить МК простым способом будет невозможно.

WDTON — fuse бит, после установки которого сторожевой таймер Watch Dog включается сразу после подачи питания и не может быть отключен программно. Если бит не установлен, то включением и отключением WDT можно управлять программно. Этот таймер перезагружает процессор если его периодически не сбрасывать – профилактика зависаний.

Группа fuse битов BODLEVEL. Перезагружает МК если напряжение упадёт ниже уровня прописанного в этих битах.

BODEN — Включает BODLEVEL.

RSTDISBL — Превращает ножку RESET в обычный порт ввода/вывода, но пропадает возможность программировать МК.

CKDIV8 — fuse бит, включающий предварительное деление частоты тактового генератора на 8. То есть при включенном бите и применении кварца на 8 МГц реальная тактовая частота МК составит 1 МГц.

CKOUT — fuse бит, разрешающий вывод тактовой частоты на один из выводов МК (для тактирования других устройств).

SUT1 и SUT0 — Определяет скорость старта МК после рестарта или при подаче питания, от 4 до 65 мс.

PLLCK — fuse бит, разрешающий использование встроенного синтезатора частоты для тактирования ядра МК.

BOOTRST — fuse бит, определяющий адрес, с которого будет начато исполнение программы после сброса — если бит установлен, то начало программы будет не с адреса 0000h (как обычно), а с адреса области загрузчика (Boot Loader).

Группа fuse битов BOOTSZ — два fuse бита, определяющие размер области памяти программ, выделяемой для загрузчика (Boot Loader). Комбинация этих битов, в частности, определяет точку начала исполнения программы после сброса, если установлен бит BOOTRST.

МИКРОКОНТРОЛЛЕРЫ AVR: FUSE-БИТЫ

В данном обзоре рассмотрим, что же такое fuse-биты и для чего они нужны, так как это вызывает много непонимания (да и разработчики прошиващего софта вертят их как хотят). В результате этого контроллеры AVR кучами складываются в коробки до «лучших времен». Для примера рассмотрим fuse-биты на примере МК ATMega8. Для других типов контроллеров AVR назначение уточняются в даташите на конкретный МК (не ленитесь читать документацию). Итак, поехали! Все фьюз-биты МК разделены на 2 байта – старший (Fuse High Byte) и младший (Fuse Low Byte). Разбор конечно же начнем со старшего байта.

RSTDISBL – определение режима работы пина RESET. Данный пин может работать в 2-х режимах как вывод внешнего сброса или как порт ввода-вывода.
RSTDISBL=1 – пин настроен на работу как вывод внешнего сброса.
RSTDISBL=0 – пин работает как порт ввода-вывода. Данный режим работы отключит возможность последовательного программирования и поможет только параллельный программатор.
WDTON – включение и отключение сторожевого таймера (Watch Dog Timer), который выполняет защиту от зависания программы, выполняемой МК. В основном применяется в ответственных программах, где зависание нежелательно.
WDTON=1 – сторожевой таймер отключен (можно включить программно через бит WDT регистра WDTCR).
WDTON=0 – сторожевой таймер включен (программно отключить не получится).
SPIEN – разрешение последовательного программирования.
SPIEN=0 – последовательное программирование разрешено.
SPIEN = 1 – последовательное программирование запрещено.
Если отключить режим последовательного программирования, то сможет помочь только параллельный программатор. Во многих программах для прошивки данный бит изменить нельзя (чекбокс недоступен).
CKOPT – бит опций тактового генератора. Его разберем позже, когда доберемся до младшего байта.
EESAVE — бит защиты данных, хранящихся в EEPROM памяти при стирании микросхемы. Если данный бит не установлен, т.е. EESAVE = 1, то при стирании микросхемы затрутся данные, хранящиеся в EEPROM.
BOOTSZ1…0 – биты определяющие объем flash-памяти, отводимой под бутлоадер.
Бутлоадер – это набор команд, даже точнее – это программа, которая болтается в конце flash-памяти МК, способная принимать данные от внешних устройств при наступлении какого-либо события и заносить их во flash-память. Бутлоадер применяется в основном для прошивки МК без использования спецпрограмматора.
BOOTRST – бит, определяющий с какого места начнется загрузка контроллера после сброса.
BOOTRST = 1 – загрузка начнется с нулевого адреса
BOOTRST = 0 – загрузка начнется с адреса начала области flash-памяти, выделенной под бутлоадер.
Вот и добрались до младшего байта.

BODLEVEL и BODEN – биты, управляющие схемой мониторинга напряжения питания контроллера (Vcc). Если напряжение опуститься ниже установленного битом BODLEVEL, то МК сброситься и будет держаться в режиме сброса, пока напряжение не превысит установленный порог.

BODLEVEL = 1 – пороговое напряжение равно 2,7В.
BODLEVEL = 0 – Пороговое напряжение равно 4В.
BODEN = 1 – схема мониторинга неактивна.
BODEN = 0 – схема мониторинга напряжения питания активна.
SUT1…0 – биты, определяющие время запуска микроконтроллера (см. режимы работы тактового генератора). После подачи на МК питания, выхода его из режима энергосбережения или после сброса, МК начинает работать не сразу, а по истечении определенного времени. Как раз это время и задают данные биты. Если время старта не важно, то ставим максимум SUT1…0 = 11. Все операции, выполняемые контроллерам, производятся по импульсам, приходящим от тактового генератора. Тактовый генератор может быть встроенным в МК, либо быть внешним.

Внутренний генератор может работать в нескольких режимах:

— с внутренней задающей RC-цепочкой;
— с внешней задающей RC-цепочкой;
— с внешним задающим кварцевым или керамическим резонатором.
При работе контроллера от внешнего тактового генератора на его вход XTAL1 подаются прямоугольные импульсы от какого-либо внешнего генератора:
Все эти режимы работы задаются битами CKSEL3…0.

Внутренний генератор с внутренней задающей RC-цепочкой

Все МК типа ATMega8 поставляются с завода со значением битов CKSEL3…0=0001, т.е. настроены на работу с тактовой частотой 1 МГц от внутреннего генератора с внутренней задающей RC-цепочкой. Время старта в данном режиме работы определяется по таблице:

Внутренний генератор с внешней задающей RC-цепочкой

Согласно даташиту емкость конденсатора должна быть не менее 22 пФ. При условии, что CKOPT=0 между выводом XTAL1 и GND подключается внутренний конденсатор емкостью 36 пФ и внешний конденсатор можно исключить. Частота задающей RC-цепочки определяется соотношением f=1/(3RC). В соответствии с выбором RC-цепочки биты CKSEL3…0 устанавливаются в соответствии с таблицей:

Читайте также:  Стабилизатор внешнего питания видеокамеры

Время старта в данном режиме определяется по таблице:

Частота тактового генератора будет определяться частотой кварца. При выбранной частоте кварца биты CKSEL3…1 выбираем из таблицы:

Комбинация CKSEL3…1 = 101 должна использоваться только с керамическим резонатором (см. примечание под таблицей). Время старта выбирается из таблицы:

При работе тактового генератора с внешним резонатором значение бита CKOPT определяет режим работы усилителя тактового генератора для раскачки резонатора. При CKOPT = 0 амплитуда колебаний максимальна, что дает устойчивость к помехам и возможность работать на всем диапазоне частот. При CKOPT = 1 амплитуда колебаний меньше (генератор работает в экономном режиме) и возможны сбои при работе контроллера из-за различных помех. Так что если нет жестких требований к энергосбережению устройства, то CKOPT = 0. Кроме работы с высокочастотными резонаторами, контроллер способен работать также на частотах так называемых часовых кварцев (32768 Гц). Для этого значение CKSEL3…0 = 1001. При CKOPT = 0 между XTAL1 и GND, и XTAL2 и GND подключаются внутренние конденсаторы, а внешние конденсаторы в данном случае можно исключить. Время старта определяется из таблицы:

Для выбора данного режима устанавливаем CKSEL3…0 = 0000. Установка CKOPT = 0 позволяет подключить между XTAL1 и GND, и XTAL2 и GND внутренние конденсаторы 36 пФ (зачем?). Время старта опять же определяется из таблицы:

Кроме младшего и старшего fuse-байтов в окне прошивальщика можно увидеть Lock Bit Byte – так называемый байт защиты. С помощью изменения значения битов данного байта можно запрещать и разрешать доступ к памяти программ (flash-памяти), EEPROM и области бутлоадера. Можно сказать, что биты этого байта предназначены для защиты того, что есть в контроллере. В основном это надо разработчику, чтобы защитить свой интеллектуальный труд от кражи и обычному пользователю эти биты особо неинтеесны.

Немного о прошивающем софте

Немало косяков с залочкой контроллеров возникает из-за прошивающего софта. В каких-то программах галка в чекбоксе означает 0, а в каких-то 1. Перечислять значения галки в каждой программе бесполезно, так как этих программ навалом. Поэтому дам совет, как определить who is who. Берем МК и подключаем его к последовательному программатору, заходим в режим программирования fuse-битов и считываем все байты. Смотрим значение бита SPIEN. Т.к. последовательное программирование разрешено, то SPIEN = 0. А теперь смотрим что стоит в чекбоксе напротив данного бита. Если стоит галка, то в данной программе это означает 0, если чекбокс пуст, то галка в данной программе означает 1. При прошивке всегда шейте первым делом прошивку, а fuse-биты в самую последнюю очередь, т.к. fuse-биты могут быть настроены не от работы тактового генератора с внутренней RC-цепочкой или вообще в данной схеме пин RESET используется как обычный порт. Перед прошивкой fuse-битов всегда делайте их считывание, т.к. при выставлении только нужных битов остальные зашьются как есть на экране. Автор статьи: skateman.

Про Ардуино и не только

воскресенье, 19 августа 2018 г.

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

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

Фьюзы (от английского 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 (не запрограммирован)
CKSEL0Select 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 (запрограммирован)
BOOTRSTSelect Reset Vector0 (запрограммирован)

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

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

Таким образом, значения конфигурационных байтов в ATmega328/P по умолчанию: Low: 0x62, High: 0xD9, Extended: 0xFF. Обратите внимание, это значения именно для “чистого” микроконтроллера ATmega328/P , а не для Ардуино. Значения фьюзов для Ардуино можно найти в файле Arduino_dirhardwarearduinoavrBoards.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

CKOUT

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

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector