Узнайте о битах предохранителей ATmega328P и о том, как использовать их с внешним генератором кристаллов
В этом проекте вводятся биты плавкого предохранителя ATmega328P и показано, как установить их для использования внешнего кварцевого генератора 16 МГц.
Обзор статьи
Биты предохранителей, также называемые предохранителями или конфигурационными битами, - это настройки, сделанные в микроконтроллерах для управления определенными операциями, которые обычно не изменяются во время выполнения программного кода. В этой статье объясняется, что эти операции находятся в ATmega328P, и как их устанавливать в целом. Биты плавких предохранителей для выбора источника синхронизации будут рассмотрены более подробно, в том числе, как и почему 16 МГц внешний кварцевый генератор.
Цепь программирования ATmega328P
Простая схема программирования для ATmega328P показана на фотографии ниже. Схематическая диаграмма, полный список деталей и детали конструкции содержатся в предыдущей статье. Вам понадобится схема программирования ATmega328P, как показано ниже, чтобы продолжить этот проект.

Биты предохранителей ATmega328P
Три байта предохранителя
В ATmega328P имеется 19 бит плавких предохранителей, и они разделены на три разных байта предохранителя. Три бита плавкого предохранителя содержатся в «Расширенном байне предохранителя», восемь из которых содержатся в «Верхнем байте предохранителя», а еще восемь - в «Батете с низким уровнем предохранителей».
Ниже приводится таблица 31-5 из версии таблицы ATmega328 / P от ноября 2016 года. Как вы можете видеть, весь расширенный байпас предохранителя имеет дело с уровнем обнаружения Brownout. Обнаружение Brownout является особенностью многих микроконтроллеров, что позволяет им перезагружаться, когда напряжение питания падает ниже определенного уровня. В случае ATmega328P в качестве минимально допустимого напряжения питания можно выбрать одно из трех разных напряжений (номинально 1, 8 В, 2, 7 В или 4, 3 В).
Возможно, самое главное заметить из таблицы, что программирование бит-бит состоит в том, чтобы установить его на низком уровне, то есть 0 (ноль), что противоположно тому, что вы могли ожидать. Например, обратите внимание, что каждый бит не запрограммирован, если он установлен на логический максимум, т. Е. 1 (один). Этот несколько необычный метод применяется ко всем битам во всех байтах предохранителей в ATmega328P.

Таблица 31-6 из таблицы данных воспроизводится ниже. Биты 2-0 используются для установки размера загрузки для ATmega328P; размер загрузки относится к объему памяти, зарезервированному для установки «загрузчика», аналогичного функции загрузчика, используемого в линейке плат разработки Arduino. Цели оставшихся бит в верхнем байте предохранителя становятся достаточно понятными для записей в таблице. Два бита, которых следует избегать, если вы не уверены, что знаете, что вы делаете, это бит7, бит RSTDISBL (внешний сброс сброса) и бит 5, бит SPIEN (Serial Peripheral Interface Enable). Отключение одного из них часто является причиной «кирпичных» Atmel μC; «Оставь их в покое» - это хороший совет.

Подробная информация о целях и процедурах настройки для всех 19 битов предохранителей содержится в техническом описании ATmega328 / P; установка младшего байта предохранителя будет включена в эту статью. Однако общий процесс программирования всех бит плавких предохранителей аналогичен.
Варианты с низким байтом предохранителя
Этот младший байт предохранителя выбирает источник синхронизации для ATmega328P и контролирует некоторые детали работы с часами. Таблица 31-7 из таблицы данных воспроизводится ниже.

Не забывайте, что программирование бит плавкого предохранителя состоит в установке его низкого значения, то есть 0 (ноль). Например, обратите внимание, что бит 7 используется для включения / выключения деления часов на 8; чтобы включить деление тактовой частоты на 8, бит 7 должен быть установлен на 0 (низкий), а для отключения деления тактовой частоты на 8 бит 7 должен быть установлен на 1 (высокий).
- Бит 7 управляет тем, включена ли функция деления по частоте по 8, а бит 6 определяет, присутствует ли выходной сигнал часов на PORTB0 микроконтроллера.
- Биты 5 и 4 управляют временем запуска микроконтроллера, который предназначен для предотвращения попытки микросхемы начать работу до того, как напряжение питания достигнет приемлемого минимального уровня.
- Биты с 3 по 0 используются для выбора источника синхронизации, а в таблице 13-1 представлены доступные источники синхронизации часов.

По умолчанию Байт по умолчанию
Вау! По общему признанию, это много данных, которые нужно рассмотреть, чтобы установить 8 бит байта Fuse Low, но все это необходимо, и нет «комнаты для маневра». (Рискуя казаться чрезмерно критичным, этот автор считает, что техническое описание может быть написано более четко, чтобы передать детали этого довольно запутанного процесса.)
К счастью, есть много информации, которая очень четко указана в таблице данных; значения по умолчанию, запрограммированные в ATmega328P, когда они отправлены с завода, безошибочны. Посмотрите на таблицу 31-7, ранее представленную.
- Разделить тактовые сигналы на 8 активируется бит 7, установленным на 0.
- Выходной сигнал часов на PORTB0 отключен бит 6, установленным на 1.
- Выбор источника синхронизации устанавливается на внутренний калиброванный RC-генератор по битам 3, 2, 1 и 0, установленным на 0010. (См. Таблицу 13-1, представленную ранее, а таблица 13-11 показана ниже).

Время запуска частично зависит от выбранного типа генератора и устанавливается битами 5 и 4. В случае внутреннего откалиброванного RC-генератора эта информация поступает из таблицы 13-12. Программирование битов 5 и 4 (предохранители SUT1 и SUT0) задается для каждого из трех условий мощности. По умолчанию используется медленно растущая мощность и приводит к времени запуска 6 тактов после отключения питания или энергосбережения, а также дополнительных 14 тактов и времени запуска 65 миллисекунд после сброса. См. Таблицу 31-12, показанную ниже.

Теперь вам должно быть понятно, что младший байт предохранителя предварительно запрограммирован на 01100010 (который в шестнадцатеричной нотации равен 0x62) и что это значит для работы микроконтроллера. Если какая-либо часть этого не ясна, не удивляйтесь; это сложный вопрос. Ваше время, вероятно, было бы хорошо потрачено на повторное чтение применимых частей разделов 13 и 31 таблицы ATmega328P.
Теперь сделаем некоторые изменения
Если вы знакомы с семейством микроконтроллеров Arduino, особенно с Arduino UNO, вы, вероятно, помните, что он использует микроконтроллер ATmega328P. Возможно, вы также помните, что UNO имеет внешнюю схему генератора, состоящую из кристалла 16 МГц и двух небольших керамических конденсаторов (часто около 22 пФ каждый). Вы также можете вспомнить, что рабочая скорость ООН составляет 16 МГц.
Но как насчет ATmega328P "// www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?langId=-1&storeId=10001&catalogId=10001&productId=325139" target = "_ blank"> Jameco # 325139) и два 22pF керамических конденсатора (Jameco # 81533). Полученная схематическая диаграмма воспроизводится сразу же ниже, а фотография макетной схемы находится чуть ниже схемы.


Программное обеспечение: измените настройки нижнего байта предохранителя
После того, как вы добавили схему кварцевого генератора 16 МГц и дважды проверили свою проводку, следующая цель - определить, какие изменения в битах предохранителя необходимы для кварцевого генератора низкой мощности. Баланс расширенного предохранителя и верхний байт предохранителя не зависят от изменения осциллятора; необходимо заменить только младший байт предохранителя.
Предупреждение! Не меняйте источник синхронизации на внешний кристалл, если у вас на самом деле не установлен кристалл. Если вы это сделаете, часов для ATmega328P не будет, и поэтому нет возможности перепрограммировать его.
Рассмотрим бит байта побайтового разряда.
- Бит 7 управляет операцией «разделить на 8», а значение по умолчанию 0 имеет включенную функцию, которую вы не хотите. Итак, бит 7 необходимо изменить с 0 на 1.
- Бит 6 управляет выходным тактовым сигналом на PORTB0, который вам неинтересен. Таким образом, бит 6 может быть установлен в 1.
- Биты 3-0 управляют выбором осциллятора, а настройка по умолчанию 0010 - использовать откалиброванный внутренний RC-генератор, которого вы не хотите. Вам нужен кварцевый генератор малой мощности, и согласно таблице 13-1 биты 3-0 должны быть установлены на 1111, 1110, 1101, 1100, 1011, 1010, 1001 или 1000, но какой? Читай дальше.

В таблице 13-3 указано, что для работы от 8, 0 до 16, 0 МГц биты 3-1 (CKSEL (3: 1)) должны быть установлены на 111. Но как насчет CKSEL (0)? Читай дальше.

Биты 5 и 4 управляют временем запуска, а значение по умолчанию - 10 для задержки запуска шести тактовых циклов от выключения и энергосбережения плюс дополнительная задержка запуска 14 тактов и 65 миллисекунд от сброса. Из таблицы 13-4, чтобы быть на безопасной стороне для низкомощного кварцевого генератора, вы хотите, чтобы максимальная задержка была равна 16 000 тактов от выключения питания и энергосбережения, поэтому SUT (1) должен быть установлен на 1, плюс дополнительную задержку запуска 14 тактов и 65 миллисекунд от сброса, поэтому SUT (0) следует установить в 1. Кроме того, CKSEL (0) должен быть установлен в 1.

Таким образом, бит 7 равен 1, бит 6 равен 1, бит 5 равен 1, бит 4 равен 1, бит 3-0 - 1111. Следовательно, новый младший байт предохранителя должен быть 11111111, который в шестнадцатеричной системе обозначается 0xFF. Уф! Вы, наконец, добрались!
AVRDUDE
Avrdude - это утилита с командной строкой, которая более подробно объясняется в этой статье. Это единственный программный инструмент, необходимый для программирования изменений байтов предохранителей в ATmega328P и длинного списка других микроконтроллеров Atmel. Снимок экрана ниже - это фактический сеанс avrdude, который используется с программным программистом AVR, подключенным к ATmega328P, как показано на принципиальной схеме и сборке паяльников в этой статье ранее. Номера строк добавлены в экранный снип, чтобы упростить ссылку на определенные части сеанса программирования.
Строки 1-3 были созданы avrdude, как только программа была запущена.
Строка 5 показывает, что активная директория изменяется на место, где была установлена avrdude. В этом случае созданный и используемый каталог также назывался «avrdude». Вы должны перейти в каталог, в котором вы установили avrdude на свой компьютер.
Строка 7 - это команда, чтобы сказать avrdude, какой программист используется и какой микроконтроллер Atmel прилагается. В этом случае программатор AVR Pocket использует драйвер USBTiny, а используемый микроконтроллер - ATmega328P.
Строки 9-17 - это ответы от avrdude. Строка 13 представляет сигнатуру ATmega328P в шестнадцатеричной системе: 0x1e950f. Строка 15 представляет программирование бит-бит в настоящее время в ATmega328P также в шестнадцатеричной нотации; в этом случае байты предохранителей программируются по умолчанию. Байт расширенного предохранителя равен 0xFF, старший байт предохранителя равен 0xD9, а младший байт предохранителя - 0x62.
Строка 20 - это команда, чтобы сказать avrdude, какой программатор используется и какой микроконтроллер Atmel подключен, и изменить младший байт предохранителя на 0xFF.
Строки 22-45 - это ответы от avrdude. Каждая строка представляет шаг, который был выполнен, а строка 43 представляет новое программирование бит-бит в ATmega328P. Байт расширенного предохранителя равен 0xFF, старший байт предохранителя равен 0xD9, а младший байт предохранителя - 0xFF.
Строка 48 - это команда, чтобы сказать avrdude, какой программатор используется и какой микроконтроллер Atmel подключен, и изменить младший байт предохранителя на 0x62. (Установка младшего байта предохранителя в 0x62 необходима, только если вы хотите вернуться к исходной конфигурации, поскольку значение 0x62 является значением по умолчанию.)
Строки 50-73 - это ответы от avrdude. Каждая строка представляет шаг, который был выполнен, а строка 43 представляет новое программирование бит-бит в ATmega328P. Байт расширенного предохранителя равен 0xFF, старший байт предохранителя равен 0xD9, а младший байт предохранителя - 0x62. Теперь байты предохранителей снова запрограммированы по заводским настройкам по умолчанию.

«Сжигание» младшего байта предохранителя
Когда все (аппаратное и программное обеспечение) готово, фактически перепрограммируемые байты предохранителей являются довольно противоречивыми; это происходит так быстро, что, если вы не смотрите внимательно, вы можете пропустить это. Таким образом, предоставление некоторых доказательств изменений, которые были сделаны, стоит того. Достаточно легко сделать это, используя тот же светодиодный мигающий программный продукт, который используется в макетировании и программировании ATmega328P & ATtiny45 в Atmel Studio 7. Если он все еще запрограммирован в вашем ATmega328P, вы опережаете игру; если нет, загрузите его с помощью кнопки ниже и установите его.
Новый Blink.zip
Новый Blink.c мигает желтым светодиодом на ½ секунды и выключается на ½ секунды, 60 раз в минуту. Убедитесь, что он все еще делает это на вашем макете.
Как вы (надеюсь) вспомните, ATmega328P использует свой откалиброванный внутренний генератор и не полагается на 16-мегагерцовый кварцевый генератор, который вы только что добавили. В этот момент кристалл игнорируется из-за установки низкого байта предохранителя. (Помните, что младший байт предохранителя по-прежнему установлен на заводское значение по умолчанию 0x62, что указывает на использование внутреннего генератора.) К счастью, наличие кристалла и двух его 22pF-конденсаторов ничего не делает для предотвращения использования внутреннего генератора. Чтобы внести изменения в 16-мегагерцовый кварцевый генератор, выполните следующие два шага.
- Сначала запустите avrdude, а затем выполните процедуру, описанную в строках 4-17 выше на экране. Результат должен подтвердить, что младший байт предохранителя по-прежнему установлен в 0x62, что указывает на использование откалиброванного внутреннего генератора.
- Во-вторых, следуйте процедуре, описанной в строках 20-45. Результат должен подтвердить, что младший байт предохранителя теперь изменен на 0xFF, что указывает на использование кварцевого генератора.
Следите за желтым светодиодом; вы заметили, что скорость вспышки изменилась? Вот почему.
Мало того, что бит байта с низким байтом 0x62 вызывает использование внутреннего 8MHz-генератора, он также указывает, что функция деления на 8 включена. Поэтому эффективная скорость генератора составляет 1 МГц, что отражено в строке 3 нового кода Blink.c, изображенной ниже. (Важно понимать, что строка 3 не контролирует скорость, с которой запускается ATmega328P, но, скорее, она сообщает компилятору, что микроконтроллер должен работать на частоте 1 МГц, чтобы код выполнялся с нужной скоростью.)

Поскольку вы изменили младший байт предохранителя от 0x62 до 0xFF, вы изменили генератор, используемый для кристалла 16 МГц. Кроме того, вы отключили функцию «Разделить на 8». Чистый эффект этих двух изменений заключается в том, что часы ATmega328P теперь работают на частоте 16 МГц, но строка 3 в New Blink.c все еще сообщает компилятору, что микроконтроллер работает на частоте 1 МГц. Поэтому скорость вспышки в 16 раз выше, чем должна быть. Что делать?
Запустите Atmel Studio 7 и, конечно, смените строку 3. Вместо #define F_CPU 1000000UL сделайте строку 3 прочитанной #define F_CPU 16000000UL, которая сообщает компилятору, что часы теперь работают на частоте 16 МГц. Затем перестройте проект и загрузите обновленный код в AT328P. Почти сразу светодиод возобновит мигание на ½ секунды и выключится на ½ секунды, 60 раз в минуту, что именно то, что вы хотите.
Простой способ?
«Нет ли более простого способа?» вы можете спросить, и ответ «да». Есть несколько онлайн-приложений, которые будут определять настройки байта предохранителя, чтобы отразить выбранные функции, а одним из самых популярных является калькулятор EnB EngBedded от AVR. Тем не менее, веб-сайты имеют способ исчезнуть, и всегда хорошо знать, как сделать это самостоятельно; таким образом вы можете понять «как» и «почему» в дополнение к «чему».
Что дальше?
Следующая статья в этой серии будет более подробно обсуждать работу Atmel Studio 7 и представит гораздо менее дорогой способ иметь подлинного программиста Atmel ICE. Он скоро появится здесь на AllAboutCircuits.com.
Попробуйте этот проект сами! Получить спецификацию.