Программирование микроконтроллеров AVR во встраиваемых системах Тема 2.3 Динамическая индикация ПОДРОБНОЕ ОПИСАНИЕ ПОРЯДКА СОСТАВЛЕНИЯ ИСХОДНОГО КОДА ПРОГРАММЫ ДЛЯ ЛАБОРАТОРНОЙ РАБОТЫ № 3
Макетирование и исследование встраиваемой
системы с динамической индикацией Цель работы ознакомление с принципом динамической индикации; ознакомление с техническими данными микроконтроллера ATtiny2313; создание программы на языке C в соответствии с техническим заданием; компиляция и отладка программы в среде программирования Code Vision AVR; загрузка в микроконтроллер загрузочного файла и проверка работы запрограммированного микроконтроллера в рабочей станции NI ELVIS II. Как мы ранее узнали, способ статической индикации заключается в постоянной подсветке индикатора от одного источника информации. При использовании одного микроконтроллера на несколько источников требуется большое количество многобитовых портов, что практически исключено даже в мощных микроконтроллерах. Поэтому используется принцип динамической индикации. Сущность динамической индикации заключается в поочередном циклическом подключении каждого индикатора к источнику информации через общий параллельный регистр. По нему передаются коды для подключения сегментов, а подключение отдельного индикатора осуществляется путем поочередной подачи на общий электрод (анод или катод) потенциала, обеспечивающего прохождение тока через сегменты. Например, при использовании индикаторов с общим катодом информация от выходного порта через параллельный регистр и токо- ограничительные резисторы подается одновременно на идентичные сегменты (аноды светодиодов) всех индикаторов. Катоды отдельных индикаторов подсоединяются к «земле» поочередно через выводы другого порта, которые должны в этот момент получать значение «0». Именно в этот момент передается информация, предназначенная для отображения этим конкретным индикатором. При высокой частоте переключения (более 25 Гц, лучше 100 Гц) мигания индикаторов незаметны для глаза. Для демонстрации работы динамической индикации можно использовать несколько семисегментных индикаторов, даже хватит двух. Например, на двух индикаторах можно отображать отсчет секунд от 0 до 59. Если добавить еще два, можно отображать минуты, тоже от 0 до 59. Добавить еще два, можно отображать часы от 0 до 23. Однако, основная программа должна постоянно работать на отображение информации, а отсчет времени должен быть независимым от основной программы процессом. Таким образом, возникает необходимость введения внутреннего прерывания, привязанного к одному из таймеров, который и настроим на отсчет секунд времени. Например, выбираем таймер 1, записываем в регистр сравнения число, которое вызывает момент прерывания, и настраиваем таймер. При известной частоте тактирования 1 МГц, нужно ее понизить, например в 256 раз, чтобы счетчик мог отсчитать число в пределах своей разрядности. Мы знаем, что тактовая частота нашего микроконтроллера 1 МГц. Так 1000000/256 = 3906,25, поэтому в разряд сравнения вносим число 3906 (тем самым обеспечиваем невольную погрешность отсчета времени) и записываем разрешение на глобальные прерывания командой sei();, причем обязательно вначале программы необходимо включить библиотеку прерываний #include <interrupt.h>. Задание на выполнение лабораторной работы. разработать устройство на микроконтроллере ATtiny2313, которое будет отображать на двух семисегментных индикаторах секунды времени от 0 до 59; устройство должно питаться постоянным стабилизированным напряжением +5 вольт; тактирование МК осуществляется от внутреннего генератора с частотой 1 Мгц; использовать принцип динамической индикации; сегменты индикаторов должны подключаться от выводов порта через токо-ограничительные резисторы 510-560 Ом; переключение индикаторов должно производиться с паузами в 10 мс. Анализ технического задания и составление принципиальной схемы устройства
При анализе ТЗ становится очевидным, что в
качестве выходного порта для сигналов переключения индикаторов можно использовать младшие биты 7-ми битного порта D в микроконтроллере ATtiny2313. В качестве выходного порта для информационных сигналов подключения к сегментам индикаторов, отображающих цифры, можно использовать 8-ми битный порт В. В качестве источника питания можно использовать встроенный источник +5 В рабочей станции NI ELVIS II. В заводских установках микроконтроллера ATtiny2313 заложена программа по умолчанию для работы с внутренним генератором на частоте 8 МГц с делителем частоты на 8, что дает частоту тактирования 1 МГц. Оставляем фьюзы, т.е. первоначальные установки, неизменными. В качестве семисегментных индикаторов используем индикаторы с общим катодом KINGBRIGHT SC56-11YWA. Сопротивление токо-ограничительных резисторов выбираем 510-560 Ом. Пауза переключения будет обеспечиваться программно. Принципиальную схему устройства составить самостоятельно и представить преподавателю. Учесть, что для подключения сегментов должны использоваться выводы микроконтроллера 12-18 (порт В), для переключения индикаторов выводы 2- 3 (порт D). Устройство реализуется на монтажной плате NI ELVIS II. К выводам 1, 17 – 19 присоединяются также провода, идущие к программатору и использующиеся для прошивки микроконтроллера. Условно-графическое обозначение семисегментного индикатора Создание исходного кода программы микроконтроллера
Для создания программы
микроконтроллера ATtiny2313 будем пользоваться языком высокого уровня C/C+ +. Необходимо ориентироваться в основных понятиях языка программирования, обладать знаниями об операторах, функциях и приемах их использования. Полный текст программы: #include <io.h> #include <tiny2313.h> #include <delay.h> // включение библиотеки задержек #include <interrupt.h>// включение библиотеки прерываний #define PB_OUT DDRB = 0xFF //объявление порта В выходом через макрос #define PD_OUT DDRD |=(1<<0)|(1<<1) //объявление двух младших битов порта D выходом через макрос void initialization (void) { PB_OUT; PD_OUT; } unsigned s=0; //секунды char simb [10]= {0x3F,0x06,0x5B,0x4F,0x66, //коды 7- сегментных 0x6D,0x7D,0x07,0x7F,0x6F};//символов цифр char mcat [2]= {0xFE,0xFD }; // коды для последовательного // включения катодов индикаторов с ОК interrupt [TIM1_COMPA] void timer1_compa_isr(void) //Обработка прерывания //по сравнению { s++; // прибавляем 1 секунду if (s>59){ s=0; } //сбрасываем секунды TCNT1 = 0; // обнуляем накопитель таймера 1 } void main(void) { initialization (); TCCR1A = 0x00;// настройка таймера 1 TCCR1B = 0x04;// настраиваем делитель на 256 (1000000/256=3906,25) TCNT1 = 0; // обнуляем накопитель таймера 1 OCR1A = 0x0F42; // записываем в регистр сравнения число 3906 TIMSK = 0x40; // разрешаем работу таймера 1 в режиме сравнения с А