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

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

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

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

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

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

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

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

И поэтому в одних прошивающих программах галочка означает, что опция включена (в FUSE бит записывается 0),в других, обычно написанных электронщиками, галочка означает единицу. Т.е. с точностью до наоборот.

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

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

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

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

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

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

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

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.
 

Биты 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. Запомните это навсегда и не говорите, что я не учил.
 

Подсказка: Как с одного взгляда определить какого типа (прямые или инверсные) fuse биты в незнакомой прошивающей проге?

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

Источник: http://easyelectronics.ru/avr-uchebnyj-kurs-konfiguraciya-fuse-bit.html

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

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

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

Fuse- и Lock-биты

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

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

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

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

Один из этих байтов содержит биты блокировки, оставшиеся три (часто именуемые старший, младший и расширенный) – содержат конфигурационные биты.

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

Рисунок 1. Lock-биты микроконтроллеров AVR.

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

Рисунок 3. В онлайн калькуляторе Fuse-битов МК AVR пользователь может самостоятельно выбирать необходимые опции.

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

Рисунок 4. При индивидуальной установке Fuse-битов значения байтов конфигурации обновляются автоматически.

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

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

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

embedds.com

Источник: https://www.rlocman.ru/review/article.html?di=148456

Программирование микроконтроллеров. Фьюzzы — DRIVE2

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

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

Для просмотра и настройки байтов конфигурации микроконтроллеров я советую пользоваться онлайн калькулятором: 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 интерфейсу.

Источник: https://www.drive2.ru/b/128179/

Как восстановить неправильно выставленные фьюзы в 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 при отладке одного моего проекта, вот краткое его видео превью:LCD(HD44780) вольтамперметр на ATtiny13Подключаем к другим микроконтроллерам наш «восстановитель фьюз-битовов» следующим образом:

  • Порт 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 — разумеется общий провод или другими словами «земля».

Всё это переназначается в коде, никаких проблем.Вот код из странички автора// AVR High-voltage Serial Fuse Reprogrammer
// Adapted from code and design by Paul Willoughby 03/20/2010
// http://www.rickety.us/2010/03/arduino-avr-high-voltage-serial-programmer/
//
// Fuse Calc:
// http://www.engbedded.com/fusecalc/ #define RST 13 // Output to level shifter for !RESET from transistor
#define SCI 12 // Target Clock Input
#define SDO 11 // Target Data Output
#define SII 10 // Target Instruction Input
#define SDI 9 // Target Data Input
#define VCC 8 // Target VCC #define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E // Define ATTiny series signatures
#define ATTINY13 0x9007 // L: 0x6A, H: 0xFF 8 pin
#define ATTINY24 0x910B // L: 0x62, H: 0xDF, E: 0xFF 14 pin
#define ATTINY25 0x9108 // L: 0x62, H: 0xDF, E: 0xFF 8 pin
#define ATTINY44 0x9207 // L: 0x62, H: 0xDF, E: 0xFFF 14 pin
#define ATTINY45 0x9206 // L: 0x62, H: 0xDF, E: 0xFF 8 pin
#define ATTINY84 0x930C // L: 0x62, H: 0xDF, E: 0xFFF 14 pin
#define ATTINY85 0x930B // L: 0x62, H: 0xDF, E: 0xFF 8 pin void setup() { pinMode(VCC, OUTPUT); pinMode(RST, OUTPUT); pinMode(SDI, OUTPUT); pinMode(SII, OUTPUT); pinMode(SCI, OUTPUT); pinMode(SDO, OUTPUT); // Configured as input when in programming mode digitalWrite(RST, HIGH); // Level shifter is inverting, this shuts off 12V Serial.begin(19200);
} void loop() { if (Serial.available() > 0) { Serial.read(); pinMode(SDO, OUTPUT); // Set SDO to output digitalWrite(SDI, LOW); digitalWrite(SII, LOW); digitalWrite(SDO, LOW); digitalWrite(RST, HIGH); // 12v Off digitalWrite(VCC, HIGH); // Vcc On delayMicroseconds(20); digitalWrite(RST, LOW); // 12v On delayMicroseconds(10); pinMode(SDO, INPUT); // Set SDO to input delayMicroseconds(300); unsigned int sig = readSignature(); Serial.print(“Signature is: “); Serial.println(sig, HEX); readFuses(); if (sig == ATTINY13) { writeFuse(LFUSE, 0x6A); writeFuse(HFUSE, 0xFF); } else if (sig == ATTINY24 || sig == ATTINY44 || sig == ATTINY84 || sig == ATTINY25 || sig == ATTINY45 || sig == ATTINY85) { writeFuse(LFUSE, 0x62); writeFuse(HFUSE, 0xDF); writeFuse(EFUSE, 0xFF); } readFuses(); digitalWrite(SCI, LOW); digitalWrite(VCC, LOW); // Vcc Off digitalWrite(RST, HIGH); // 12v Off }
} byte shiftOut (byte val1, byte val2) { int inBits = 0; //Wait until SDO goes high while (!digitalRead(SDO)) ; unsigned int dout = (unsigned int) val1

Источник: https://habr.com/post/249967/

Фьюзы микроконтроллеров AVR

ПодробностиКатегория: МикроконтроллерыОпубликовано 29.11.2013 14:41Автор: AdminПросмотров: 6007

Многие слышали о FUSE битах, однако, что именно скрывается под содержанием этого названия, мало кто знает. Ведь достаточно прошить устройство, если работает – то и ладно. Тем не менее, каждому, кому придется столкнуться с FUSE битами (Фьюзы), следует о них кое-что знать.

Что такое фьюз микроконтроллера?

Итак, в самом простом смысле Фьюзы предназначены для настройки микроконтроллеров. Их можно рассматривать как инструментарий для точной настройки целого ряда параметров. В каждом микроконтроллере предусмотрен индивидуальный перечень Фьюзов, к примеру, в ATmega8 отсутствует Фьюз CKOUT, но он есть в ATtiny2313. Кстати, такие списки расписаны в даташитах к микроконтроллерам.

Предназначение и функции фьюзов

Теперь рассмотрим некоторые Фьюзы avr, их обозначения и функции. Существуют Фьюзы, регулирующие определенные функции, фьюзы, управляющие защитой программы от копирования и другие. Наиболее распространенный FUSE, используемый почти всегда, это CKSEL.

Семейство таких Фьюзов включает четыре наименования: CKSEL0-3. С их помощью можно определять импульсы тактового генератора, а также его частоту.

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

Для его восстановления необходимо подать тактовый сигнал на XTAL1-ногу.

Фьюзы avr из группы SUT управляют запуском тактовых генераторов контроллера, а также с их помощью задается скорость старта устройства с момента подачи питания.

Одним из наиболее «опасных» является FUSE RSTDISBL – ошибочное выставление его может деактивировать вывод RESET, в результате чего будет невозможно программировать ISP с помощью программатора. Это связано с тем, что RSTDISBL переводит вывод RESET в режим порта ввода-вывода.

Конфигурации и калькуляторы фьюзов

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

В Интернете уже давно предлагаются специальные «калькуляторы Фьюзов» – это программы-помощники для настройки конфигурации контроллера. Такие приложения интуитивно понятны: в перечне микроконтроллеров нужно выбрать конкретный МК, затем указать необходимые функции и выставить галочки Фьюзов.

Источник: http://www.radio-magic.ru/microcontrollers/62-fuse-avr

Как настроить Фьюзы на 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.

Инфа отсюда:

easyelectronics.ru

Источник: http://4a4ik.blogspot.com/2013/10/avr.html

Микроконтроллеры avr: fuse-биты

Источник: http://el-shema.ru/publ/kontroller/mikrokontrollery_avr_fuse_bity/9-1-0-56

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}
   В данном обзоре рассмотрим, что же такое 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