Узнайте о битах конфигурации ATmega328P и о том, как использовать их с внешним кварцевым резонатором

Добавлено 17 января 2018 в 19:05

В данном проекте приводится введение во fuse-биты ATmega328P и показывается, как установить их для использования внешнего кварцевого резонатора 16 МГц.

Обзор статьи

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

Схема программирования ATMega328P

На фотографии ниже показана простая схема программирования ATmega328P. Схема, полный список компонентов и подробности о сборке содержатся в предыдущей статье. Для продолжения работы с данной статьей вам понадобится собрать данную схему.

Схема программирования ATmega328P
Схема программирования ATmega328P

Биты конфигурации ATmega328P

Три байта конфигурации

В ATmega328P в общей сложности имеется 19 бит конфигурации, и они разделены на три разных байта конфигурации. Три бита конфигурации содержатся в «дополнительном байте конфигурации», восемь – в «старшем байте конфигурации», и еще восемь – в «младшем байте конфигурации».

Ниже приводится таблица 31-5 из технического описания ATmega328P версии от ноября 2016 года. Как вы можете видеть, весь дополнительный байт конфигурации работает с уровнем контроля понижения напряжения питания микроконтроллера (brownout).Контроль понижения напряжения питания (brownout) является особенность многих микроконтроллеров, что позволяет им перезагружаться, когда напряжение питания падает ниже определенного уровня. В случае ATMega328P в качестве минимально допустимого напряжения питания можно выбрать одно из трех разных напряжений (1,8 В, 2,7 В или 4,3 В).

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

Таблица 31-5. Дополнительный байт конфигурации ATmega328P
Название бита конфигурацииНомер битаОписаниеЗначение по умолчанию
71
61
51
41
31
BODLEVEL22Уровень срабатывания детектора понижения напряжения питания1 (не запрограммирован)
BODLEVEL11Уровень срабатывания детектора понижения напряжения питания1 (не запрограммирован)
BODLEVEL00Уровень срабатывания детектора понижения напряжения питания1 (не запрограммирован)

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

Таблица 31-6. Старший байт конфигурации
Название бита конфигурацииНомер битаОписаниеЗначение по умолчанию
RSTDISBL7Выключение внешнего сброса1 (не запрограммирован)
DWEN6Включение DebugWire1 (не запрограммирован)
SPIEN5Включение последовательного программирования и загрузки данных0 (запрограммирован, SPI программирование включено)
WDTON4Сторожевой таймер всегда включен1 (не запрограммирован)
EESAVE3Память EEPROM сохраняется при стирании чипа1 (не запрограммирован), EEPROM не защищена
BOOTSZ12Выбор размера области загрузки (смотрите параметры загрузчика)0 (запрограммирован)
BOOTSZ01Выбор размера области загрузки (смотрите параметры загрузчика)0 (запрограммирован)
BOOTRST0Выбор вектора сброса1 (не запрограммирован)

Подробная информация о назначении всех 19 битов конфигурации содержится в техническом описании ATmega328P; в данной статье будет включено описание настройки младшего байта конфигурации. Однако общий процесс программирования всех битов конфигурации аналогичен.

Варианты выбора младшего байта конфигурации

Младший байт конфигурации выбирает источник тактового сигнала ATmega328P и управляет некоторыми деталями работы тактовой синхронизации. Ниже приведена таблица 31-7 из технического описания.

Таблица 31-7. Младший байт конфигурации
Название бита конфигурацииНомер битаОписаниеЗначение по умолчанию
CKDIV87Делитель на 80 (запрограммирован)
CKOUT6Выход тактового сигнала1 (не запрограммирован)
SUT15Выбор времени запуска1 (не запрограммирован)
SUT04Выбор времени запуска0 (запрограммирован)
CKSEL33Выбор источника тактового сигнала0 (запрограммирован)
CKSEL22Выбор источника тактового сигнала0 (запрограммирован)
CKSEL11Выбор источника тактового сигнала1 (не запрограммирован)
CKSEL00Выбор источника тактового сигнала0 (запрограммирован)

Не забывайте, что программирование бита конфигурации состоит в том, чтобы установить его в состояние низкого логического уровня, т.е. 0. Например, обратите внимание, что бит 7 используется для включения/выключения деления частоты тактового сигнала на 8; чтобы включить деление тактовой частоты на 8, бит 7 должен быть установлен в 0, а для отключения деления бит 7 должен быть установлен в 1.

  • Бит 7 управляет тем, включена ли функция деления тактовой частоты на 8, а бит 6 определяет, присутствует ли выходной тактовый сигнал на выводе PORTB0 микроконтроллера.
  • Биты 5 и 4 управляют временем запуска микроконтроллера, что предназначено для предотвращения попытки микросхемы начать работу до того, как напряжение питания достигнет приемлемого минимального уровня.
  • Биты с 3 по 0 используются для выбора источника тактового сигнала, а в таблице 13-1 представлены доступные источники.
Таблица 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 ниже);
Таблица 13-11. Режимы работы внутреннего откалиброванного RC генератора
Диапазон частот(1), МГцCKSEL[3:0]
7,3 – 8,10010(2)

Примечание:

  1. если согласно спецификации на устройство ожидается частота 8 МГц (зависит от VCC), бит CKDIV8 должен быть запрограммирован соответствующим образом;
  2. устройство поставляется с выбором этого варианта.
  • время запуска частично зависит от выбранного типа генератора и устанавливается битами 5 и 4. В случае внутреннего откалиброванного RC генератора эта информация берется из таблицы 13-12. Программирование битов 5 и 4 (SUT1 и SUT0) задается для каждого из трех условий питания. По умолчанию используется медленно нарастающее питание и приводит к времени запуска 6 тактовых циклов после выключения и снижения энергопотребления, плюс дополнительные 14 тактовых циклов и 65 миллисекунд запуска после сброса. Смотрите таблицу 13-12 ниже
Таблица 13-12. Время запуска при выборе внутреннего калиброванного RC геренатора
Условия питанияВремя запуска после выключения и снижения энергопотребленияДополнительная задержка после сброса (VCC = 5.0 В)SUT[1:0]
Контроль понижения напряжения питания (BOD) включен6 тактовых циклов14 тактовых циклов00
Быстро нарастающее напряжение питания6 тактовых циклов14 тактовых циклов + 4,1 мс01
Медленно нарастающее напряжение питания6 тактовых циклов14 тактовых циклов + 65 мс10(1)
Зарезервировано11

Примечание:

  1. устройство поставляется с выбором этого варианта.

Теперь вам должно быть понятно, что младший байт конфигурации предварительно запрограммирован на 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 пФ. Полученная схема показана ниже, а после нее показана фотография собранного макета.

Схема программирования ATmega328P с внешним кварцем и карманным AVR программатором
Схема программирования ATmega328P с внешним кварцем и программатором AVR Pocket
Схема программирования ATmega328P с внешним кварцем и карманным AVR программатором
Схема программирования ATmega328P с внешним кварцем и программатором AVR Pocket

Программные изменения: изменение настроек младшего байта конфигурации

После того, как вы добавили схему кварцевого генератора на 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-1. Варианты выбора тактирующего устройства
Тактирующее устройство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? Читаем дальше.

Таблица 13-3. Режимы кварцевого генератора малой мощности(1)
Диапазон частот, МГцCKSEL[3:1](2)Диапазон номиналов конденсаторов C1 и C2, пФ
0,4 – 0,9100(3)
0,9 – 3,010112 – 22
3,0 – 8,011012 – 22
8,0 – 16,011112 – 22

Примечание:

  1. если частота кварцевого резонатора превышает требования в спецификации устройства (зависит от VCC), бит CKDIV8 может быть запрограммирован на деление внутренней частоты на 8. При этом необходимо убедиться, что полученная деленная частота соответствует требованиям к частоте в спецификации устройства;
  2. рекомендуемые настройки CKSEL для разных частотных диапазонов;
  3. этот вариант не может использоваться с кварцевыми резонаторами, а только с керамическими резонаторами.

Биты 5 и 4 управляют временем запуска, а значение по умолчанию 10 обеспечивает задержку запуска на 6 тактовых циклов после выключения или снижения энергопотребления плюс дополнительную задержку запуска на 14 тактовых циклов плюс 65 миллисекунд после сброса. Из таблицы 13-4 видно, что, чтобы быть в безопасной зоне для кварцевого генератора малой мощности, вам необходима максимально возможная задержка в 16000 тактовых циклов после выключения или снижения энергопотребления, поэтому SUT1 должен быть установлен в 1, плюс дополнительная задержка запуска на 14 тактовых циклов и 65 миллисекунд после сброса, поэтому SUT0 должен быть установлен в 1. Кроме того, CKSEL0 должен быть установлен в 1.

Таблица 13-4. Время запуска при выборе кварцевого генератора малой мощности
Резонатор генератора источника / условия питанияВремя запуска после выключения и снижения энергопотребленияДополнительная задержка после сброса (VCC = 5.0 В)CKSEL0SUT[1:0]
Керамический резонатор, быстро нарастающее напряжение питания258 тактовых циклов14 тактовых циклов + 4,1 мс(1)000
Керамический резонатор, медленно нарастающее напряжение питания258 тактовых циклов14 тактовых циклов + 65 мс(2)001
Керамический резонатор, BOD включен1 тактовый цикл14 тактовых циклов(2)010
Керамический резонатор, быстро нарастающее напряжение питания1 тактовый цикл14 тактовых циклов + 4,1 мс(2)011
Керамический резонатор, медленно нарастающее напряжение питания1 тактовый цикл14 тактовых циклов + 65 мс(2)100
Кварцевый резонатор, BOD включен16 тактовых циклов14 тактовых циклов101
Кварцевый резонатор, быстро нарастающее напряжение питания16 тактовых циклов14 тактовых циклов + 4,1 мс110
Кварцевый резонатор, медленно нарастающее напряжение питания16 тактовых циклов14 тактовых циклов + 65 мс111

Примечание:

  1. эти варианты могут использоваться только, когда рабочая частота не близка к максимальной частоте устройства, и если стабильность частоты при запуске для приложения не важна. Эти варианты не подходят для кварцевых резонаторов;
  2. эти варианты предназначены для использования с керамическими резонаторами и обеспечивают стабильность частоты при запуске. Они также могут использоваться с кварцевыми резонаторами, когда рабочая частота не близка к максимальной частоте устройства, а стабильность частоты при запуске для приложения не важна.

Таким образом, бит 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. Теперь байты конфигурации снова запрограммированы на заводские значения по умолчанию.

Примеры чтения и записи младшего байта конфигурации с помощью avrdude
Примеры чтения и записи младшего байта конфигурации с помощью avrdude

«Прошивка» младшего байта конфигурации

Когда всё (и аппаратное, и программное обеспечение) готово, реальное перепрограммирование байтов конфигурации довольно противоречиво; оно происходит так быстро, что, если вы не смотрите внимательно, то можете упустить его. Таким образом, стоит представить некоторые доказательства выполненных изменений. Это достаточно легко сделать, используя ту же программу мигания светодиодом, что и в статье «Макетирование и программирование 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 программатора.


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке