Если Вы хотите обучаться программированию микроконтроллеров, но попали, сюда не прочитав предыдущих уроков, то советую начать изучение материала с самого начала.
На прошлом занятии мы с вами подключили энкодер и отображали на дисплее Nokia 5110 разную информацию. Сегодня мы подключим к нашему МК часовой кварц и сделаем электронные часы. А для этого нам надо перевести работу счетчика/таймера Т2 в асинхронный режим. |
---|
Программа, которую надо было сделать в качестве домашнего задания к прошлому уроку находится в приложенных файлах.
Про работу счетчика Т2 в асинхронном режиме я надеюсь вы уже прочитали. Евстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 276…279. А значит знаете, что для переключения таймера/счетчика в этот режим имеется специальный регистр ASSR. Помимо его, таймер/счетчик Т2 использует регистры: TCCR2 – регистр управления; TCNT2 – счетный регистр; OCR2 – регистр сравнения. Мы пока не будем касаться работы этого счетчика в режиме ШИМ или описывать его работу с регистром сравнения. Сегодня у нас только асинхронный режим.
Но все же перед тем как мы начнем говорить о работе Т2 в этом режиме я бы хотел напомнить формат регистра управления TCCR2. 7 разряд FOC2 – принудительное изменение состояние вывода OC2 в режимах работы Normal и CTC. 6, 3 разряды WGM20, WGM21 – режим работы таймера/счетчика (нормальный, ШИМ с точной фазой, сброс при совпадении с регистром OCR2, быстродействующий ШИМ). Таблицу режимов смотрим в даташите. 5, 4 разряды COM21, COM20 – Режим работы блока сравнения. Работает вместе с FOC2 и определяет поведение вывода OC2. 2, 1, 0 разряды CS22, CS21, CS20 – управление тактовым сигналом.
Асинхронный режим отличается от других тем, что его тактовый сигнал не является производным от сигнала генератора микроконтроллера, а поступает от внешнего устройства, кварцевого резонатора или схемы тактирования. Частота работы Т2 в асинхронном режиме может варьироваться от 0 до 256 кГц, но лучше всего таймер/счетчик работает на частоте часового кварца 32768 Гц. Одним словом, этот режим предназначен для того, чтобы у нас была возможность организовать работу таймера/счетчика Т2 в качестве часов реального времени.
Для переключения работы Т2 в асинхронный режим необходимо проделать определенные манипуляции с регистром ASSR который имеет следующий формат: 3 разряд AS2 – Переключения режима работы. (1) – асинхронный режим. 2 разряд TCN2UB – флаг состояния обновления счетного регистра. Он необходим при синхронизации работы таймера/счетчика с микроконтроллером и указывает на то, что новые данные хранящиеся во временном регистре были перенесены в счетный регистр TCNT2. 1 разряд OSR2UB – флаг состояния обновления регистра OCR2. Работает также, как и TCN2UB, но указывает на обновление регистра сравнения. 0 разряд TCR2UB – флаг состояния обновления регистра TCCR2. Указывает на обновление регистра управления. Флаги TCN2UB, OSR2UB, TCR2UB нужны для правильной организации передачи данных от быстродействующего устройства, в данном случае это МК, к медленному устройству - таймеру/счетчику.
Перед переключением счетчика желательно запретить все прерывания, а манипуляции по переключению Т2 рекомендуется проводить в следующей последовательности.
// Перевод в асинхронный режим работы Т2 ASSR |= (1<<AS2); //переключаем в асинхронный режим работы счетчик Т2 TCNT2 = 0x00; //устанавливаем новые значения в счетный регистр таймера 2 OCR2 = 0x00; //устанавливаем новые значения в регистр сравнения TCCR2 = 0x07; //конфигурируем регистр управления, ставим делитель тактовых импульсов, например на /1024 while (ASSR & (1<<TCN2UB)); // ждем сброс флага TCN2UB while (ASSR & (1<<OSR2UB)); // ждем сброс флага OSR2UB while (ASSR & (1<<TCR2UB)); // ждем сброс флага TCR2UB
Ну вот теперь наш таймер/счетчик начал работать в асинхронном режиме. Для того что бы это проверить нам необходимо собрать схему и написать небольшую тестовую программу.
Питание схемы можно использовать как 3.3V, так и 5V, если позволяет дисплей. Кварцевый резонатор необходимо установить, как можно ближе к выводам МК. У меня это выгладит вот так.
Чтобы быстро проверить правильность работы таймера счетчика Т2 пишем вот такую тестовую программу.
#include <mega8.h> #include "lib_macro.c" //Общие макросы //Процедуры и функции #include "Lib_Nokia_5110_ATmega.c" //Подпрограммы работы с дисплеем interrupt [TIM2_OVF] void tim2_ovf_interrapt (void); //Прерывание по TIM2_OVF void main(void) { //настройки // Таймер 2. Асинхронный режим работы TIMSK = 0x00; //запрещаем прирывания от таймеров ASSR |= (1<<AS2); //переключаем счетчик в асинхронный режим TCNT2=0x00; //обнуляем счетный регистр TCCR2 = 0x04; //Режим работы "normal", делитель на 64. while (ASSR & (1<<TCN2UB)); //обнуление TCN2UB регистра ASSR while (ASSR & (1<<TCR2UB)); //обнуление TCR2UB регистра ASSR TIMSK |= (1<<TOIE2); //разрешаем прерываине по переполнению Т2 lcd_init(); //инициализация дисплея SEI; //включаем прерывание while (1) {} } //END void main(void) //Прерывание по TIM2_OVF переполнение таймера счетчика Т2 interrupt [TIM2_OVF] void tim2_ovf_interrapt (void){ static char f_half_sec = FALS; //флаг полусекунды if (f_half_sec){ LED_ON; f_half_sec = FALS; } else { LED_OFF; f_half_sec = TRUE; } }
После прошивки у вас должна замигать подсветка дисплея с периодом в одну секунду. Это будет означать то, что таймер/счетчик перешел в асинхронный режим, схема с кварцевым резонатором работает как надо, а маятник наших часов уже затикал.
Для того что бы наши часы выглядели интересными предлагаю использовать большие цифры. Подключаем библиотеку и выводим на экран время (часы, минуты).
Мы видим, что двоеточие на экране моргает с секундным интервалом. Но часы пока не ходят. Это все потому, что вам надо будет самим, в качестве домашнего задания, допилить программу что бы она отсчитывала и отображала минуты и часы, а затем подключив энкодер, сделаете так, чтобы с его помощью можно было устанавливать актуальное время. Должно в итоге получиться примерно так.
Программа не сложная, но процесс переключения режима работы заставит слегка напрячься. Более того, категорически не советую делать что-то громоздкое в прерывании. Советую даже отсчет полусекунд делать в основном блоке. И да. Прилагаемая к уроку программа только в качестве примера отображения цифр и организации прерывания.
Еще я не упомянул о том, как у нас получаются секунды. Уверен, что вы и так уже все посчитали, но если кто еще не понял, то дело обстоит так. Делим частоту кварца (32768Гц) на величину делителя тактовых импульсов Т2 (в моем случае это 64) и затем делим полученное на 256 (количество состояний регистра TCNT2 с учетом нуля). Получаем ответ 2. Т.е. два раза в секунду у нас будет срабатывать прерывание по переполнению таймера/счетчика Т2. Если же делитель поставить на 124, то прерывания будут соответственно только один раз в секунду.
Когда вы все правильно сделаете это будет уже законченное устройство, которое можно перенести на плату и самостоятельно оформить в корпус. А если включить в схему пищалку с интегрированным генератором, то можно сделать полноценный будильник. А еще, если дополнить схему релюшкой, из нашего седьмого урока, можно сделать устройство, которое будет включать и выключать что-то по времени. В общем с этого момента открывается большое поле деятельности для самостоятельного творчества.
На следующим уроке нам понадобится переменный резистор на 10кОм, и постоянный такого же номинала. Мы с вами поговорим об АЦП и сделаем вольтметр. Поэтому на сон грядущий читаем -
Евстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 310…323.
А на сегодня всё. Удачи.
07.09.19
Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.
Приложение: Файлы к уроку 19