Черновик

Черновик

Radioelectronics

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

Как поступали производители микросхем в давние времена для простого программирования микросхем? Микросхему можно было запрограммировать один раз. Это делалось путем сжигания специальных перемычек внутри микросхемы. Словно выборочно сжечь множество миниатюрных плавких предохранителей (Fuse). А во после запуска этой микросхемы уже учитывались состояния этих предохранителей. Если предохранитель цел, то он проводит ток и доставляет сигнал в виде логической единицы в нужное место. Но если предохранитель сожжён, то он больше не проводит ток и не доставляет никуда сигнал в виде логической единицы, то есть в том месте остается сигнал в виде логического нуля.

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

Актуально ли так программировать большие объемы памяти? Не особо. Но можно таким образом быстро конфигурировать некоторые универсальные микросхемы прямо с завода, чтобы они получили уникальные и неизменяемые настройки параметров. Чаще всего это ограниченный набор байт. Такие преднастройки позволят защитить основную информацию в памяти микросхемы от считывания, предотвратить её неправильную работу и прочее.

Сейчас в сложных микросхемах есть применение таким сжигаемым перемычкам, но нас больше интересует возможность конфигурирования работы МК. Понятное дело, что внутреннюю память МК можно многократно перезаписывать прошивкой с новой программой. Это подразумевает и то, что конфигурацию МК требуется многократно менять с учетом требований каждой прошивки. Менять придётся специальные биты конфигурации. Вариант со сгораемыми перемычками не подойдет, так как он одноразовый. Но вполне можно выделить небольшой участок перезаписываемой памяти под эти нужды и иметь возможность по необходимости многократно измерять конфигурацию настроек МК.

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

По аналогии такие биты конфигурации назвали фьюз-битами (fuse-биты, fuse-bits).

Просто запомним, что:

1 – бит не установлен (не запрограммирован);

0 – бит установлен (запрограммирован).

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


Краткое описание конфигурационных битов

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

Фьюзы (фьюз-биты) содержатся в трех байтах (рассмотрим вариант для МК ATmega328P):

  • Fuse Low Byte - младший байт;
  • Fuse High Byte - старший байт;
  • Fuse Extended Byte - байт с опциями расширенных функций.

Блокировочные биты (Lock Bits) микроконтроллера расположены в отдельном блокировочном байте. Не редко можно слышать что их относят к фьюзам, но это не так, не стоит путать, тем более, что названы они так, чтобы можно было их четко различать.


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

В общей сложности фьюзы включают или настраивают такие параметры как:

- частота генератора, внешний или внутренний генератор;

- запрет на чтение прошивки микроконтроллера;

- включение или выключение таймеров;

- деление частоты кварцевого генератора;

- защита EEPROOM от стирания и т.д.

Рассмотрим подробнее их (речь о МК ATmega328P, на других МК биты могут отличаться).


Fuse Low Byte – младший байт

CKSEL (ClocK SELect) – Конфигурация тактового сигнала

За выбор источника тактирования отвечают биты CKSEL. Установка их правильным образом позволяет выбрать источник тактового сигнала и частоту работы МК. Это группа из четырёх битов CKSEL3, CKSEL2, CKSEL1, CKSEL0. Всего возможно до 16 комбинаций из этих битов, однако в некоторых МК используются не все биты, поэтому важно не установить их по ошибке.

Если выставить нули во все четыре бита (CKSEL3...0 = 0000), то будет использован внешний источник сигнала тактирования. При подаче прямоугольных импульсов на вход XTAL1 МК запустится. Это можно использовать, чтобы синхронизировать работу нескольких МК в одной общей системе. Не пытаемся случайно установить комбинацию 1111.

Для работы микроконтроллера (как и для любого процессора) нужны тактовые импульсы. Источником тактового сигнала может быть:

— внутренний RC генератор. Никаких дополнительных элементов не нужно. Удобно, но RC генератор имеет небольшую точность работы (вплоть до 10% погрешности) и, кроме того, «плывет» от температуры. Для некритичных по времени приложений вполне годиться.

— внешний кварцевый (или керамический) резонатор. Нужен сам резонатор, плюс два конденсатора на 15-30 пФ. Соответственно, будут заняты две ножки микроконтроллера — XLAT1 и XLAT2. Применяется там, где нужны точные замеры времени или частота работы микроконтроллера выше, чем может дать внутренний RC генератор.

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

Источник тактового сигнала для микроконтроллера задается комбинацией битов CKSEL3…0.


Это может быть (для ATTiny2313, выборочно):

CKSEL3…0 = 0000 – Внешний тактовый сигнал;

CKSEL3…0 = 0010 – Внутренний тактовый генератор — частота 4 МГц;

CKSEL3…0 = 0100 – Внутренний тактовый генератор — частота 8 МГц;

CKSEL3…0 = 1101 – Внешний тактовый генератор — кварц частотой от 3 до 8 МГц;

CKSEL3…0 = 1111 – Внешний тактовый генератор — кварц частотой больше 8 МГц.


Для AtMega328p могут применяться следующие режимы:

CKSEL[3:0] = 1111-1000 – Low Power Crystal Oscillator (Маломощный кварцевый генератор);

CKSEL[3:0] = 0111-0110 – Full Swing Crystal Oscillator (Полный колебательный кварцевый генератор);

CKSEL[3:0] = 0101-0100 – Low Frequency Crystal Oscillator (Низкочастотный кварцевый генератор);

CKSEL[3:0] = 0011 – Internal 128kHz RC Oscillator (Внутренний RC-генератор 128 кГц);

CKSEL[3:0] = 0100 – Calibrated Internal RC Oscillator (Калиброванный внутренний RC генератор);

CKSEL[3:0] = 0000 – External Clock  (Внешний тактовый сигнал);

CKSEL[3:0] = 0001 – Reserved  (Зарезервированный).


SUT[1:0] – задает скорость запуска микроконтроллера.

После снятия «сброса» (или подачи питания) программа, записанная в микроконтроллер, начинает работать не мгновенно. Микроконтроллер выжидает некоторое время, для того, чтобы нормально запустился тактовый генератор, установилось напряжение питания и т.д. Время ожидания до запуска программы и задают биты SUT1…0. Чаще всего нам не критична скорость запуска, поэтому советую ставить на максимум.

Кристаллы и генераторы требуют достаточного напряжения для правильной работы. Когда вы запускаете чип ATmega, может потребоваться короткий промежуток времени, чтобы напряжение достигло своего максимального значения. Во время нарастания напряжения источник синхронизации может работать не с правильной скоростью или частотой. Чтобы позволить часам стабилизироваться, можно установить задержку запуска.

CKSEL0 используется вместе с SUT1 и SUT0 для установки времени задержки запуска.

SUT[1:0] = 11 – максимальное время запуска (чуть больше 65 mS).

BOD - Brown Out Detection, о котором мы поговорим позже

Arduino использует максимальную задержку запуска 14CK + 65 мс (CKSEL0 = 1, SUT1 = 1, SUT0 = 1), которые также являются настройками по умолчанию для новых чипов ATmega 328 / 328P.


CKOUT (ClocK OUT) – разрешает вывод тактовой частоты на ножку CLKO микроконтроллера (для тактирования других устройств).

Тактовый сигнал может быть направлен на PB0. Это полезно, если вам нужен тактовый сигнал для управления другими цепями. Это работает для всех источников тактовых импульсов, и для новых чипов по умолчанию установлено значение CKOUT = 1 (не установлено).

Пригодится, если нужно будет синхронизировать тактирование сразу нескольких устройств.

CKOUT = 1 – ножка микроконтроллера работает как обычный порт ввода-вывода;

CKOUT = 0 – на ножку микроконтроллера выдается сигнал тактового генератора.


SCKDIV8 (ClocK DIVision 8) – деление тактовой частоты на 8.

Чипы ATmega 328 / 328P имеют встроенный RC-генератор с частотой 8,0 МГц. Новые чипы поставляются с этим набором в качестве источника синхронизации и активным предохранителем CKDIV8, что приводит к тактовой частоте 1,0 МГц. Время запуска установлено на максимум, а время ожидания включено. (CKSEL = «0010», SUT = «10», CKDIV8 = «0»). Этот параметр используется для того, чтобы все пользователи могли выполнить желаемую настройку источника синхронизации с помощью любого доступного интерфейса программирования.

CKDIV8 следует использовать, если выбранный источник синхронизации имеет более высокую частоту, чем максимальная частота чипа ATmega.

Микросхемы ATmega можно использовать при очень низких напряжениях, однако, чем ниже напряжение, тем медленнее они должны работать. CHDIV8 можно использовать для установки низкой тактовой частоты в соответствии с низким напряжением.

SCKDIV8 = 1 – микроконтроллер работает на частоте задающего генератора;

SCKDIV8 = 0 – микроконтроллер работает на частоте в 8 раз меньше частоты задающего генератора;


Fuse High Byte – старший байт

BOOTRST (BOOT ReSeT) – как раз и заставляет микроконтроллер запускаться с области бутлоадера.

Чипы ATmega могут использовать загрузчик, это небольшая программа, которая запускается при перезагрузке чипа. Если у вас есть загрузчик, вам нужно сообщить об этом MCU, и это делается с помощью настройки предохранителя BOOTRST. Когда предохранитель BOOTRST установлен, при сбросе устройство переходит на адрес загрузчика. Если не установлено, микросхема перейдет к начальному адресу программы в 0x0000.

Значением по умолчанию является BOOTRST = 1 (не установлено).

Если BOOTRST не установлен (без загрузчика), то предохранители BOOTSZ игнорируются.

BOOTRST = 1 – микроконтроллер запускает программу с нулевого адреса;

BOOTRST = 0 – микроконтроллер запускает программу с бутлоадера.


BOOTSZ[1:0] (BOOT SiZe) — задает размер бут сектора (области памяти программ для бутлоадера).

Чипы ATmega имеют возможность использовать загрузчик, это небольшая программа, которая запускается при первом запуске чипа или при его перезагрузке. Загрузчики обычно используются для инициализации устройства и проверки внешней связи. Arduino использует загрузчик для связи с подключенным компьютером, чтобы узнать, есть ли новая программа для загрузки. Это причина, по которой Arduino сбрасывается при загрузке нового кода, сброс запускает загрузчик, загрузчик проверяет, есть ли у вас новый код.

Загрузчик хранится в памяти программ, той же памяти, которая используется для пользовательского приложения, и, поскольку загрузчик может иметь разные размеры, вы можете указать микросхеме ATmega, сколько места зарезервировать. Стандартный (более старый) загрузчик Arduino составляет 2 килобайта (КБ), но более новый Optiboot (используемый в UNO) составляет всего 0,5 КБ (512 байт). Если вы используете Optiboot и соответственно устанавливаете размер загрузчика, вы получаете дополнительные 1,5 КБ для своей программы. 1,5 КБ может занимать много места, поэтому из-за недостатка места в программе я начал программировать автономные чипы ATmega. Код для dropController стал слишком большим для обычного Arduino, поэтому я удалил загрузчик.

Загрузчик хранится в верхней части памяти программы

Если у вас есть загрузчик, BOOTSZ должен использоваться вместе с BOOTRST. BOOTRST сообщает чипу ATmega адрес памяти, с которого начинается загрузчик. Если BOOTRST не установлен, то пользовательское приложение может использовать всю память независимо от настроек BOOTSZ.

Конфигурация размера загрузки для 328 / 328P

Обратите внимание, что приведенные выше размеры указаны в словах (слово составляет 2 байта), а 256 слов - 512 байтов.

По умолчанию для новых чипов BOOTSZ1 = 0 BOOTSZ0 = 0, что означает, что они имеют 4 КБ, зарезервированные для загрузчика.


EESAVE (EEprom SAVE) — защита EEPROM от стирания.

При подаче команды полного стирания микроконтроллера (обычно осуществляется при каждом программировании кристалла) стирается и EEPROM. Если Вы хотите чтобы EEPROM оставалось нетронутой – активируйте этот фьюз. Это актуально если в EEPROM хранятся важные данные.

При программировании микросхемы ATmega память стирается непосредственно перед загрузкой нового кода. При нормальных обстоятельствах память EEPROM стирается так же, как и память программ. Предохранитель EESAVE может быть использован для указания чипу не стирать EEPROM. Это полезно, когда вы хотите обновить код, но сохранить настройки пользователя, которые хранятся в eeprom.

Значением по умолчанию является EESAVE = 1, не установлено, и память EEPROM стирается во время цикла стирания чипа при программировании.

У меня есть привычка устанавливать этот предохранитель; Eeprom имеет ограниченный жизненный цикл, поэтому, чем меньше вы пишете в него, тем лучше. Стирание EEPROM не влияет на загрузку нового кода, и большинство моих проектов не используют память EEPROM, поэтому не стирать ее - не проблема. DropController хранит настройки и время сброса в eeprom, поэтому я установил EESAVE для сохранения данных при загрузке новых версий кода.

EESAVE = 1 – стирать EEPROM вместе с Flash;

EESAVE = 0 – оставлять EEPROM при очистке нетронутым.


WDTON (Watch Dog Timer ON) – включает Watch Dog Timer.

Для ответственных приложений, там, где недопустимо зависание программы (будь то ошибка программы или злостная помеха), применяют Watch Dog Timer. Это внутренний таймер микроконтроллера, работающий от своего независимого генератора. При переполнении этого таймера микроконтроллер сбрасывается и начинает выполнять программу с начала. Программист должен в тесте программы (обычно в главном цикле) вставить специальную команду обнуления этого таймера (WDR). Команда периодически выполняется и обнуляет таймер, не давая ему переполнится. Если микроконтроллер «повис» перестают выполняться команды обнуления, таймер переполняется и сбрасывает микроконтроллер.

Сторожевой таймер - это в основном таймер, который заставит микросхему перезагружаться, если она не получает сигнал OK в определенное время.

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

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

Сторожевой таймер может быть активирован программно, поэтому настройки плавких предохранителей на самом деле не нужны. По умолчанию сторожевой таймер выключен, WDTON = 1.

WDTON = 1 – Watch Dog Timer – отключен (можно включить программно);

WDTON = 0 – Watch Dog Timer – включен (программно выключить нельзя).

В обычных приложениях не нужен.


SPIEN (Serial Programming Interface ENable) – разрешение на последовательное программирование.

По умолчанию запрограммирован (0) – разрешено последовательное программирование.

Микросхемы ATmega можно программировать с помощью последовательного программирования. Последовательное программирование используется для программирования на борту с использованием последовательного протокола через ISP (встроенный последовательный программатор) или UART (универсальный асинхронный приемник / передатчик).

Обычный метод программирования микросхем ATmega - через интерфейс SPI с использованием контактов SCK (тактовая частота), MOSI (входная) и MISO (выходная). Если вы отключите последовательное программирование, вы больше не сможете использовать SPI для программирования чипа. Вы также можете отключить последовательное программирование, используя биты блокировки.

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

SPIEN = 0 – разрешено последовательное программирование;

SPIEN = 1 – запрещено последовательное программирование.


DWEN – бит, разрешающий работу DebugWire

– еще одного отладочного интерфейса. DebugWire однопроводный отладочный интерфейс работающий через ножку сброса, поэтому «не отнимает» у микроконтроллера ножки портов ввода-вывода.

Чипы ATmega имеют встроенные средства отладки, которые по умолчанию отключены. Предохранитель DWEN используется для их включения.

DWEN использует тот же вывод для сброса (PC6), и когда DWEN включен (и биты блокировки не установлены), вывод сброса становится выводом связи, и нормальный сброс больше не работает. Например, если вы включили DWEN на Arduino, кнопка сброса больше не работает.

Чтобы использовать отладку на кристалле, вам нужен совместимый программатор, такой как AVR Dragon. Так как я никогда не использовал AVR studio и у меня нет подходящего программиста, я никогда не использовал и не знаю, как использовать отладку. Если вы хотите узнать больше, то есть хорошая статья на http://www.hilltop-cottage.info/blogs/adam/debugging-arduino-using-debugwire-atmel-studio-and-an-avr-dragon/ чтобы вы начали.

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

Если вы только начинаете, оставьте DWEN не установленным. Ведь сброс очень полезен.

DWEN= 1 – запрещен DebugWire ;

DWEN= 0 – разрешен DebugWire .

AVR микроконтроллеры могут во время своей работы изменять содержимое области программ (программировать сам себя).


RSTDISBL (ReSeT DiSaBLe) – разрешает использовать ножку Reset как еще один порт ввода-вывода.

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

PC6 - это контакт сброса, удерживайте его на низком уровне (до земли), и микросхема будет сброшена. Вот как работает переключатель Arduino. Когда вы нажимаете кнопку сброса, он подключает ПК6 к земле и сбрасывает микросхему.

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

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

Когда RSTDISBL запрограммирован, время запуска (SUT1 SUT0) увеличивается до 14CK + 4,1 мс, чтобы обеспечить возможность входа в режим программирования.

По умолчанию значение RSTDISBL = 1 (не задано).

RSTDISBL = 1 – ножка сброса работает как сброс;

RSTDISBL = 0 – ножка сброса работает как еще один порт ввода-вывода, последовательное программирование отключено.


Fuse Extended Byte – байт с опциями расширенных функций

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

BODLEVEL[2:0] (Brown-Out Detection LEVEL) — контроль напряжения питания микроконтроллера (Brown-out Detector).

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

Чипы ATmega могут стать нестабильными или ненадежными при использовании с недостаточным напряжением. Например, 328 / 328P может безопасно работать на частоте 16 МГц, если он имеет как минимум 4 В. Что-то ниже 4 В означает, что чип, вероятно, будет плохо себя вести. Это было бы проблемой, если бы устройство использовалось с датчиками для проведения измерений или полагалось на точное время.

Для обеспечения достаточного входного напряжения микросхемы можно установить минимальный уровень напряжения. Если напряжение упадет ниже этого уровня, микросхема перезагрузится сама. Это называется уровнем детектора затухания. В основном, если подаваемое напряжение ниже BOD, микросхема сохраняет низкий уровень сброса.

Значения по умолчанию для новых чипов: BODLEVEL2 = 1 (не установлено), BODLEVEL1 = 1 (не установлено), BODLEVEL0 = 1 (не установлено).

BODEN (Brown-Out Detection ENabled) — контроль напряжения питания


Все ли это возможные фьюз-биты? Вовсе нет. Вышеприведенные биты рассмотрены для МК ATmega328P. У других МК могут быть не все биты из приведенных либо присутствуют дополнительные биты. А могут попадаться варианты, где данные фьюз-биты находятся вовсе не в тех байтах, как в приведенных выше, а в соседних. Так что обязательно сверяемся с даташитом, смотрим доступные фьюз-биты для соответствующего контроллера в программе для связи с МК и используем наглядные калькуляторы фьюзов.


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


Lock Bit Byte – байт блокировки

В ATmega328P в этом байте есть 6 бит, которые влияют на режимы защиты памяти и ограничения доступа к ней. Эти биты позволяют установить режимы доступа (запись/чтение) к внутренней памяти МК. Основное предназначение этих бит – для защиты области программ и/или EEPROM от записи/чтения. Полное стирание чипа восстанавливает эти биты в исходное состояние (1 – никаких блокировок).

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

LB[2:1] (Lock Bit) — выбор режима защиты.

Эти биты устанавливаем в последнюю очередь, так как после уже будет нельзя менять содержимое памяти до момента полного стирания памяти МК.

LB[2:1] = 11 – функции блокировки памяти не включены;

LB[2:1] = 10 – дальнейшее программирование Flash и EEPROM отключено в режимах параллельного и последовательного программирования, фьюз-биты блокируются как в последовательном, так и в параллельном режиме программирования;

LB[2:1] = 00 – дальнейшие программирование и проверка Flash и EEPROM отключены в режимах параллельного и последовательного программирования, биты блокировки загрузки и фьюз-биты блокируются как в последовательном, так и в параллельном режиме программирования.


BLB0[2:1] (Boot Lock Bits) – биты режимов блокировки загрузки.

BLB0[2:1] = 11 – нет ограничений для инструкций SPM или Load Program Memory (LPM), обращающихся к разделу приложения;

BLB0[2:1] = 10 – SPM не разрешено писать в раздел приложений;

BLB0[2:1] = 00 – SPM не разрешено писать в раздел приложения, а LPM, выполняющийся из раздела загрузчика, не может читать из раздела приложения. Если векторы прерываний размещены в разделе Boot Loader, прерывания отключаются при выполнении из раздела Application;

BLB0[2:1] = 01 – LPM, выполняющийся из раздела Boot Loader, не может читать из раздела Application. Если векторы прерываний размещены в разделе Boot Loader, прерывания отключаются при выполнении из раздела Application.


BLB1[2:1] (Boot Lock Bits) – биты режимов блокировки загрузки.

BLB1[2:1] = 11 – нет ограничений для доступа SPM или LPM к разделу Boot Loader;

BLB1[2:1] = 10 – SPM не разрешено писать в раздел Boot Loader;

BLB1[2:1] = 00 – SPM не разрешено писать в раздел Boot Loader, а LPM, выполняемый из раздела Application, не может читать из раздела Boot Loader. Если векторы прерываний размещаются в разделе «Приложения», прерывания отключаются при выполнении из раздела «Загрузчик»;

BLB1[2:1] = 01 – LPM, выполняющийся из раздела приложения, не может читать из раздела загрузчика. Если векторы прерываний размещаются в разделе «Приложения», прерывания отключаются при выполнении из раздела «Загрузчик».


Предупреждение

Так от чего же нас везде пытаются отговорить прикасаться к этим фьюзам? Есть несколько фьюз-битов, установка которых в активное состояние может затруднить возможность взаимодействовать с МК. Затруднить, но не испортить навсегда. Если возникло подобное затруднение, то понадобится просто более навороченный программатор, чтобы вернуть МК в нормальное состояние. Что же это за биты? Выше они были рассмотрены, но надо конкретизировать.

RSTDSBL позволяет запретить использование ножки сброса. По умолчанию равен 1 (сброшен). Если этот бит сделать активным, то ножка сброса станет еще одним портом ввода-вывода, но станет невозможным последовательное программирование через ISP-интерфейс. Всё можно восстановить с помощью высоковольтного параллельного программатора. Зачем тогда есть возможность делать ножку сброса портом ввода-вывода, если при этом будет затруднительно в обычных условиях что-то записать в МК? Бывают МК, которые имеют всего восемь выводов. Из них два связаны с питанием, а еще один с ногой RESET. Остается всего 5 свободных выводов, которых порой не хватает. А в такой ситуации очень щедрым будет предложение получить еще один вывод, который можно будет использовать. В итоге два вывода заняты питанием МК, а шесть остальных могут использоваться по нашему хотению.
SPIEN разрешает последовательное программирование. По умолчанию равен 0 (установлен). Тут всё просто – если запретим, тоне сможем использовать обычный программатор.

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

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

Самая безопасный вариант работы с МК:

  1. Выбираем нужную модель МК в программе;
  2. Считываем значение фьюзов нашего МК;
  3. В случае успешного чтения видим, как установлены все четыре байта;
  4. Если есть необходимость, то корректируем отдельные биты;
  5. Записываем фьюзы в МК.

В программе AVRDUDE_PROG 3.3 есть возможность выводить фьюз-биты в прямом либо инвертированном виде. Это указывается соответствующей настройкой под списком всех битов. Можно же запутаться в конец, ведь установленный бит содержит 0, а сброшенный – 1. Но есть "маячки", с помощью которых можно не ошибиться. Посмотрите на биты SPIEN и RSTDISBL после чтения фьюзов с МК. В случае удачного чтения они будут установлены по следующим правилам.

Если используется инверсный режим отображения, то галочка напротив бита означает, что он установлен (запрограммирован), а отсутствие галочки означает, что бит сброшен (не запрограммирован). В таком режиме бит SPIEN установлен и имеет галочку, а бит RSTDISBL сброшен и не имеет галочки.
Если используется прямой режим отображения, то галочка напротив бита означает, что он сброшен (не запрограммирован), а отсутствие галочки означает, что бит установлен (запрограммирован). В таком режиме бит SPIEN сброшен и не имеет галочки, а бит RSTDISBL установлен и имеет галочку.

Уверен, что так намного легче запомнить этот момент.


Калькуляторы фьюзов

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

Один из сайтов с калькулятором фьюзов

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

http://homes-smart.ru/fusecalc/?prog=avrstudio&part=ATmega328P

https://payalo.at.ua/c_fuse/calc.html?part=ATmega328P

https://vetaxa.com/AVR/fuse_calculator/calc.htm?prog=avrstudio&part=ATmega328P

http://usbsergdev.narod.ru/DOC/FuseCalc/calc.html?part=ATmega328P

http://fusecalc.mirmk.ru/

https://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p


Эта статья содержит в основном справочные сведения, но для общего понимания стоит ознакомиться с её содержимым хотя бы поверхностно.

Report Page