Компьютерные подсказки

Вылетает Сталкер: Зов Припяти Программа икс рей 1

Stalker lost alpha гид по прохождению

Pony Express отслеживание почтовых отправлений

Pony Express – время и сроки доставки с Алиэкспресс в Россию

Застряли посылки с Алиэкспресс со статусом Hand over to airline: что делать?

РФ (Nigma) — интеллектуальная поисковая система

Данные для семантики — Яндекс Вордстат

Пиар ВКонтакте при помощи бирж: особенности и использование

Почему я не могу отправить сообщение?

Предупреждение «Подключение не защищено» в Google Chrome по протоколу https Нарушена конфиденциальность данных яндекс браузер

Всё что известно о смартфоне Samsung Galaxy S9 Аккумуляторная батарея Galaxy S9 и мощность

Темы оформления и русификация форума SMF, а так же установка компонента JFusion в Joomla

Автоматическое определение движка форума Позже board powered by smf

Коды в игре скайрим - зелья, ингредиенты, заклинания Код на ингредиенты скайрим

Подробная инструкция, как в "скайриме" открыть дверь золотым когтем

Atmega8 биты конфигурации. Все что нужно знать о Fuse- и Lock-битах AVR микроконтроллеров

В данном обзоре рассмотрим, что же такое fuse-биты и для чего они нужны, так как это вызывает много непонимания (да и разработчики прошиващего софта вертят их как хотят). В результате этого контроллеры AVR кучами складываются в коробки до «лучших времен». Для примера рассмотрим fuse-биты на примере МК ATMega8. Для других типов назначение уточняются в даташите на конкретный МК (не ленитесь читать документацию). Итак, поехали! Все фьюз-биты МК разделены на 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 .


Все МК типа ATMega8 поставляются с завода со значением битов CKSEL3…0=0001 , т.е. настроены на работу с тактовой частотой 1 МГц от внутреннего генератора с внутренней задающей 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.

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

Но без знания этой особенности контроллера далеко не уедешь. Так что распишу все по порядку. У разных версий контроллеров число FUSES разное, какие то могут отсутствовать, но основные есть всегда. Вот по ним и пройдемся.

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

Итак, главное:

В Atmel AVR принята следующая нотация: сброшенный в ноль fuse bit считается активным, т.е. включенным.

Пример Бит RSTDSBL, как можно догадаться из названия, это RESET DISABLE. Включил эту опцию и у тебя нога RESET превращается в порт ввода-вывода, но за это ты теряешь возможность перешить контроллер через ISP.

Так вот, чтобы выключить RESET (и получить большое западло с прошивкой в обмен на мелкую подачку в виде дополнительной ножки) в этот бит надо записать 0.

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


Однако контроллеры делают электронщики, а прошивающие программы — программисты. Как бы логично. И вот эти программисты взяли и заварили адскую путаницу с галочками. Нет бы им раз и навсегда принять за стандарт, что галочка это 1, а не ВКЛЮЧЕНО (что, напомню, является нулем). И поэтому в одних прошивающих программах галочка означает, что опция включена (в FUSE бит записывается 0),в других, обычно написанных электронщиками, галочка означает единицу. Т.е. с точностью до наоборот.

А что будет если перепутать? А будет ОЧЕНЬ плохо. Контроллер войдет в неправильный режим и может заблокируется наглухо. Т.е. раз прошил и все. Приехал.

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

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

Конфигурация тактового сигнала
По умолчанию все контроллеры AVR (кроме старых серий AT90S2313, AT90S8535 итд) сконфигурированы так, чтобы работать от внутреннего источника тактов. Т.е. стоить подать на них питание и они начинают работать. Ничего больше и не нужно.

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

  • CKSEL3…0 = 0000 — Внешний источник сигнала.

Т.е. на вход XTAL1 подаются прямоугольные импульсы. Такое иногда делают в синхронных системах, когда несколько контроллеров работают от одного генератора.

Техническое отступление
В этот режим часто попадают, когда пытаются выставить контроллер на работу от внешнего кварца (CKSEL=1111), но либо путают нотацию, либо из-за прикола с обратной нотацией битов во всяких извратских прошивающих программах. Раз и кристалл заблокировался. Но, на самом деле, наглухо, с помощью CKSEL, заблокировать кристалл нельзя. Обычно все решается напайкой кварца и запуском от этого кварца. Худшее же что может случиться — потребуется внешний генератор тактов. Который бы оживил кристалл. Делается он за пять минут из любой микросхемы ТТЛ логики, например из К155ЛА3 — схем в инете навалом. Или на таймере 555, либо можно взять второй МК и на нем написать простую программку, дрыгающую ножкой. А если есть осциллограф, то с него можно поиметь сигнал контрольного генератора — его клемма должна быть на любом осциле. Землю осцила на землю контроллера, а выход генератора на XTAL1.

Но что делать если зуд нестерпимый, контроллер залочен, а никакой микросхемы для реанимации под рукой нету? Тут иногда прокатывает метод пальца. Прикол в том, что на тело человека наводится весьма нефиговая наводка частотой примерно 50Гц. Всякий кто хватался за щупы осциллографа руками помнит какие шняги тут же возникают на экране — вот это оно! А почему бы эту наводку не заюзать как тактовый сигнал? Так что припаиваешь к выводу XTAL1 провод, хватаешься за него рукой, и жмешь на чтение или запись контроллера:) Предупреждаю сразу, метод работает через жопу, далеко не с первого раза, читает долго и порой с ошибками, но на перезапись FUSE битов в нужную сторону должно хватить. Пару раз у меня такой фокус получался.

CKSEL3…0 = 0100 – 8 MHz от внутреннего генератора(обычно по умолчанию стоят такие)
Для большинства AVR такая конфигурация CKSEL означает тактовку от внутреннего генератора на 8Мгц, но тут могут быть варианты. Так что в этом случае втыкай внимательно в даташит. В табличку Internal Calibrated RC Oscillator Operating Modes

Иногда нужно иметь внешний тактовый генератор, например, чтобы его можно было подстраивать без вмешательства в прошивку. Для этого можно подключить RC цепочку, как показано на схеме и подсчитать частоту по формуле f = 1/3RC , где f будет частотой в герцах, а R и С соответственно сопротивлением резистора и емкостью конденсатора, в омах и фарадах.

  • CKSEL3…0 = 0101 – для частот ниже 0.9 MHz
  • CKSEL3…0 = 0110 – от 0.9 до 3 MHz
  • CKSEL3…0 = 0111 – от 3 до 8 MHz
  • CKSEL3…0 = 1000 – от 8 до 12 MHz

Данная табличка справедлива только для ATmega16 у других МК может отличаться. Уточняй в даташите!

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

  • CKSEL3…0 = 1001 — низкочастотный «часовой» кварц.

На несколько десятков килогерц.
Используется в низкоскоростных устройствах, особенно когда требуется точная работа и низкое потребление энергии.

Для обычных кварцев ситуация несколько иная. Тут максимальная частота кварца зависит также и от бита CKOPT когда CKOPT = 1 то:

  • CKSEL3…0 = 1010 или 1011 — от 0,4 до 0.9 MHz
  • CKSEL3…0 = 1100 или 1101 — от 0,9 до 3 MHz
  • CKSEL3…0 = 1110 или 1111 – от 3 до 8 MHz (либо от 1 до 16Мгц при CKOPT=0)

А если CKOPT равен 0 то при тех же значения CКSEL можно поставить кварц от 1 до 16MHz.

Разумеется, кварц на 16MHz можно поставить только на Мегу без индекса ”L”. (Хотя, как показывает практика, Lку тоже можно неслабо разогнать. У меня ATMega8535L заработала на 16Мгц, но были странные эффекты в работе. Поэтому я не стал так извращаться и разгон снял). Опять же, все выше сказанное в точности соответствует только Меге 16, у других может незначительно отличаться.

Бит CKOPT задает размах тактового сигнала. Т.е. амплитуду колебаний на выходе с кварца. Когда CKOPT = 1 то размах маленький, за счет этого достигается меньшее энергопотребление, но снижается устройчивость к помехам, особенно на высоких скоростях (а предельной, судя по таблице выше, вообще достичь нельзя. Точнее запуститься то он может запустится, но вот надежность никто не гарантирует). А вот если CKOPT активизировать, записать в него 0, то размах сигнала сразу же станет от 0 до питания. Что увеличит энергопотребление, но повысит стойкость к помехам, а значит и предельную скорость. При оверклокинге МК тем более надо устанавливать CKOPT в 0.

Также стоит упомянуть бит SCKDIV8 которого нет в Atmega16, но который часто встречается в других контроллерах AVR. Это делитель тактовой частоты. Когда он установлен, т.е. в нуле, то частота выставленная в битах CКSEL0…3 делится на 8, на чем в свое время прилично застрял Длинный, долго пытаясь понять чего это у него западло не работает. Вся прелесть в том, что этот делитель можно отключить программно, записав в регистр CLKPR нужный коэффициент деления, например один. Весь прикол в том, что SCKDIV8 активен по дефолту! Так что внимательней!

Биты SUT задают скорость старта МК после снятия RESET или подачи питания. Величина там меняется от 4ms до 65ms. Мне, за всю практику, пока не довелось эту опцию использовать — незачем. Так что ставлю на максимум 65ms — надежней будет.

Бит RSTDISBL способен превратить линию Reset в одну из ножек порта, что порой очень нужно когда на какой-нибудь крошечной Tiny не хватает ножек на все задачи, но надо помнить, что если отрубить Reset то автоматически отваливается возможность прошивать контроллер по пяти проводкам. И для перешивки потребуется высоковольтный параллельный программатор, который стоит несколько тысяч и на коленке сделать его проблематично, хотя и возможно.

Второй заподлянский бит это SPIEN если его поставить в 1, то у тебя тоже мгновенно отваливается возможность прошивать по простому пути и опять будет нужен параллельный программатор. Впрочем, успокаивает то, что сбросить его через SPI невозможно, по крайней мере в новых AVR (в старых, в AT90S*** было можно)

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

BODLEVEL и BODEN — это режим контроля за напряжением. Дело в том, что при определенном пороге напряжения, ниже критического уровня, контроллер может начать сильно глючить. Самопроизвольно может запортачить, например, EEPROM или еще что откосить. Ну, а ты как думал, не покорми тебя с пару недель — тоже глючить начнешь:)

Так вот, для решения этой проблемы есть у AVR встроенный супервизор питания. Он следит, чтобы напруга была не ниже адекватного уровня. И если напруги не хватает, то просто прижимает RESET и не дает контроллеру стартовать. Вот эти два фуза и рулят этой фичей. BODEN включает, а BODLEVEL позволяет выбрать критический уровень, один из двух. Какие? Не буду раскрывать, посмотри в даташите (раздел System Control and Reset).

JTAGEN — Включить JTAG. По умолчанию активна. Т.е. JTAG включен. Из-за этого у MEGA16 (а также 32 и прочих, где есть JTAG) нельзя использовать вывода порта C, отвечающие за JTAG. Но зато можно подключать JTAG отладчик и с его помощью лезть контроллеру в мозги.

EESAVE — Защита EEPROM от стирания. Если эту штуку включить, то при полном сбросе МК не будет стерта зона EEPROM. Полезно, например, если в EEPROM записываются какие-либо ценные данные по ходу работы.

BOOTRST — перенос стартового вектора в область бутлоадера. Если эта галочка включена, то МК стартует не с адреса 00000, а с адреса бутсектора и вначале выполняет бутлоадер. Подробней про это было написано в статье про прошивку через лоадер.

BOOTSZ0..1 — группа битов определяющая размер бут сектора. Подробней смотри в даташите. От контроллера к контроллеру они отличаются.

Lock Bits
Это, собственно, и к фузам то отношения не имеет. Это биты защиты. Установка этих битов запрещает чтение из кристалла. Либо флеша, либо ЕЕПРОМА, либо и того и другого сразу. Нужно, только если ты продаешь свои устройства. Чтобы злые конкуренты не слили прошивку и не заказали в китае более 9000 клонов твоего девайса, оставив тебя без штанов. Опасности не представляют. Если ты заблокируешь ими кристалл, то выполни полное стирание и нет проблемы.

Характерной особенностью установленных лок битов является считываемая прошивка — в ней байты идут по порядку. Т.е. 00,01, 02, 03, 04… FF, 00… Видел такую срань? Значит не судьба тебе спереть прошивку — защищена =)

Техника безопасности
И главное правило при работе с FUSE битами — ВНИМАНИЕ, ВНИМАНИЕ и ЕЩЕ РАЗ ВНИМАНИЕ! Не выставляйте никогда FUSE не сверившись с даташитом, даже если срисовываете их из проверенного источника.

Обязательно разберитесь что означает галочка в прошивающей программе. Ноль или единицу. Включено или выключено! Стандарта нет!!!

Если фуз биты задаются двумя числами — старший и младший биты, то выставляются они как в даташите. Где 0 это включено.

Второе, железное, правило работы с FUSE. Запомните это навсегда и не говорите, что я не учил.

ВНАЧАЛЕ ЧИТАЕМ ТЕ ЧТО ЕСТЬ, ПОТОМ ЗАПИСЫВАЕМ ТЕ КОТОРЫЕ НАДО НАМ

Чтение — модификация — запись. ТОЛЬКО так. Почему? Да просто часто бывает как — открыл вкладку FUSE, а программатор попался тупой и сам их не считал. Как результат — у тебя там везде пустые клеточки. Довольный, выставил только те, что тебе надо SKSEL, а потом нажал WRITE. Тут то и наступает, Обычно, кабздец. Т.к. в контроллер записываются не только те, что ты изменишь, а ввобще вся секция. С теми самыми пустыми клеточками. Представь какой трешняк там будет. То то же! А потом бегут жаловаться по комментам и форумам, мол я ничего такого не трогал — оно само. Ага, щаз!

Так что, еще раз — Чтение, Модификация, Запись!

Подсказка:
Как с одного взгляда определить какого типа (прямые или инверсные) fuse биты в незнакомой прошивающей проге?
Дедуктивный метод: Нажмите чтение Fuses и посмотрите на состояние бита SPIEN Этот бит всегда активен, а если он будет сброшен, то программатор контроллер даже определить не сможет. Если SPIEN в 1 — значит фьюзы инверсные, как в PonyProg. Если ноль — значит по нотации Atmel.

Установка Fuse- и Lock-битов (битов конфигурации и блокировки) микроконтроллеров (МК) семейства AVR, особенно для начинающих, является достаточно сложной задачей и не редко может вызывать путаницу при настройке и программировании МК. Если вы какой-то бит пропустили или установили неверно, это может привести к неправильной работе программы или, что еще хуже, к невозможности запрограммировать МК внутрисхемно по последовательному интерфейсу.

Несмотря на то, что в технической документации на каждый МК дается исчерпывающая информация по Fuse- и Lock-битам, новички часто чувствуют себя несколько неуверенно перед выполнением команды записи битов конфигурации и блокировки. В статье мы рассмотрим основные особенности битов конфигурации МК семейства AVR.

Fuse- и Lock-биты

Перед тем как мы приступим к подробному разбору битов конфигурации, нужно уяснить и запомнить один момент:

  • Fuse-бит = 1, означает, что он незапрограммирован (сброшен, неактивен);
  • Fuse-бит = 0, означает, что он запрограммирован (установлен, активен).

Это один из основных источников возникающей путаницы в процессе программирования Fuse- и Lock-битов. Мы привыкли думать, что установить значение какого-либо параметра означает записать 1, верно? С Fuse-битами AVR - наоборот, установка какого-либо бита означает запись 0, и это нужно помнить.

Биты конфигурации расположены в отдельной области энергонезависимой памяти. К примеру, МК имеет четыре конфигурационных байта, которые необходимо запрограммировать для корректного функционирования. Один из этих байтов содержит биты блокировки, оставшиеся три (часто именуемые старший, младший и расширенный) - содержат конфигурационные биты. Этот набор битов устанавливает начальные настройки МК: источник тактового сигнала, область загрузчика, функционирование аппаратного сброса, сторожевого таймера и пр. Сначала мы рассмотрим биты блокировки (Рисунок 1).

В зависимости от типа микроконтроллера AVR количество Lock-битов может быть различным, но два младших бита всегда присутствуют. Биты LB1 и LB2 используются для блокировки доступа к встроенной Flash-памяти. Вы, наверное, знаете, что разработчики каких-либо устройств практически всегда блокируют чтение прошивки МК, чтобы защитить свою интеллектуальную собственность и предотвратить создание дубликатов и подделок. Чтение заблокированного микроконтроллера - это как конфета для аппаратных хакеров, но это отдельная тема. Так, если нужно защитить свою прошивку от копирования, необходимо заблокировать содержимое памяти микроконтроллера, в противном случае оставьте биты без изменения. Другие биты блокировки (BLB01, BLB02, BLB11 и BLB11 ) могут использоваться для блокировки записи/чтения в/из Flash-памяти, как из области приложения, так и из секции загрузчика. Биты блокировки довольно редко программируются (зависит от специфики приложения), мы не будем на них заострять внимание. Даже если вы запрограммируете любой из них - биты блокировки сбрасываются (устанавливаются в 1) во время выполнения команды полного стирания кристалла (Chip Erase).

Больше всего нас интересуют биты конфигурации, с ними вам придется иметь дело очень часто, хотите вы этого или нет. Расположение определенных Fuse-битов в трех байтах конфигурации отличается в зависимости от используемого МК. Для примера, мы рассмотрим ATmega328P, имеющий три байта конфигурации (Рисунок 2).

Рисунок 2. Состав конфигурационных байтов и начальные значения Fuse-битов микроконтроллера ATmega328P.

Посмотрите на состав младшего байта. Вы видите группу из 4 одинаковых битов CKSEL0, CKSEL1, CKSEL2, CKSEL3 . Они используются для выбора типа источника тактовых сигналов для микроконтроллера МК. По-умолчанию (заводские установки) микроконтроллер настроен на работу от внутреннего RC осциллятора 8 МГц. Логически это самый безопасный вариант работы с микроконтроллером. Но, как известно, приборы семейства AVR могут работать от различных источников тактовой частоты:

  • калиброванный внутренний RC осциллятор (по умолчанию 8 МГц);
  • внешний RC осциллятор;
  • внешний керамический или кварцевый резонатор;
  • внешний низкочастотный кварц;
  • внешний источник тактового сигнала.

Для каждого из представленных режимов тактирования имеется диапазон установок Fuse-битов CKSEL0..3 , которые используются для управления частотой тактового генератора и временем выхода микроконтроллера на рабочий режим из режима пониженного энергопотребления. Эти биты тесно связаны с битами SUT0 и SUT1 , фактически управляющими временем запуска микроконтроллера после подачи питания. Задержка запуска необходима для стабилизации генерации керамических резонаторов и кварцев. Точные значения времени выхода микроконтроллера на рабочий режим приводятся в технической документации.

Конфигурационный бит CKOUT разрешает/запрещает вывод тактовой частоты на один из выводов МК; для ATmega328P на вывод PORTB0 (для тактирования других устройств), причем независимо от того, какой используется источник тактирования МК. Если бит запрограммирован, то для пользовательского приложения основная и альтернативные функции порта PB0 недоступны.

Последний бит в младшем байте - CKDIV8 . По умолчанию этот бит установлен, что означает подключение к внутреннему RC осциллятору 8 МГц делителя частоты с коэффициентом 8, поэтому системная тактовая частота МК в этом случае будет равна 1 МГц. Если вам нужна тактовая частота 8 МГц, бит CKDIV8 нужно сбросить.

Теперь акцентируем внимание на старшем конфигурационном байте.

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

При использовании загрузчика немаловажное значение приобретают биты BOOTSZ0 и BOOTSZ1 . Они задают область Flash-памяти для загрузчика. Если программный код загрузчика вашего приложения имеет маленький объем, то с помощью битов конфигурации можно выделить область Flash-памяти меньшего размера для загрузчика, а остальное оставить для приложения.

Следующий бит EESAVE . Если его запрограммировать (0), то содержимое энергонезависимой памяти данных EEPROM останется нетронутым во время процедуры стирания кристалла (Chip Erase). В большинстве случаев это полезная функция, например, когда в EEPROM хранятся важные данные или калибровочные параметры и необходимо выполнить обновление прошивки, то перед заменой прошивки запрограммируйте бит EESAVE .

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

Бит SPIEN предназначен для отключения последовательного интерфейса программирования микроконтроллера. На самом деле вы не сможете изменить состояние этого бита используя последовательный интерфейс (МК AVR поддерживают еще два режима параллельного программирования), но известны случаи изменения состояния бита SPIEN при некорректной работе или сбое внутрисхемного программатора.

Аналогичная ситуация с битом RSTDSBL - он используется для отключения функции аппаратного сброса, другими словами вывод сброса МК используется как порт ввода/вывода. В некоторых ситуациях (МК с малым числом линий ввода/вывода) это очень удобно, но в целом не рекомендуется. Ошибочная установка бита RSTDSBL может лишить вас возможности программировать микроконтроллер по SPI, т. к. наличие сигнала сброса - обязательное условие включения режима программирования.

Бит DWEN используется для включения специального отладочного интерфейса DebugWire микроконтроллеров AVR. Изменить состояние битов SPIEN, RSTDSBL и DWEN по последовательному интерфейсу невозможно, для этого потребуется параллельный программатор с поддержкой высоковольтного режима программирования или подключение по интерфейсу DebugWire.

Следует отметить еще бит CKOPT в старшем байте конфигурации (в ATmega328P он отсутствует, но есть в других МК AVR), управляющий режимом работы усилителя тактового генератора. Если бит запрограммирован (0), то выходной сигнал тактового генератора имеет размах (амплитуду), равный напряжению питания. Использовать эту опцию можно, когда микроконтроллер будет работать в обстановке с высоким уровнем помех, а также когда планируется подключить еще один микроконтроллер к выводу XTAL2. В других случаях этот режим нужно отключить (CKOPT=1 ), поскольку увеличивается энергопотребление микроконтроллера, а это не приветствуется в устройствах с батарейным питанием.

Последний конфигурационный байт (расширенный). Для микроконтроллера Atmega328P в нем содержатся три бита: BODLEVEL0, BODLEVEL1, BODLEVEL2 . Эти биты предназначены для установки порога срабатывания схемы детектора напряжения питания: когда напряжения питания достигнет установленного уровня, произойдет сброс микроконтроллера.

Калькулятор значений Fuse-битов

Когда вам потребуется запрограммировать новый МК, для установки Fuse-битов вы можете воспользоваться техническим описанием на микроконтроллер. Но есть более удобный и простой способ - калькулятор Fuse-битов - онлайн инструмент, разработанный Марком Хаммерлингом (Рисунок 3). Вы самостоятельно выбираете тип микроконтроллера и включаете/выключаете необходимые опции, а конфигурация Fuse-битов будет обновляться автоматически.

Кроме того, вы можете индивидуально устанавливать Fuse-биты в отдельной форме, значения младшего, старшего и расширенного байта конфигурации также будут обновляться автоматически (Рисунок 4), одновременно генерируются команды для программатора AVRDude.

Если у вас есть мобильный телефон или планшетный ПК с ОС Android, можно воспользоваться бесплатным приложением AVR Fuse Calculator , которое выполняет те же функции и генерирует команды для программатора AVRDude. В базе данных программы 144 МК AVR.

Основные правила для новичков:

  • Никогда не изменяйте состояние битов DWEN, SPIEN и RSTDSBL. Фактически, по последовательному интерфейсу программирования к ним нет доступа;
  • Дважды проверьте биты CKSEL. Неправильная установка типа тактового генератора вызывает множество проблем;
  • Если вы не производите коммерческие продукты, не меняете состояние Lock-битов;
  • Если не уверены в правильности установки Fuse-битов, лучше обратитесь к технической документации или задайте вопрос на форуме специалистам.

Что же такое FUSE биты? Слова вроде бы знакомые, но многие толком и не знают их предназначение, ставят галочки и прошивают, работает устройство да и ладно. Я вам хочу рассказать немного про эти FUSE биты.

FUSE биты (фьюзы ) – ну если по простому, то они настраивают определенные параметры микроконтроллеров, это некий инструмент для их тонкой настройки Фьюзы включают или настраивают такие параметры как:
- частота генератора, внешний или внутренний генератор
- запрет на чтение прошивки микроконтроллера
- включение или выключение таймеров
- деление частоты кварцевого генератора
- защита EEPROOM от стирания
…и так далее. У каждого микроконтроллера выставляются свои фьюзы, у разных микроконтроллеров разный список фьюзов, например в ATmega8 нет фьюза CKOUT, но он присутствует в ATtiny2313. В даташитах к микроконтроллерам все эти фьюзы расписаны.

Главное правило при работе с фьюзами – не торопиться их выставлять, если вы точно не уверены в правильности своих действий.

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

CKSEL , таких фьюзов с разными буквами всего четыре, это группа CKSEL 0, CKSEL 1, CKSEL 2 и CKSEL 3 , определяют частоту тактового генератора, и его тип, тактовые импульсы необходимы для работы практически любого микроконтроллера. Во многих микроконтроллерах есть внутренний генератор, но мы можем подключить внешний и фьюзы выставить для работы от внешнего генератора. Внешний кварцевый резонатор подключается на выводы XTAL 1 и XTAL 2 , кроме того припаивается пара конденсаторов ~20пф одним концом на кварц, другим на минус. Если допустить ошибку при установке этих фьюзов, то микроконтроллер может "заблокироваться" для того чтобы восстановить контроллер, подают тактовый сигнал на ногу XTAL1, на данный момент придумано не мало схем для восстановления контроллеров, залоченных таким образом. Этот генератор можно сделать практически из любой логики или даже из таймера 555.

Есть простые схемы, с использованием 1 транзистора, пары резисторов и кварцевого резонатора, и более сложные, на микросхемах типа К155ЛА3. Данные способы 100% оживляют контроллеры с таким дефектом

Группа фьюзов SUT1 и SUT0 - fuse биты, управляющие режимом запуска тактовых генераторов МК, а так же задают скорость старта МК после подачи питания. Связаны с фьюзами CKSEL, а именно CKSEL0 .

CKOPT - бит, определяет работу встроенного генератора для работы с кварцевыми резонаторами, устанавливает "амплитуду" колебаний тактового сигнала на кварце. Данный бит программируется достаточно часто.

RSTDISBL – очень опасный фьюз, ошибочная установка может отключить вывод RESE T , после чего пропадет возможность программирования ISP программатором. Бит RSTDISBL превращает вывод RESET в порт ввода-вывода.

SPIEN – фьюз, который разрешает работу МК по интерфейсу SPI. Все микроконтроллеры выпускаются с уже установленным битом SPIEN . Считается опасным фьюзом.

EESAVE - Удобно читать как EEPROOM SAVE, дословно означает "сохранить EEPROOM", данный фьюз защищает EEPROM от стирания. Например когда в очередной раз заливаете прошивку в контроллер, можно поставить EESAVE = 0 , и при стирании МК EEPROOM останется не тронутым.

BOOTSZ , состоит из группы битов BOOTSZ1 и BOOTSZ0 , определяют размер области памяти записываемых программ, связан с битом BOOTRST .

BOOTRST, определяет адрес, с которого и будет начато исполнение программы. Если бит установлен т.е. если BOOTRST = 0 , то начало программы будет с адреса области загрузчика (Boot Loader).

BODEN - бит, который при выставлении (BODEN=0 ), будет контролировать за питающим напряжением, на предельно низких напряжениях микроконтроллер может перезапускаться, глючить и так далее. Связан с BODLEVEL.

BODLEVEL . - определяет момент срабатывания детектора уровня питающего напряжения, при снижении напряжения питания ниже уровня, произойдет "перезагрузка" контроллера.

SELFPRGEN - бит, который разрешает (SELFPRGEN=0 ) или запрещает (SELFPRGEN =1 ) программе производить запись в память.

OCDEN – данный фьюз разрешает или запрещает чтение программы из памяти контроллера.

Я как то упоминал в своих статьях про то, что в некоторых программах фьюзы выставляются зеркально. Запомните, запрограммированный фьюз=0 , а не запрограммированный=1 . В программах Algorithm Builder, UniProf фьюзывыставляются одним образом, а в программах PonyProg, CodeVisionAVR, AVR Studio, SinaProg и некоторых других, фьюзы нужно выставлять зеркально по сравнению с предыдущим списком программ.

Уже давно на просторах Интернета появились так называемые "калькуляторы фьюзов", это специальные приложения, призванные помочь в конфигурировании микроконтроллера. Приложение интуитивно понятное, думаю разберетесь, в списке контроллеров выбираем нужный нам МК, далее выбираем необходимые функции, а ниже выставляются галочки фьюзов, все очень просто.

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

Думаю что теперь, если у вас спросят "что такое фьюзы, и зачем они нужны?", вы сможете объяснить человеку их назначение, а пока, на этом все!

Вам также будет интересно:

Читы и консольные команды для Counter-Strike: Global Offensive Команда в кс го чтобы летать
В этой статье мы рассмотрим некоторые из наиболее полезных и забавных консольных команд в...
Arduino и четырехразрядный семисегментный индикатор Семисегментный индикатор 4 разряда распиновка
В сегодняшней статье поговорим о 7-сегментных индикаторах и о том, как их «подружить» с...
«Рабочие лошадки» Hi-Fi: собираем бюджетную систему Хороший бюджетный hi fi плеер
Выбор плеера - это сложный процесс, иногда человек желает получить не просто коробочку,...
Как правильно пользоваться сургучными печатями
На самом деле, сургуч - это смесь смол, окрашенная в определенный цвет. Если у вас на руках...
Лагает fallout 4 как снизить графику
10 ноября состоялся релиз долгожданной игры на ПК, PlayStation 4 и Xbox One, и постепенно...