- Что такое предохранители в АРН - подробное объяснение
- Биты-предохранители в Arduino
- Компоненты, необходимые для проверки предохранителей в АРН
- Схема для проверки битов предохранителей в АРН
- Проверка предохранителей в АРН
В этом уроке мы поговорим о предохранителях. Когда я учился в колледже и узнал обо всех крутых вещах в электронике, я впервые услышал термин предохранитель в AVR, моя первоначальная мысль по этой теме была, о! что-то внутри AVR взорвется, если я сделаю что-то не так. В то время в Интернете было не так много ресурсов, через которые можно было бы пройти. Я довольно много поискал, чтобы узнать, что эти предохранители относятся к некоторым специальным битам внутри микроконтроллера AVR. Эти биты похожи на крошечные переключатели внутри AVR, и, включив / выключив их, мы можем включить / выключить некоторые специальные функции AVR. Включение и выключение означает настройку и сброс.
Мы собираемся воспользоваться этой возможностью, чтобы обсудить все, что есть о битах Fuse в AVR. Для простоты мы возьмем в качестве примера плату Arduino, на которой установлен популярный микроконтроллер ATmega328P. Здесь вы узнаете, как установить эти предохранители для включения и выключения некоторых из этих функций, что очень удобно в реальных приложениях. Итак, приступим к делу.
В наших предыдущих публикациях мы построили множество проектов микроконтроллеров AVR, таких как Интерфейс модуля GSM с микроконтроллером AVR и Интерфейс HC-05 с микроконтроллером AVR. Вы можете проверить их, если хотите узнать больше об этих проектах.
Что такое предохранители в АРН - подробное объяснение
Как мы обсуждали ранее, предохранители в микроконтроллере похожи на маленькие переключатели, которые можно включать и выключать для включения и отключения различных функций микроконтроллера AVR. Это та часть, где возникает наш следующий вопрос, так как же нам установить или сбросить эти предохранители? Ответ на этот вопрос прост: мы делаем это с помощью регистров предохранителей.
В микросхеме ATmega328P всего 19 битов предохранителей, которые разделены на три байта предохранителей. Они определены как «расширенные байты предохранителя», «старший байт предохранителя» и «младший байт предохранителя».
Если вы посмотрите Таблицу 27 в техническом описании ATmega328 / P Rev: 7810D – AVR – 01/15, вы сможете узнать все мелкие детали о битах предохранителей. Но изображение ниже даст вам лучшее представление о разделе с предохранителями в таблице данных.
Теперь, когда вы немного узнали о предохранителях, давайте пройдемся по таблице данных и выясним все необходимые подробности об этой ИС.
Биты расширенного предохранителя:
После того, как вы щелкните вкладку Fuse Bits и немного прокрутите вниз, вы найдете Таблицу 27-5: в которой показана таблица для «Extended Fuse Byte», обычно известного как « EFUSE». Изображение ниже показывает именно это.
В этой таблице есть только три используемых бита, а остальные три зарезервированы. Эти три бита относятся к уровню обнаружения сбоев. Как вы можете видеть в примечании, если мы посмотрим на Таблицу 28-5, мы сможем найти более подробную информацию об этом.
Как вы можете видеть в приведенной выше таблице, у нас есть таблица для обнаружения сбоев. Обнаружение пониженного напряжения - это функция, которая сбрасывает микроконтроллер, когда напряжение питания падает ниже определенного уровня. В микросхеме ATmega328P мы можем полностью отключить обнаружение сбоев или установить его на уровни, указанные в таблице выше.
Старшие байты предохранителя:
Как вы можете видеть на изображении ниже, в таблице 27-6: таблицы данных показаны биты старшего предохранителя микросхемы ATmega328P.
Предохранитель высокого дело с различными задачами внутри ATmega328 микроконтроллера. В этом разделе мы поговорим о предохранителях высшего класса и их работе. Начнем с битов BOOTRST, BOOTSZ0 и BOOTSZ1. Эти три бита отвечают за установку размера загрузки; размер загрузки относится к объему памяти, зарезервированной для установки загрузчика.
Загрузчик - это специальная программа, которая запускается поверх микроконтроллера и управляет различными задачами. Но в случае с Arduino загрузчик используется для загрузки скетча Arduino внутрь микроконтроллера. В одной из наших предыдущих статей мы показали вам, как записать загрузчик в ATmega328P с помощью Arduino. Вы можете проверить это, если вам интересна тема. Возвращаясь к нашей теме, назначение других битов в старшем байте сделано достаточно ясно, бит EESAVE предназначен для сохранения памяти EEPROM во время выполнения цикла стирания чипа. Бит WDTON предназначен для включения или отключения сторожевого таймера.
Сторожевой таймер - это специальный таймер в микросхеме ATmega328P, который имеет отдельные часы и работает независимо. Если сторожевой таймер включен, то вам нужно очистить его через определенный период, иначе сторожевой таймер сбросит микроконтроллер. Это полезная функция, которая присутствует во многих микроконтроллерах, если процессор застревает; сторожевой таймер сбросит его, чтобы предотвратить повреждение конечного приложения.
Бит DWEN используется для включения отладочной сети; это подготовительный протокол, который встроен в их оборудование и используется для программирования и отладки процессоров. Если эта функция включена, вы можете прошивать и отлаживать процессор с помощью одного подключенного провода. Но для его использования вам понадобится специальное оборудование, которое подготовит к работе Atmel.
Остальные две части - это те части, которых вам следует избегать, если вы точно не знаете, что делаете. Это бит-7 RSTDISBL и бит-5 SPIEN. RSTDISBL (Отключение внешнего сброса), как следует из названия, отключает вывод внешнего аппаратного сброса, а бит SPIEN используется для отключения интерфейса программирования SPI. Отключение любого из этих двух битов может полностью заблокировать ваш AVR; так что оставить их в покое - хорошая идея.
Младшие байты предохранителя:
Как вы можете видеть на изображении ниже, в таблице 27-7: таблицы данных показаны биты нижнего предохранителя микросхемы ATmega328P.
Этот байт предохранителя отвечает за настройку источника синхронизации и некоторых других параметров часов внутри AVR. В этом разделе мы узнаем обо всем этом.
7-й бит или флаг CKDIV8 могут быть установлены для деления источника синхронизации на 8, это очень удобно, о чем вы, возможно, уже знаете, если пытались самостоятельно программировать AVR. Следующий бит - это бит CKOUT, и это 6-й бит младшего байта предохранителя. Программирование будет выводить внутренний тактовый сигнал на PORTB0 микроконтроллера.
Биты-5 и бит-4 SUT1 и SUT0 управляют временем запуска микроконтроллера. Это предотвращает любые действия по запуску, которые могут произойти или не произойти до того, как напряжение питания достигнет приемлемого минимального порогового уровня. И последние четыре бита CKSEL0 - 4 используются для выбора источника синхронизации микроконтроллера. Приведенная ниже таблица дает вам лучшее представление об этих четырех битах, которые отвечают за настройку источника синхронизации. Вы можете найти эту таблицу в разделе «Источник часов» таблицы.
Теперь, прежде чем мы продолжим, есть еще одна вещь, которую я должен рассмотреть, - это таблица задержки запуска генератора. Под задержкой запуска мы обращаемся к битам 4 и 5 младшего байта предохранителя. Задержки необходимо устанавливать в зависимости от условий, в которых будет работать схема, и типа используемого генератора. Значения по умолчанию установлены для медленного увеличения мощности с 6 тактовыми циклами при выполнении последовательности включения или выключения питания. Затем следует еще одна задержка в 14 тактов с задержкой 65 мс после запуска.
Фух! Это было много информации, которую нужно было переварить. Но прежде чем продолжить, давайте закончим этот раздел небольшой заметкой.
Заметка:
Если вы внимательно ознакомились с таблицей данных, вы, должно быть, заметили, что программирование бита предохранителя означает его установку на низкий уровень, то есть на 0 (ноль), что является противоположностью тому, что мы обычно делаем, чтобы сделать порт высоким или низким. Вы должны помнить об этом при настройке предохранителей.
Биты-предохранители в Arduino
Мы много говорили о предохранителях в предыдущем разделе, но в этом разделе давайте поговорим о том, как их настроить и как записать их в микроконтроллер. Для этого нам понадобится инструмент под названием Avrdude. Это инструмент, который можно использовать для чтения, записи и изменения памяти микроконтроллеров AVR. Он работает с SPI и имеет длинный список поддержки для разных типов программистов. вы можете скачать инструмент по ссылке ниже. Также мы будем использовать наш любимый микроконтроллер Arduino.
- Скачать Avrdude Version 6.3 Windows-ming32
Теперь, когда у вас есть Avrdude, вам нужно извлечь его и открыть командное окно в этой папке. Кроме того, если вы планируете использовать его позже, вы можете добавить путь к папке в раздел переменных среды Windows. Но я поставлю его на свой рабочий стол и открою там командное окно. Как только мы это сделаем, мы подключим программатор USBasp к нашему ПК и убедимся, что у нас есть подходящий драйвер для нашего программатора USBasp. Как только мы это сделаем, все готово, и мы сначала прочитаем значение предохранителя по умолчанию. Для этого вам нужно выполнить следующую команду.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Если все в порядке, эта команда прочитает байты предохранителя и поместит их в три отдельных текстовых файла. Изображение ниже даст вам лучшее представление о процессе.
Как видите, Avrdude прочитал биты предохранителей на Arduino nano и сохранил их в трех отдельных текстовых файлах. Теперь мы открыли их и получили три значения; для EFUSE: 0xFD, для HFUSE: 0XDA, для LFUSE: 0xFF. Это значение предохранителя по умолчанию, которое мы получили для Arduino nano. Теперь давайте преобразуем эти биты в двоичные и сравним их со значением по умолчанию из таблицы. Таблица ниже показывает именно это.
Для удобства биты предохранителей записаны в шестнадцатеричных значениях, но если мы преобразуем их в двоичные значения и сравним с таблицей данных, мы узнаем, что происходит. Начнем с младшего байта предохранителя. Как видно из приведенной выше строки, для него установлено значение 0XFF, а двоичное значение будет 0B11111111.
Сравнение штатных младших байтов предохранителя с Arduino:
Младший байт предохранителя |
Бит № |
Значение по умолчанию в AVR |
Значение по умолчанию для Arduino |
CKDIV8 |
7 |
0 (запрограммировано) |
1 (незапрограммированный) |
CKOUT |
6 |
1 (незапрограммированный) |
1 (незапрограммированный) |
SUT1 |
5 |
1 (незапрограммированный) |
1 (незапрограммированный) |
SUT0 |
4 |
0 (запрограммировано) |
1 (незапрограммированный) |
CKSEL3 |
3 |
0 (запрограммировано) |
1 (незапрограммированный) |
CKSEL2 |
2 |
0 (запрограммировано) |
1 (незапрограммированный) |
CKSEL1 |
1 |
1 (незапрограммированный) |
1 (незапрограммированный) |
CKSEL0 |
0 |
0 (запрограммировано) |
1 (незапрограммированный) |
Старший байт предохранителя имеет двоичное значение 0XDA, то есть 0B11011010.
Старший байт предохранителя в двоичном формате:
Старший байт предохранителя |
Бит № |
Значение по умолчанию в AVR |
Значение по умолчанию для Arduino |
RSTDISBL |
7 |
1 (незапрограммированный) |
1 (незапрограммированный) |
DWEN |
6 |
1 (незапрограммированный) |
1 (незапрограммированный) |
SPIEN |
5 |
0 (запрограммировано) |
0 (запрограммировано) |
WDTON |
4 |
1 (незапрограммированный) |
1 (незапрограммированный) |
EESAVE |
3 |
1 (незапрограммированный) |
1 (незапрограммированный) |
BOOTSZ1 |
2 |
0 (запрограммировано) |
0 (запрограммировано) |
BOOTSZ0 |
1 |
0 (запрограммировано) |
1 (незапрограммированный) |
BOOTRST |
0 |
1 (незапрограммированный) |
0 (запрограммировано)) |
Настройка для байта расширенного предохранителя установлена на 0XFD, в двоичном виде это 0B11111101.
Расширенный байт предохранителя в двоичном формате:
Расширенный байт предохранителя |
Бит № |
Значение по умолчанию в AVR |
Значение по умолчанию для Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (незапрограммированный) |
1 (незапрограммированный) |
BODLEVEL1 |
1 |
1 (незапрограммированный) |
0 (запрограммировано) |
BODLEVEL0 |
0 |
1 (незапрограммированный) |
1 (незапрограммированный) |
На этом этот раздел заканчивается. На данный момент мы многое узнали о микроконтроллере AVR и его предохранителях. Итак, давайте завершим эту статью, проверив нашу теорию, изменив и экспериментируя с некоторыми предохранителями в Arduino Nano.
Компоненты, необходимые для проверки предохранителей в АРН
Мы много говорили о предохранителях в приведенной выше части. Но для того, чтобы продолжить эту статью, нам понадобятся некоторые аппаратные компоненты и некоторые программные инструменты. В этом разделе мы поговорим о них. Список необходимых компонентов с изображениями приведен ниже.
- Макетная плата - 1
- Ардуино Нано - 1
- Программатор USBasp AVR - 1
- USB-кабель - 1 шт.
- Преобразователь AVR с 10 контактов в 6 контактов - 1
- Avrdude (программный инструмент для программирования AVR)
- Светодиод - 1
- 330R Резистор - 1 шт.
- Соединительные кабели
Схема для проверки битов предохранителей в АРН
Схема тестирования оборудования показана ниже в этой настройке. Мы подключили Arduino Nano к ПК с помощью USB-кабеля, а также подключили программатор USBasp к ПК. Цель этой статьи - запрограммировать предохранители в AVR. По этой причине мы подключили программатор USBasp к Arduino. Изображение ниже даст вам лучшее представление о настройке.
Проверка предохранителей в АРН
Схема тестирования показана ниже. Как видите, мы подключили Arduino и программатор USBasp к USB моего ноутбука.
Теперь давайте откроем IDE Arduino и загрузим базовый скетч мигания. Содержание базового скетча мигания не требует пояснений, поэтому я не стал вдаваться в подробности о нем.
На видео вы увидите, что светодиод на контакте № 13 мигает должным образом. Теперь давайте настроим настройки предохранителя и установим для него значения по умолчанию. И, как мы уже видели в таблице данных; EFUSE является 0xFF; HFUSE - D9; LFUSE: 62. Теперь давайте настроим его с помощью Avrdude, прошиваем и посмотрим, что произойдет. Код, который мы будем использовать, -
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Как только я это сделаю, вы увидите, что светодиод будет мигать очень медленно, потому что мы рассчитали и запрограммировали значение для тактовой частоты 16 МГц, и теперь, после сжигания предохранителей, это только внутренний RC-генератор на 1 МГц. Вот почему светодиод так медленно мигает. Теперь попробуем еще раз загрузить скетч. Мы увидим, что Arduino выдает ошибку и код не загружается. Потому что, поменяв предохранители, мы также испортили настройки загрузчика. Вы можете видеть это на изображении ниже.
Чтобы исправить это и вернуть Arduino, как было раньше, нам нужно просто снова записать загрузчик для Arduino. Для этого перейдите в Инструменты -> Программист - USBasp , и как только мы это сделаем, мы снова сможем перейти к инструментам и нажать на опцию записи загрузчика. Это снова сожжет стандартный загрузчик на вашем Arduino, и все вернется к прежнему состоянию.
После того, как загрузчик был перезагружен обратно в Arduino, он вернулся в исходное состояние, и на последнем изображении отображается мигающий светодиод после того, как загрузчик снова был записан.
На этом мы заканчиваем эту статью. Надеюсь, вам понравилась статья и вы узнали что-то новое. Если у вас есть какие-либо вопросы по статье, не стесняйтесь оставлять комментарии ниже.