Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 практика микронтроллеры

.pdf
Скачиваний:
0
Добавлен:
25.11.2025
Размер:
873.27 Кб
Скачать

Цель: Обеспечьте переключение внешнего светодиода, подключенного к заданному выводу микроконтроллера, с полупериодом работы согласно индивидуальному варианту с помощью таймера-счетчика в режиме 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