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

Программирование микроконтроллеров. Урок 15
Программируем конфигурационные ячейки и
подстраиваем тактовую частоту внутреннего генератора.

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


Урок 15 (Программируем конфигурационные ячейки и 
							подстраиваем тактовую частоту внутреннего генератора.)

На прошлом занятии мы с вами закончили знакомство с языком программирования (СИ) и теперь приступаем к более детальному изучению «железа». И, как водится, начнем с разгона нашего микроконтроллера.


Дело в том, что по умолчанию ATmega-8 тактируется внутренним генератором со встроенной RC-цепочкойчастотой частотой 1 МГц. Это наиболее простой и экономичный способ тактирования который не требует никаких дополнительных внешних элементов. Рабочая частота может быть 1, 2, 4 и 8 МГц и зависит от содержимого ячеек, которые расположены в специальных конфигурационных байтах, которые находятся в особой области памяти до которой можно добраться только с помощью программатора. Если же вы хотите разогнать МК на частоту больше 8МГц или нужно сделать часы, то придется подключать кварцевый резонатор. А если необходима нестандартная частота, то можно воспользоваться внешней RC-цепочкой, или генератором. Но такое понадобится вам сильно позже.

А сейчас, перед тем как вы начнете программировать конфигурационные ячейки, необходимо уяснить то, что запрограммированная ячейка имеет значение «0», а НЕ запрограммированная имеет значение «1»! Это надо запомнить, ну прям как «Отче наш». Повелось это с тех стародавних пор, когда для настройки разных устройств использовали плавкие перемычки (fuse), которые при программировании реально пережигали. Отсюда, нет сигнала (0) – функция активна, есть сигнал (1) - функция НЕ активна. Для того чтобы вы не ошибались разработчики PonyProg сделали подсказку в меню программирования конфигурационных и защитных битов. Если приглядится ее можно заметить в нижней части над строкой с надписью (Refer to device datasheet, please).

Итак, еще раз. Ячейка с галочкой это 0 - запрограммировано, а без галочки 1 – не запрограммировано! Для нашего сегодняшнего урока нам нужны только биты CKSEL3…0, но, если уж мы начали говорить о конфигурационных ячейках не лишним будет быстренько с ними ознакомиться. Итак:
BootLock12, 11 – Определяют уровень доступа к коду в секции загрузчика.
BootLock02, 01 – Определяют уровень доступа к коду в секции программы.
Look2, 1 – Определяет степень защиты памяти МК от записи и/или чтения. Будьте очень осторожны с этими ячейками. Лучше никогда их не трогать, а уж если программируете, то должны понимать для чего это делаете.
RSTDISBL – Определяет функционирование вывода МК совмещенного с RESET (0 – выход порта) / (1 – RESET). В ATmega-8 при последовательном программировании эта ячейка заблокирована. Вывод запрограммированный как выход порта не позволит в дальнейшем осуществить последовательное программирование!
WDTON – Включает (0) / выключает (1) постоянную работу сторожевого таймера.
SPIEN – Разрешает (0) / запрещает (1) последовательное программирование. В ATmega-8 при последовательном программировании эта ячейка к счастью заблокирована.
CKOPT –Увеличивает размах колебаний на выходе генератора.
EESAVE – Разрешает (1) / запрещает (0) стирать EEPROM при очистке кристалла.
BOOTSZ1, 0 – Задают размер секции загрузчика и размер секции прикладной программы.
BOOTRST – Задает вектор сброса. По умолчанию (1) – сброс происходит по адресу $0000.
BODLEVEL – Определяет порог срабатывания схемы контроля питания.
BODEN – Разрешает (0) / запрещает (1) работу схемы контроля питания.
SUT1, 0 – Определяют длительность задержки при сбросе МК.
CKSEL3…0 – Определяют режим работы тактового генератора.
Боле подробно о конфигурационных битах обязательно почитайте:
   Евстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 472…481.

В радиолюбительской практике из всех конфигурационных битов вам пригодятся только BODEN, BODLEVEL и CKSEL3…0. О работе схемы контроля питания мы как-нибудь поговорим в другой раз, а сейчас нас интересуют только биты относящиеся к тактированию МК.

Как я уже писал выше, внутренний генератор ATmega-8 может быть настроен на работу с частотами в 1, 2, 4 и 8 МГц. Для этого надо запрограммировать конфигурационные ячейки CKSEL3…0 согласно данным приведенным в таблице ниже.


CKSEL3CKSEL2CKSEL1CKSEL0Частота МГц
00011 (режим по умолчанию)
00102
00114
01008

Ну что-ж. Приступим.

Для того чтобы проконтролировать разгон МК. Нам надо собрать схему с одним светодиодом из урока 3 и для того, чтобы этот светодиод заморгал, загрузить программу из урока 5. Запускаем наш МК и видим, как всё это медленно работает.

Теперь запускаем PonyProg читаем память контроллера, чтобы убедиться, что связь с ним установлена и нажимаем кнопку на панели управления «Настроить Fuse биты» ту, что с замочком на иконке. При этом у вас должно открыться меню - конфигурационные и защитные биты (Configuration and Security bits).

Сейчас нас интересуют биты обведённые красной линией. Мы видим, что они запрограммированы на 1 МГц (0001). Теперь нам надо запрограммировать их на 8 МГц. Для этого мы должны записать в эти ячейки 0100). Будет это выглядеть так, как указано на правом рисунке.

Прошу только не экспериментировать т.к. велика вероятность пойти в магазин за новым контроллером!

Для программирования конфигурационных битов с новыми данными необходимо нажать на кнопочку Write (Писать). После чего произойдет запись новой конфигурации, и светодиод начнет моргать бодрее.

Ну вот мы и разогнали МК с 1 до 8МГц. Но есть нюанс, о котором вы уже наверняка прочитали. Дело в том, что генераторы с RC цепочкой не очень точны и их работа сильно зависит от реальных номиналов, используемых компонентов. Т.к. при производстве микросхемы сложно получить строго одинаковые параметры всех RC цепочек, рабочие частоты микроконтроллеров будут немного отличаться друг от друга. Для улучшения параметров работы внутреннего генератора и возможности подстройки его частоты был отведен специальный калибровочный регистр (OSCCAL) находящийся о области регистров ввода/вывода. Для корректировки в этот регистр в самом начале программы необходимо занести калибровочное значение, которое можно подобрать самостоятельно либо воспользоваться теми, которые записываются в контроллер при его изготовлении. Заводские значения находятся в специальных калибровочных ячейках, количество которых равно числу рабочих частот внутреннего RC-генератора. Прочитать данные из этих ячеек не так-то просто и сделать это можно только с помощью программатора, да и то не всегда. Например, PonyProg, к сожалению, не видит всех ячеек и выводит значение только нулевой ячейки, которая отвечает за калибровку на частоте в 1МГц. Надеюсь, что разработчики исправят этот недочет.

Обязательно надо упомянуть о том, что в ATmega-8 если МК работает на частоте по умолчанию, калибровочное значение заносится в регистр OSCCAL автоматически. Если же мы меняем частоту внутреннего генератора, то нам необходимо провести его калибровку самостоятельно в начале программы.

Итак, как нам узнать калибровочные значения? Все просто, но не очевидно. Как я уже писал выше PonyProg нам не может помочь с этой проблемой. Но выход есть. Дело в том, что CodeVisionAVR тоже может работать с программаторами. Но из-за того, что работа в ней не очень удобна и не наглядна (на мой взгляд), то я, для программирования МК, предпочитаю PonyProg. И все-же. Давайте настроим CV_AVR для работы с нашим программатором. Для этого надо зайти в меню Settings / Programmer и в окне (Programmer Settings) выбрать программатор (Kanda Systems STK200+/300), как указано на рисунке. После чего нажать ОК.

Затем надо зайти в меню Tools / Chip Programmer и в окне (CodeVisionAVR Chip Programmer - STK200+/300) выбрать в меню Read / Calibration Byet(s). После чего в появившемся окне (Information) вы увидите нужные вам значения. Byte0 будет соответствовать частоте 1 МГц, а Byte3 – соответственно частоте 8 МГц.

Теперь дело за малым. Полученное значение надо срисовать на листочек и поместить в регистр OSCCAL в самом начале нашей программы.

OSCCAL = 0xA7; 	//Подстройка частоты внутреннего генератора

Вот и всё. Микроконтроллер мы разогнали, частоту подстроили можно двигаться дальше.


На следующим уроке мы ознакомимся с прерываниями и поработаем с ними на примере таймера/счетчика Т0. Для этого мы используем имеющуюся у нас схему со светодиодом.

На сон, грядущий необходимо почитать о прерываниях:
   Евстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 230…247.
   Ю.А. Шпак «Программирование на языке С для AVR и PIC микроконтроллеров» 2006. Страницы 145…147.

А также о счетчике T0:
   Евстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 255…271.
   Ю.А. Шпак «Программирование на языке С для AVR и PIC микроконтроллеров» 2006. Страницы 36…39.

И еще. Необходимо из описания на ATmega-8 распечатать перечень регистров ввода / вывода (раздел 31. Register Summary) и немного помедитировать на него. Посмотреть какие регистры есть в этом МК, найти те, с которыми вы уже имели дело, а также те, которые относятся к таймеру T0 и вообще к управлению таймерами.

Совместно с распечаткой перечня регистров нужно повторить:
   ЕЕвстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 156…158, 174…175.

Изучая регистр состояния SREG обратите особое внимание на 7-ой бит (I). Он будет очень важен на следующем занятии.


И еще. Для 17-ого занятия нам понадобится LCD дисплей Nokia 5110 - 1шт.

Мы его подключим на постоянной основе и будем уже дальше работать с ним. Приобрести его проще всего заказав на Али, там их как грязи. Цена за штуку колеблется от 100 до 150 рублей (2018г.). Так, что предлагаю брать два. На всякий случай.


А на сегодня всё. Удачи.

21.01.19


Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.

Приложение:
Проект CV_AVR.