Динамическая индикация с помощью таймера-счетчика

Автор работы: Пользователь скрыл имя, 14 Ноября 2017 в 21:54, лабораторная работа

Описание работы

1. Ознакомление с таймерами счетчиками в составе микроконтроллера и прерываниями от них.
2. Изучение принципов динамической индикации/опроса.

Файлы: 1 файл

МПС - Лабораторная работа 2.docx

— 147.12 Кб (Скачать файл)

Лабораторная работа 2

ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ С ПОМОЩЬЮ ТАЙМЕРА-СЧЕТЧИКА

   ЦЕЛЬ РАБОТЫ

1. Ознакомление с таймерами счетчиками  в составе микроконтроллера и  прерываниями от них.

2. Изучение принципов динамической  индикации/опроса.

 

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

        Практически все современные  микроконтроллеры общего назначения  имеют в своем составе один  и более таймер-счетчик. У ATMega8 один 8-битный, один 16-битный таймер-счетчик и один 8 битный таймер, у ATMega16 два 8-битных и один 16-битный таймер-счетчик, у ATTiny2313 один 8-битный, один 16-битный таймер-счетчик.

        Все микроконтроллеры работают  на какой-то частоте, источником  тактовой частоты может служить  внутренний задающий генератор  и внешний источник прямоугольных  импульсов. Внутренний задающий  генератор считается не надежным, потому что может менять свою  частоту от температуры окружающей  среды, хотя изменения эти очень  малы, но при необходимости работы  с точностью до микросекунды  такие отклонения могут привести  к частым сбоям. Чтобы тактовая  частота «не плавала» используют  внешний источник тактовых сигналов  или чаще кварцевый резонатор. В лабораторном стенде все  микроконтроллеры подключены к  кварцевым резонаторам и настроены  на частоту 12МГц.

        Таймер работает на той же  частоте, что и микроконтроллер, либо, при использовании предделителя на частоте, меньшей в 8/64/256/1024 раз.

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

        За 8-битные  таймеры-счетчики отвечают следующие регистры:

TCCRх – конфигурационный регистр

OCRx – регистр сравнения

TCNTх – счетный регистр, где х-номер таймера.

Кроме того, есть еще три регистра, относящиеся ко всем трем таймерам:

- конфигурационный регистр TIMSK.

- статусный регистр TIFR.

- регистр специальных функций SFIOR.

 

Регистры управлениятаймера-счетчиком микроконтроллера ATMega16.

TCNT0 -Это 8-ми разрядный счетный регистр. Когда таймер работает, по каждому импульсу тактового сигнала значение TCNT0 изменяется на единицу. В зависимости от режима работы таймера, счетный регистр может либоувеличиваться, либоуменьшаться.

OCR0          Это 8-ми разрядный регистр сравнения. Его значение постоянно сравнивается со счетным регистром TCNT0, и в случае совпадения таймер может выполнять какие-то действия - вызывать прерывание, менять состояние вывода OC0 и т.д. в зависимости от режима работы.

TCCR0

TCCR0 конфигурационный регистр таймера-счетчика Т0, он определяет источник тактирования таймера, коэффициент предделителя, режим работы таймера-счетчика Т0 и поведение вывода OC0.

Биты CS02, CS01, CS00 (ClockSelect) - определяют источник тактовой частоты для таймера Т0 и задают коэффициент предделителя.

        Биты WGM10, WGM00 (WaveGeneratorMode) - определяют режим работы таймера-счетчика Т0. Всего их может быть четыре - нормальный режим (normal), сброс таймера при совпадении (CTC), и два режима широтно-импульсной модуляции (FastPWM и PhaseCorrect PWM).           

Биты COM01, COM00 (CompareMatchOutputMode) - определяют поведение вывода OC0. Если хоть один из этих битов установлен в 1, то вывод OC0 перестает функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счетчика Т0. Однако при этом он должен быть еще настроен как выход.

TIMSK

TIMSK -общий регистр для всех трех таймеров ATmega16, он содержит флаги разрешения прерываний. Таймер Т0 может вызывать прерывания при переполнении счетного регистра TCNT0 и при совпадении счетного регистра с регистром сравнения OCR0. Соответственно для таймера Т0 в регистре TIMSK зарезервированы два бита - это TOIE0 и OCIE0.

TOIE0 - 0-е значение  бита запрещает прерывание по  событию переполнение, 1 - разрешает.

OCIE0 - 0-е значение запрещает прерывания  по событию совпадение, а 1 разрешает.

        Прерывания  будут вызываться, только если  установлен бит глобального разрешения  прерываний - бит I регистра SREG.

TIFR

TIFR–общийрегистр для всех трех таймеров-счетчиков. Содержит статусные флаги, которые устанавливаются при возникновении событий. Для таймера Т0 - это переполнение счетного регистра TCNT0 и совпадение счетного регистра с регистром сравнения OCR0.

Если в эти моменты в регистре TIMSK разрешены прерывания и установлен бит I, то микроконтроллер вызовет соответствующий обработчик.

Флаги автоматически очищаются при запуске обработчика прерывания. Также это можно сделать программно, записав 1 в соответствующий флаг.

TOV0 - устанавливается в 1 при переполнении  счетного регистра.

OCF0 - устанавливается в 1 при совпадении  счетного регистра с регистром  сравнения.

Динамическая индикация

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

Динамическая индикация на примере подключения семисегментного индикатора.

По сути семисегментный индикатор – это набор светодиодов соединенных между собой катодами (анодами) в каждом разряде. 

    Рис1. Семисегментный индикатор

 

        Одноразрядный семисегментный индикатор имеет 9 выводов: 7 – сегменты индикатора, 1 – точка и 1 – общий. Если есть необходимость подключить более 1 разряда индикатора, то количество используемых ножек резко возрастает, смысл динамической индикации в том, чтобы все выводы сегментов соединить параллельно, а общими выводами разрядов задавать какой разряд будет гореть в определенный промежуток времени. И так если быстро зажигать каждый разряд по очереди на короткое время будет казаться, что горят все разряды.

Динамический опрос похож на индикацию. При подключении матричной клавиатуры на короткий промежуток времени на строку подается логическая1 , а выводы столбцов опрашиваются.Если на каком-то из выводов появилась 1, то в зависимости от столбца и строки высчитывается нажатая кнопка и так повторяется для каждой строки.

 

#define F_CPU 1000000UL

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

 

unsigned char Numeral[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

unsigned char Discharge[4] = {0,0,0,0};

 

ISR (TIMER1_COMPA_vect)

{

static unsigned char ID;

ID++;

switch (ID)

{

case 1:

PORTD = 0b00000001;

PORTC = Numeral[Discharge[0]];

break;

case 2:

PORTD = 0b00000010;

PORTC = Numeral[Discharge[1]];

break;

case 3:

PORTD = 0b00000100;

PORTC = Numeral[Discharge[2]];

break;

case 4:

PORTD = 0b00001000;

PORTC = Numeral[Discharge[3]];

ID = 0;

break;

}

}

 

int main(void)

{

DDRC  = 0xff;

PORTD = 0x00;

DDRD = 0xff;

 

TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)

TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)

OCR1AH = 0b00000011; //записываем в регистр число для сравнения

OCR1AL = 0b01000010;

TCCR1B |= (1<<CS11);//установим делитель.

 

asm("sei");

    while (1)

    {

Discharge[3]++;

if(Discharge[3] == 10)

{

Discharge[3] = 0;

Discharge[2]++;

if(Discharge[2] == 10)

{

Discharge[2] = 0;

Discharge[1]++;

if(Discharge[1] == 10)

{

Discharge[1] = 0;

Discharge[0]++;

if(Discharge[0] == 10)

{

Discharge[0] = 0;

}

}

}

 

}

_delay_ms(500);

    }

}

                                                           ВАРИАНТЫ ЗАДАНИЙ

 

1. Вывести на семисегментный индикатор число 2985, чтобы при этом точки в каждом разряде мигали с частотой 1Гц.

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

3. Вывести на семисегментный индикатор число 1857, чтобы при этом выводимое число мигало с частотой 2 Гц.

4.Подключить к микроконтроллеру семисегментный индикатор и 2 кнопки. Написать программу, считающую нажатия на первую кнопку и выводящую значение на индикатор, а при нажатии второй кнопки счетчик нажатий уменьшался на 1 каждую секунду пока не достигнет 0.

5. Собрать схему из светодиода и матричной клавиатуры. Запрограммировать микроконтроллер так, чтобы при нажатии на цифры клавиатуры светодиод моргал соответствующее число раз.

6.Собрать схему из светодиода и матричной клавиатуры. Запрограммировать микроконтроллер так, чтобы при нажатии на цифры клавиатуры светодиод горел соответствующее число секунд.

7.Собрать схему из матричной клавиатуры и светодиодов. Запрограммировать микроконтроллер так, чтобы на клавиатуре можно было выбирать один из 5 режимов светомузыки.

8.Собрать схему из семисегментного индикатора и матричной клавиатуры. Запрограммировать микроконтроллер так, чтобы было можно с клавиатуры вводить числа от 0 до 9999, а при нажатии на звездочку начинался обратный отсчет с шагом 1 секунда от введенного числа.

9. Собрать схему из семисегментного индикатора и матричной клавиатуры. Запрограммировать микроконтроллер так, чтобыпри нажатии на звездочку число на индикаторе увеличивалось на 1 каждую секунду, а при нажатии на решетку уменьшалось.

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

 

                                                    КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Для чего используются таймеры-счетчики  в микроконтроллерах?

2. Какие регистры отвечают за  работу таймеров-счетчиков?

3. В каких режимах может работать  таймер-счетчик?

4. Какие прерывания могут возникать  от таймера-счетчика?

5. Что такое динамическая индикация?

6. Как происходит динамический  опрос матричной клавиатуры?

 


Информация о работе Динамическая индикация с помощью таймера-счетчика