2 практика микронтроллеры
.pdf
Цель: Обеспечьте переключение внешнего светодиода, подключенного к заданному выводу микроконтроллера, с полупериодом работы согласно индивидуальному варианту с помощью таймера-счетчика в режиме CTC.
Теоретическая справка
Режим работы «СТС» (Clear Timer on Compare Match), или режим очистки таймера, по совпадению использует регистр OCRIA для определения точки останова работы таймера-счетчика. При достижении значения ТОР,
определенного в регистре OCR1A, срабатывает прерывание и выставляется флаг ОСF1А.
Согласно сводной таблице режимов работы для активации режима СТС необходимо выставить флаг WMG12. Регистрам управления TCCR1A и TCCR1B присвоить нули. Регистру OCRIA задать рассчитанное значение ТОР,
при достижении которого будет произведен сброс счетного регистра TCNT1 и
вызван обработчик прерывания по вектору TIMER1_COMPA_vect.
Ход работы
2
Рисунок 1 – Алгоритм работы
Описание алгоритма:
1.Подключение библиотек <avr/io.h> и <avr/interrupt.h>, а также инициализация переменной count
2.Инициализация порта PB1 как выход
3.Отключение глобальных прерываний
4.Обнуление регистра TCCR1A
5.Обнуление регистра TCCR1B
6.Устанавливаем значение сравнения, после которого сработает прерывание
7.Включаем режим CTC
Рисунок 2 – Таблица режимов и нужных флагов
8. Установка предделителя таймера на 1024, благодаря включению флагов CS10 и CS12
Рисунок 3 – Таблица предделителя и нужных флагов
9.Разрешение прерывания по переполнению таймера, то есть выбранного нами времени
10.Включение глобальных прерываний
11.Включение основного цикла
12.Условие, проверяющее переменную и равно ли оно 5
13.Если условие выполняется, то переменная сбрасывается
13.Выключение основного цикла
14.Вход в обработчик прерывания при переполнении таймера.
15.Переменная увеличивается на 1
3
16.Условие, проверяющее переменную и равно ли оно 5
17.Если условию не удовлетворяет, PB1 = 0, то необходимо установить 1
18.Если условию удовлетворяет, PB1 =1, то необходимо установить 0
Рисунок 4 – Пример работы
Расчёт значения OCR1A для прерывания таймера с периодом 1,15
секунды и предделителем 1024 на ATmega328p
Берём именно 1.15, так как по заданному варианту необходимое время
5.75, соответственно счётчик должен переполниться 5 раз, что достичь необходимого нам времени
Исходные данные:
Предделитель : 1024
Разрядность таймера: 16 бит → максимальное значение TCNT1 = 65535
Желаемый период : 1.15 секунды
4
Период прерывания определяется по формуле:
1.151 = 6.4 10−5 = 17969
Листинг кода
#include <avr/io.h> #include <avr/interrupt.h> int count;
int main()
{
DDRB|= (1<<PB1); cli();
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 17969;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10);
TIMSK1 = (1 << OCIE1A);
sei();
while(1){
if(count>=5){
count=0;}
}
};
5
ISR(TIMER1_COMPA_vect)
{
count++;
if(count>=5){
if (PINB & (1 << PB1)) PORTB &= ~(1<<PB1);
else PORTB |= (1<<PB1);}
}
Вывод: В ходе выполнения работы была разработана программа для микроконтроллера AVR, обеспечивающая периодическое переключение внешнего светодиода, подключённого к выводу PB1, с заданным периодом в режиме CTC.
6
Приложение А
Листинг кода
#include <avr/io.h> #include <avr/interrupt.h> int count;
int main()
{
DDRB|= (1<<PB1); cli();
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 17969;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10); TIMSK1 = (1 << OCIE1A);
sei();
while(1){
}
}; ISR(TIMER1_COMPA_vect)
{
count++;
if(count>=5){
count=0;
if (PINB & (1 << PB1)) PORTB &= ~(1<<PB1); else PORTB |= (1<<PB1);}
}
Рисунок 5 – Алгоритм работы
8
