Найти тему
Электроника и жизнь

Что такое фьюзы? Как работать с фьюзами на микроконтроллерах AVR

Оглавление

Здравствуйте, уважаемые читатели! Сегодня поговорим о таком понятии как фьюзы (fuse bits), что это такое и как с ними работать. Пример изменения фьюзов я покажу на микроконтроллере ATtiny13. Впрочем метод из данной статьи, подойдет и для работы с фьюзами на других микроконтроллерах AVR. Работать я буду в среде Arduino IDE и еще использовать небольшую самописную программу. Впрочем, обо всем по-порядку, и начнем с теории.

Работа с фьюзами на микроконтроллерах AVR
Работа с фьюзами на микроконтроллерах AVR

Фьюз биты позволяют устанавливать различные режимы работы микроконтроллера, задать частоту и источник тактового сигнала, превратить порт, связанный с Reset, в обычный порт ввода-вывода, и многое другое. Хранятся Fuse биты в специально отведенной для этого области памяти flash памяти. И обычно занимают от 1 до 3 байт памяти в зависимости от микроконтроллера.

Пример фьюз байтов для ATtiny85
Пример фьюз байтов для ATtiny85

Важной особенностью, является то, что значение 0 фьюз бита означает, что он активен, установлен. Тогда как значение 1 фьюз бита, означает, что соответствующий ему параметр не активен, не установлен. Это правило идет от самого названия фьюз бита, т.е. Fuse – в переводе с английского, предохранитель. Т.е. если предохранитель цел, то фьюз бит не установлен, а вот если мы меняем его значение, условно, сжигая предохранитель, то значение фьюз бита становится равным нулю.

-3

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

Чтобы не приходилось устанавливать каждый бит вручную, и собирать биты в байты, существуют специальные калькуляторы фьюзов. Например, вот этот - https://www.engbedded.com/fusecalc/

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

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

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

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

Доступные для изменения фьюзы ATtiny13 в калькуляторе фьюзов
Доступные для изменения фьюзы ATtiny13 в калькуляторе фьюзов

Т.е. видно, что по умолчанию, значения младшего (Low) и старшего (High) байта для ATtiny13 равны 6A и FF, соответственно.

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

Далее я кратко расскажу, какие фьюз биты за что отвечают, и какие нам наиболее интересны.

SPIEN – если данный фьюз отключить, то мы потеряем возможность прошивать микроконтроллер с помощью ISP программатора, в качестве которого у нас выступает Arduino UNO.

EESAVE – в активном состоянии, позволяет защитить данные в EEPROM памяти при полном сбросе к заводским установкам.

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

CKDIV8 – это делитель тактовой частоты на 8. По умолчанию включен.

CKSEL1 и CKSEL0 – биты определяющие использование внешнего или внутреннего тактового генератора и тактовую частоту. Данные значения проще менять непосредственно в Arduino IDE.

SUT1 и SUT0 – задают время старта тактового генератора, после подачи питания на микроконтроллер или после его перезагрузки. Их лучше оставлять по умолчанию, на мой взгляд, ни на что особо они не влияют.

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

DWEN – включает интерфейс отладки микроконтроллера по одному проводу DebugWire.

BODLEVEL1 и BODLEVEL0 – биты, отвечающие за контроль напряжения, подаваемого на микроконтроллер. И если оно ниже заданного с помощью этих двух бит, то микроконтроллер перезагружается. Изменять эти значения можно и непосредственно в Arduino IDE.

RSTDISBL – позволяет превратить порт связанный с Reset, в обычный порт ввода-вывода. Т.е. на ATtiny13/25/45/85 мы получаем 6 пинов ввода-вывода вместо 5. И особенно это полезно на ATtiny10, где всего 6 ножек и устанавливая данный фьюз, мы получаем 4 пина для работы с цифровым и аналоговым сигналом, вместо 3-х.

Но после установки данного фьюза, мы теряем возможность перепрошивки микроконтроллера с помощью ISP программатора. И восстановить возможность классического метода прошивки можно только с помощью высоковольтного программатора, о котором я расскажу в одной из следующих статей.

Считывание и запись фьюзов

А теперь я расскажу, как можно считывать фьюзы микроконтроллера и как их перезаписывать. В качестве ISP программатора будет выступать Arduino UNO.

Загрузим в память ATtiny13 стандартный скетч "Blink". И установим прямо на программатор светодиод с припаянным резистором на 220 Ом. Одна ножка к земле, другая к 7 пину. Светодиод у нас мигает раз в секунду.

Скетч "Blink". Мигание светодиодом 1 раз в секунду.
Скетч "Blink". Мигание светодиодом 1 раз в секунду.

Далее, не отключая программатор от компьютера, запускаем файл avr-fuses-editor.bat.

Часть кода avr-fuses-editor.bat. Как и любой BAT файл, код можно редактировать в блокноте
Часть кода avr-fuses-editor.bat. Как и любой BAT файл, код можно редактировать в блокноте

Это моя простенькая программка, которая работает с интерфейсом командной строки Windows и на основе выбора типа микроконтроллера и других параметров, формирует строку для запуска стандартной для прошивки AVR микроконтроллеров программы AVRDude.exe. Которая должна находится в том же каталоге, что и запускаемый BAT-файл. И еще в этом же каталоге, должен находится файл файл конфигураций avrdude.conf.

Три необходимых для работы файла. Должны находиться в одном каталоге!
Три необходимых для работы файла. Должны находиться в одном каталоге!

Оба этих файла находятся во внутренних папках среды разработки Arduino IDE.

..\Arduino\hardware\tools\avr\bin\avrdude.exe

и

..\Arduino\hardware\tools\avr\bin\avrdude.conf

Ссылка на скачивание архива каталога со всеми тремя файлами в конце статьи.

Вначале нам предлагается выбрать цифрой, какой у нас микроконтроллер. У нас ATtiny13, так что выбираем цифру 2. Если Вашего микроконтроллера нет в списке, то можно добавить его самостоятельно в файл avr-fuses-editor.bat. Или напишите мне в комментариях, я расскажу, как это просто делается.

Далее выбираем активный COM-порт, который можно посмотреть в правом нижнем углу Arduino IDE. Либо в меню инструменты. У меня это COM3.

После этого появляется список возможных действий из двух пунктов. Вначале выберем 1 и прочитаем fuse биты микроконтроллера.

Считывание фьюзов микроконтроллера ATtiny13
Считывание фьюзов микроконтроллера ATtiny13

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

Результат считывания фьюзов микроконтроллера ATtiny13
Результат считывания фьюзов микроконтроллера ATtiny13

Чтобы получить наглядный результат, уберем делитель тактовой частоты на 8 CKDIV8. Значение младшего байта при этом изменяется с 6A на 7A.

Нажмем 1, чтобы вернутся к списку действий. И нажимаем 2, т.е. записать фьюзы. Далее нужно ввести значение младшего и старшего байтов. После ввода значения фьюзов, программа покажет нам сформированную строку, для обращения к файлу avrdude.exe с необходимыми для перезаписи фьюзов параметрами. Здесь у нас и выбор программатора – avrisp, и выбор микроконтроллера (t13 – это id микроконтроллера в файле avrdude.conf), далее идет скорость передачи данных и сами команды на запись младшего и старшего фьюз байтов.

Запись фьюзов микроконтроллера ATtiny13
Запись фьюзов микроконтроллера ATtiny13

Еще раз всё проверяем и нажимаем y (yes), т.е. выполнить. Запускается процесс и выводится результат об успешном изменении фьюзов.

Результат записи фьюзов микроконтроллера ATtiny13
Результат записи фьюзов микроконтроллера ATtiny13

А наш светодиод начинает мигать в 8 раз чаще. Точно такой же результат можно проделать с ATtiny85 и другими микроконтроллерами AVR.

В результате светодиод начинает мигать в 8 раз чаще
В результате светодиод начинает мигать в 8 раз чаще

Изменение фьюза RSTDISBL

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

Напоминаю, что изменение данного фьюза необратимо! После изменения фьюза RSTDISBL микроконтроллер больше нельзя перепрошить с использованием ISP программатора!

Вносим изменения в скетч "Blink", чтобы мигать светодиодом, подключенным к первой ножке микроконтроллера, которая обозначается как PB5, вместо 7-й (PB2).

Изменяем скетч Blink на работу с первым пином микроконтроллера ATtiny13
Изменяем скетч Blink на работу с первым пином микроконтроллера ATtiny13

Загружаем скетч. Светодиод как-то еле горит, и не мигает. Всё потому, что порт у нас пока занят под Reset и как обычный порт ввода-вывода работать не может.

В данный момент первый пин не работает как порт ввода/вывода.
В данный момент первый пин не работает как порт ввода/вывода.

На странице калькулятора фьюзов, выставляем фьюз RSTDISBL. Младший байт у нас не изменится, а вот старший изменился на с FF на FE.

Выставляем фьюз RSTDISBL на странице калькулятора фьюзов
Выставляем фьюз RSTDISBL на странице калькулятора фьюзов

Возвращаемся в программу для работы с фьюзами и указываем младший байт 6A, а старший FE. Всё, после того, как мы внесем изменения, микроконтроллер больше не удастся прошить или изменить фьюзы с помощью обычного ISP программатора.

Изменяем фьюзы
Изменяем фьюзы

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

Светодиод начинает работать как на обычном цифровом пину
Светодиод начинает работать как на обычном цифровом пину

Если мы вдруг одумались и решили изменить фьюз бит RSTDISBL обратно, к значению по умолчанию. То ничего у нас не получится. Программа выдает ошибку.

При попытке изменить фьюз RSTDISBL обратно, программа выводит ошибку
При попытке изменить фьюз RSTDISBL обратно, программа выводит ошибку

Точно такую же ошибку выдаст программа Arduino IDE, при попытке загрузки скетча в микроконтроллер

Точно такую же ошибку выдает программа Arduino IDE
Точно такую же ошибку выдает программа Arduino IDE

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

Ссылка на утилиту для чтения и изменения фьюзов из этой статьи (все 3 файла) -https://yadi.sk/d/cy_QqSr5YEpjzQ

Видео по материалам статьи:

_________________________________________________________

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

Другие публикации по теме:

  • ATtiny13 и ATtiny85. Обзор и программирование с помощью Arduino.
  • Создаем удобный модуль для программирования микроконтроллеров ATtiny.