Узнайте о битах конфигурации ATmega328P и о том, как использовать их с внешним кварцевым резонатором
В данном проекте приводится введение во fuse-биты ATmega328P и показывается, как установить их для использования внешнего кварцевого резонатора 16 МГц.
Обзор статьи
Fuse-биты, также известные как фьюзы или биты конфигурации, – это настройки микроконтроллера для управления определенными действиями, которые обычно не изменяются во время выполнения программного кода. В данной статье вкратце объясняется, какие действия находятся в ATmega328P, и как их устанавливать. Fuse-биты для выбора источника тактового сигнала будут рассмотрены более подробно, в том числе, как и зачем выбрать внешний кварцевый резонатор 16 МГц.
Схема программирования ATMega328P
На фотографии ниже показана простая схема программирования ATmega328P. Схема, полный список компонентов и подробности о сборке содержатся в предыдущей статье. Для продолжения работы с данной статьей вам понадобится собрать данную схему.
Биты конфигурации ATmega328P
Три байта конфигурации
В ATmega328P в общей сложности имеется 19 бит конфигурации, и они разделены на три разных байта конфигурации. Три бита конфигурации содержатся в «дополнительном байте конфигурации», восемь – в «старшем байте конфигурации», и еще восемь – в «младшем байте конфигурации».
Ниже приводится таблица 31-5 из технического описания ATmega328P версии от ноября 2016 года. Как вы можете видеть, весь дополнительный байт конфигурации работает с уровнем контроля понижения напряжения питания микроконтроллера (brownout).Контроль понижения напряжения питания (brownout) является особенность многих микроконтроллеров, что позволяет им перезагружаться, когда напряжение питания падает ниже определенного уровня. В случае ATMega328P в качестве минимально допустимого напряжения питания можно выбрать одно из трех разных напряжений (1,8 В, 2,7 В или 4,3 В).
Возможно, самое важное, на что следует обратить внимание в таблице, состоит в том, что программирование битов конфигурации состоит в установке их в состояние логического нуля, что является противоположностью ожидаемого поведения. Например, обратите внимание, что каждый бит не запрограммирован, когда он установлен в высокий логический уровень, т.е. 1. Этот несколько необычный метод применяется ко всем байтам конфигурации ATmega328P.
Название бита конфигурации | Номер бита | Описание | Значение по умолчанию |
---|---|---|---|
– | 7 | – | 1 |
– | 6 | – | 1 |
– | 5 | – | 1 |
– | 4 | – | 1 |
– | 3 | – | 1 |
BODLEVEL2 | 2 | Уровень срабатывания детектора понижения напряжения питания | 1 (не запрограммирован) |
BODLEVEL1 | 1 | Уровень срабатывания детектора понижения напряжения питания | 1 (не запрограммирован) |
BODLEVEL0 | 0 | Уровень срабатывания детектора понижения напряжения питания | 1 (не запрограммирован) |
Ниже приведена таблица 31-6 из технического описания. Биты 2-0 используются для установки размера области загрузки ATmega328P; размер области загрузки относится к объему памяти, зарезервированному для установки «загрузчика», аналогичного функции загрузчика, используемого в линейке отладочных плат Arduino. Назначение оставшихся битов в старшем байте конфигурации достаточно понятно из описаний в таблице. Два бита, которых следует избегать, если вы не уверены, что знаете, что делаете, это бит 7, бит RSTDISBL (выключение внешнего сброса), и бит 5 бит SPIEN (включение последовательного периферийного интерфейса). Отключение одного из них часто является причиной появления «кирпичных» микроконтроллеров Atmel; поэтому хорошим советом будет: «оставить их в покое».
Название бита конфигурации | Номер бита | Описание | Значение по умолчанию |
---|---|---|---|
RSTDISBL | 7 | Выключение внешнего сброса | 1 (не запрограммирован) |
DWEN | 6 | Включение DebugWire | 1 (не запрограммирован) |
SPIEN | 5 | Включение последовательного программирования и загрузки данных | 0 (запрограммирован, SPI программирование включено) |
WDTON | 4 | Сторожевой таймер всегда включен | 1 (не запрограммирован) |
EESAVE | 3 | Память EEPROM сохраняется при стирании чипа | 1 (не запрограммирован), EEPROM не защищена |
BOOTSZ1 | 2 | Выбор размера области загрузки (смотрите параметры загрузчика) | 0 (запрограммирован) |
BOOTSZ0 | 1 | Выбор размера области загрузки (смотрите параметры загрузчика) | 0 (запрограммирован) |
BOOTRST | 0 | Выбор вектора сброса | 1 (не запрограммирован) |
Подробная информация о назначении всех 19 битов конфигурации содержится в техническом описании ATmega328P; в данной статье будет включено описание настройки младшего байта конфигурации. Однако общий процесс программирования всех битов конфигурации аналогичен.
Варианты выбора младшего байта конфигурации
Младший байт конфигурации выбирает источник тактового сигнала ATmega328P и управляет некоторыми деталями работы тактовой синхронизации. Ниже приведена таблица 31-7 из технического описания.
Название бита конфигурации | Номер бита | Описание | Значение по умолчанию |
---|---|---|---|
CKDIV8 | 7 | Делитель на 8 | 0 (запрограммирован) |
CKOUT | 6 | Выход тактового сигнала | 1 (не запрограммирован) |
SUT1 | 5 | Выбор времени запуска | 1 (не запрограммирован) |
SUT0 | 4 | Выбор времени запуска | 0 (запрограммирован) |
CKSEL3 | 3 | Выбор источника тактового сигнала | 0 (запрограммирован) |
CKSEL2 | 2 | Выбор источника тактового сигнала | 0 (запрограммирован) |
CKSEL1 | 1 | Выбор источника тактового сигнала | 1 (не запрограммирован) |
CKSEL0 | 0 | Выбор источника тактового сигнала | 0 (запрограммирован) |
Не забывайте, что программирование бита конфигурации состоит в том, чтобы установить его в состояние низкого логического уровня, т.е. 0. Например, обратите внимание, что бит 7 используется для включения/выключения деления частоты тактового сигнала на 8; чтобы включить деление тактовой частоты на 8, бит 7 должен быть установлен в 0, а для отключения деления бит 7 должен быть установлен в 1.
- Бит 7 управляет тем, включена ли функция деления тактовой частоты на 8, а бит 6 определяет, присутствует ли выходной тактовый сигнал на выводе PORTB0 микроконтроллера.
- Биты 5 и 4 управляют временем запуска микроконтроллера, что предназначено для предотвращения попытки микросхемы начать работу до того, как напряжение питания достигнет приемлемого минимального уровня.
- Биты с 3 по 0 используются для выбора источника тактового сигнала, а в таблице 13-1 представлены доступные источники.
Тактирующее устройство | CKSEL[3:0] |
---|---|
Маломощный генератор на кварцевом резонаторе | 1111 – 1000 |
Генератор на кварцевом резонаторе | 0111 – 0110 |
Низкочастотный генератор на кварцевом резонаторе | 0101 – 0100 |
Внутренний RC генератор 128 кГц | 0011 |
Откалиброванный внутренний RC генератор | 0010 |
Внешний тактовый сигнал | 0000 |
Зарезервировано | 0001 |
Примечание: для всех битов конфигурации, '1' означает не запрограммированный, а '0' – запрограммированный.
Значения по умолчанию младшего байта конфигурации
Вау! По общему признанию, чтобы установить 8 бит младшего байта конфигурации, требуется много данных, но всё это необходимо, и нет "пути обхода" (рискуя казаться чрезмерно критичным, автор данной статьи считает, что техническое описание может быть написано более четко, чтобы передать детали этого довольно запутанного процесса).
К счастью, есть много информации, которая в техническом описании указана четко, значения по умолчанию, установленные в ATmega328, не содержат ошибок. Посмотрите на таблицу 31-7, представленную ранее:
- деление частоты тактового сигнала на 8 включено установкой бита 7 в 0;
- выход тактового сигнала на PORTB0 выключен установкой бита 6 в 1;
- выбор источника тактового сигнала установлен на внутренний откалиброванный RC генератор установкой битов 3, 2, 1 и 0 в значения 0010 (смотрите таблицу 13-1 выше и таблицу 13-11 ниже);
Диапазон частот(1), МГц | CKSEL[3:0] |
---|---|
7,3 – 8,1 | 0010(2) |
Примечание:
- если согласно спецификации на устройство ожидается частота 8 МГц (зависит от VCC), бит CKDIV8 должен быть запрограммирован соответствующим образом;
- устройство поставляется с выбором этого варианта.
- время запуска частично зависит от выбранного типа генератора и устанавливается битами 5 и 4. В случае внутреннего откалиброванного RC генератора эта информация берется из таблицы 13-12. Программирование битов 5 и 4 (SUT1 и SUT0) задается для каждого из трех условий питания. По умолчанию используется медленно нарастающее питание и приводит к времени запуска 6 тактовых циклов после выключения и снижения энергопотребления, плюс дополнительные 14 тактовых циклов и 65 миллисекунд запуска после сброса. Смотрите таблицу 13-12 ниже
Условия питания | Время запуска после выключения и снижения энергопотребления | Дополнительная задержка после сброса (VCC = 5.0 В) | SUT[1:0] |
---|---|---|---|
Контроль понижения напряжения питания (BOD) включен | 6 тактовых циклов | 14 тактовых циклов | 00 |
Быстро нарастающее напряжение питания | 6 тактовых циклов | 14 тактовых циклов + 4,1 мс | 01 |
Медленно нарастающее напряжение питания | 6 тактовых циклов | 14 тактовых циклов + 65 мс | 10(1) |
Зарезервировано | 11 |
Примечание:
- устройство поставляется с выбором этого варианта.
Теперь вам должно быть понятно, что младший байт конфигурации предварительно запрограммирован на 01100010 (что в шестнадцатеричной нотации равно 0x62), и что это значит для работы микроконтроллера. Если что-то из этого вам непонятно, не удивляйтесь: это сложный вопрос. Вероятно, вам стоит потратить время и перечитать разделы 13 и 31 технического описания ATmega328P.
Теперь сделаем некоторые изменения
Если вы знакомы с семейством микроконтроллерных платформ Arduino, особенно с Arduino Uno, вы, вероятно, помните, что она использует микроконтроллер ATmega328P. Возможно, вы также помните, что UNO имеет внешнюю схему генератора, состоящую из кристалла 16 МГц и двух небольших керамических конденсаторов (часто около 22 пФ каждый). Вы можете также вспомнить, что рабочая частота UNO равна 16 МГц.
Но как насчет ATmega328P? Можете ли вы определить его стандартную рабочую частоту, когда он поставляется с завода?
Вы знаете, что по умолчанию источник тактового сигнала в ATmega328P – это внутренний RC генератор, но вы помните его частоту? Ответ в приложении 2 в таблице 31-7: 8 МГц. И поскольку значение по умолчанию бита 7 младшего байта конфигурации равно 0, деление тактовой частоты на 8 включено. Таким образом, стандартная рабочая частота ATmega328P равна... погодите... 1 МГц.
Но предположим, ваш проект требует тактовую частоту ATmega328P 16 МГц, знаете ли вы, как это сделать? Как обычно, требуется и аппаратное, и программное вмешательство.
Аппаратные изменения: добавим кварцевый резонатор
Чтобы запустить ATmega328P на частоте 16 МГц, вам нужно добавить в схему, показанную в самом начале статьи, внешний кварцевый резонатор. Требуются только три новые детали: резонатор 16 МГц и два керамических конденсатора 22 пФ. Полученная схема показана ниже, а после нее показана фотография собранного макета.
Программные изменения: изменение настроек младшего байта конфигурации
После того, как вы добавили схему кварцевого генератора на 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, но на какое именно значение? Читаем дальше.
Тактирующее устройство | CKSEL[3:0] |
---|---|
Маломощный генератор на кварцевом резонаторе | 1111 – 1000 |
Генератор на кварцевом резонаторе | 0111 – 0110 |
Низкочастотный генератор на кварцевом резонаторе | 0101 – 0100 |
Внутренний RC генератор 128 кГц | 0011 |
Откалиброванный внутренний RC генератор | 0010 |
Внешний тактовый сигнал | 0000 |
Зарезервировано | 0001 |
Примечание: для всех битов конфигурации, '1' означает не запрограммированный, а '0' – запрограммированный.
Таблица 13-3 указывает, что для работы с частотой от 8,0 до 16,0 МГц биты 3-1 (CKSEL[3:1]) должны быть установлены в 111. Но что с CKSEL0? Читаем дальше.
Диапазон частот, МГц | CKSEL[3:1](2) | Диапазон номиналов конденсаторов C1 и C2, пФ |
---|---|---|
0,4 – 0,9 | 100(3) | – |
0,9 – 3,0 | 101 | 12 – 22 |
3,0 – 8,0 | 110 | 12 – 22 |
8,0 – 16,0 | 111 | 12 – 22 |
Примечание:
- если частота кварцевого резонатора превышает требования в спецификации устройства (зависит от VCC), бит CKDIV8 может быть запрограммирован на деление внутренней частоты на 8. При этом необходимо убедиться, что полученная деленная частота соответствует требованиям к частоте в спецификации устройства;
- рекомендуемые настройки CKSEL для разных частотных диапазонов;
- этот вариант не может использоваться с кварцевыми резонаторами, а только с керамическими резонаторами.
Биты 5 и 4 управляют временем запуска, а значение по умолчанию 10 обеспечивает задержку запуска на 6 тактовых циклов после выключения или снижения энергопотребления плюс дополнительную задержку запуска на 14 тактовых циклов плюс 65 миллисекунд после сброса. Из таблицы 13-4 видно, что, чтобы быть в безопасной зоне для кварцевого генератора малой мощности, вам необходима максимально возможная задержка в 16000 тактовых циклов после выключения или снижения энергопотребления, поэтому SUT1 должен быть установлен в 1, плюс дополнительная задержка запуска на 14 тактовых циклов и 65 миллисекунд после сброса, поэтому SUT0 должен быть установлен в 1. Кроме того, CKSEL0 должен быть установлен в 1.
Резонатор генератора источника / условия питания | Время запуска после выключения и снижения энергопотребления | Дополнительная задержка после сброса (VCC = 5.0 В) | CKSEL0 | SUT[1:0] |
---|---|---|---|---|
Керамический резонатор, быстро нарастающее напряжение питания | 258 тактовых циклов | 14 тактовых циклов + 4,1 мс(1) | 0 | 00 |
Керамический резонатор, медленно нарастающее напряжение питания | 258 тактовых циклов | 14 тактовых циклов + 65 мс(2) | 0 | 01 |
Керамический резонатор, BOD включен | 1 тактовый цикл | 14 тактовых циклов(2) | 0 | 10 |
Керамический резонатор, быстро нарастающее напряжение питания | 1 тактовый цикл | 14 тактовых циклов + 4,1 мс(2) | 0 | 11 |
Керамический резонатор, медленно нарастающее напряжение питания | 1 тактовый цикл | 14 тактовых циклов + 65 мс(2) | 1 | 00 |
Кварцевый резонатор, BOD включен | 16 тактовых циклов | 14 тактовых циклов | 1 | 01 |
Кварцевый резонатор, быстро нарастающее напряжение питания | 16 тактовых циклов | 14 тактовых циклов + 4,1 мс | 1 | 10 |
Кварцевый резонатор, медленно нарастающее напряжение питания | 16 тактовых циклов | 14 тактовых циклов + 65 мс | 1 | 11 |
Примечание:
- эти варианты могут использоваться только, когда рабочая частота не близка к максимальной частоте устройства, и если стабильность частоты при запуске для приложения не важна. Эти варианты не подходят для кварцевых резонаторов;
- эти варианты предназначены для использования с керамическими резонаторами и обеспечивают стабильность частоты при запуске. Они также могут использоваться с кварцевыми резонаторами, когда рабочая частота не близка к максимальной частоте устройства, а стабильность частоты при запуске для приложения не важна.
Таким образом, бит 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, какие используются программатор и микроконтроллер. В этом случае программатор AVR Pocket использует драйвер USBTiny, а используемый микроконтроллер – ATmega328P.
Строки 9-17 – это отклики avrdude. Строка 13 представляет сигнатуру ATmega328P в шестнадцатеричной нотации 0x1e950f. Строка 15 представляет байты конфигурации, запрограммированные в ATmega328P в текущее время, также в шестнадцатеричной нотации; в этом случае байты конфигурации запрограммированы на заводе и имеют значения по умолчанию. Дополнительный байт конфигурации равен 0xFF, старший байт конфигурации равен 0xD9, и младший байт конфигурации равен 0x62.
Строка 20 – это команда, чтобы сказать avrdude, какие используются программатор и микроконтроллер, и изменить младший байт конфигурации на 0xFF.
Строки 22-45 – это ответы от avrdude. Каждая строка представляет выполненный шаг, а строка 43 представляет программирование новых битов конфигурации в ATmega328P. Дополнительный байт конфигурации равен 0xFF, старший байт конфигурации равен 0xD9, и младший байт конфигурации равен 0xFF.
Строка 48 – это команда, указывающая avrdude, какие используются программатор и микроконтроллер, и изменить младший байт конфигурации на 0x62 (установка младшего байта конфигурации на 0x62 необходима, только если вы хотите вернуться к исходной конфигурации, поскольку значение 0x62 является значением по умолчанию).
Строки 50-73 – это ответы от avrdude. Каждая строка представляет выполненный шаг, а строка 71 представляет программирование новых битов конфигурации в ATmega328P. Дополнительный байт конфигурации равен 0xFF, старший байт конфигурации равен 0xD9, и младший байт конфигурации равен 0x62. Теперь байты конфигурации снова запрограммированы на заводские значения по умолчанию.
«Прошивка» младшего байта конфигурации
Когда всё (и аппаратное, и программное обеспечение) готово, реальное перепрограммирование байтов конфигурации довольно противоречиво; оно происходит так быстро, что, если вы не смотрите внимательно, то можете упустить его. Таким образом, стоит представить некоторые доказательства выполненных изменений. Это достаточно легко сделать, используя ту же программу мигания светодиодом, что и в статье «Макетирование и программирование ATmega328P и ATtiny45 с помощью Atmel Studio 7». Если она всё еще запрограммирована в ваш ATmega328P, то вы готовы; если нет, то создайте файл с кодом, приведенным ниже, и запрограммируйте микроконтроллер скомпилированной программой.
//New Blink.c
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRB |= 0b00000001;
while (1) {
PORTB = 0b00000001;
_delay_ms(500);
PORTB = 0b00000000;
_delay_ms(500);
}
return 0;
}
New_Blink.c мигает желтым светодиодом, включая его на ½ секунды и выключая на ½, 60 раз в минуту. Убедитесь, что программа всё еще делает это на вашем макете.
Как вы (надеюсь) вспомните, ATmega328P использует свой откалиброванный внутренний генератор и не полагается на 16-мегагерцовый кварцевый резонатор, который вы только что добавили. В данный момент резонатор игнорируется из-за настроек младшего байта конфигурации (помните, что младший байт конфигурации всё еще установлен в заводское значение по умолчанию 0x62, которое указывает на использование внутреннего геренатора). К счастью, наличие резонатора и двух конденсаторов 22 пФ ничем не мешает использованию внутреннего генератора. Чтобы перейти на 16-мегагерцовый кварцевый генератор, выполните следующие два шага:
- сначала запустите avrdude, а затем выполните процедуру, описанную в строках 4-17 на скриншоте выше. Результат должен подтвердить, что младший байт конфигурации по-прежнему установлен в 0x62, что указывает на использование откалиброванного внутреннего генератора;
- затем следуйте процедуре, описанной в строках 20-45. Результат должен подтвердить, что младший байт конфигурации теперь изменен на 0xFF, что указывает на использование кварцевого генератора.
Следите за желтым светодиодом; вы заметили, что скорость мигания изменилась? Вот почему.
Мало того, что значение младшего байта конфигурации 0x62 вызывает использование внутреннего генератора 8 МГц, оно также указывает на то, что включена функция деления на 8. Поэтому эффективная частота генератора составляет 1 МГц, что отражено в строке 3 кода New_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 МГц. Затем перекомпилируйте проект и загрузите обновленный код в ATmega328P. Почти сразу диод возобновит мигание, выключаясь на ½ секунды и включаясь на ½ секунды, 60 раз в минуту, что именно то, чего мы и хотели.
А есть способ проще?
Вы можете спросить: «А нет более простого способа?», и ответ: «Да». Есть несколько онлайн-приложений, которые будут определять настроки байта конфигурации, отображающие выбранные функции, и одним из самых популярных является калькулятор EngBedded's AVR Fuse Calculator. Тем не менее, веб-сайты могут исчезать, и всегда хорошо знать, как сделать это самостоятельно; таким образом вы можете в дополнение к «что» понять «как» и «почему».
Что дальше?
В следующей статье из серии мы обсудим работу Atmel Studio 7 более подробно и рассмотрим более дешевый способ получения genuine Atmel ICE программатора.