Вы находитесь на странице: 1из 26

Раздел 2

Программирование
микроконтроллеров 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 в режиме
сравнения с А

 sei(); // разрешаем глобальные прерывания


 while (1)
 {
 PORTB = simb [s%10];
 PORTD = mcat [0];
 delay_ms(10);
 PORTB = simb [s/10];
 PORTD = mcat [1];
 delay_ms(10);
 }
 }
 Удачи при выполнении лабораторной
работы №3

Вам также может понравиться