Прерывание INT0 и INT1(продолжение)

Рассмотренные прерывания INT0 и INT1 позволяют оптимально решать задачи, условия которых зависят от внешнего сигнала. К примеру, на такие выводы хорошо подключать датчики считывания импульсов или кнопки аварийного сигнала. Обработка сигнала в этом случае будет незамедлительной.
Когда требуется произвести простое отслеживания нажатия кнопки, то цикл опроса выбранного порта лучше переместить в прерывание «Timer_0_ovf». По сути программа будет напоминать обычный цикл, как было в 1 части, где алгоритм был закольцован на метке main. При использовании прерывания программа будет выполняться до команды reti, затем следующее выполнение начнется после переполнения таймера.
В любом таймере МК есть настройки делителя частоты. Вносится так называемый коэффициент деления, с помощью которого и выбирается период срабатывания прерывания.
Как и в прошлых программах, первым делом нужно обратиться к технической документации и посмотреть адрес нашего прерывания.

1

Для простоты так и будем в программе писать «Timer_0_ovf». Ключевым моментом в настройке данного прерывания, является установка необходимого бита в регистр TIMSK.

2

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

3

Как видно, настройка делителя происходит путем комбинирования значений CS00…CS02. Расшифровка этих значений находится в таблице ниже.

4

Решим простую задачу. С каждым прерыванием добавляем к регистру R17 единицу и выводим содержимое регистра в PORTB.
.device Attiny2313 ; указываем тип устройства
.include «tn2313def.inc» ; подключаем файл директив МК ATtiny2313
.def temp = r16 ; задаем имя нашему регистру общего назначения
.org 0x0000 ; как обычно начинаем программу с ресета
rjmp reset
.org 0x006
rjmp timer_0ovf ;адрес прерывания по таймеру

reset:
ldi temp,ramend ; стандартная процедура
out spl, temp ;
ser temp ; порт В на выход
out DDRB, temp ;

ldi temp,(1<


Оставьте комментарий