Прерывание 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< out TIMSK,temp
ldi temp,(1< out TCCR0,temp
sei
clr r17
main:
rjmp main

timer_0ovf:
inc r17
out portb,r17
reti
Как видим, программа выполняется в прерывании «timer_0ovf».
Чтобы внести опрос кнопок в прерывание, можно воспользоваться следующим методом.
timer_0ovf:
sbic PINB,0 ;Опрос порта РВ0
rjmp proverka_2 ; Если порт не был сработан, то переходим на проверку следующего
rjmp vypolnenie_1 ;Если было срабатывание, то переходим на выполнения условия срабатывания данной кнопки
proverka_2:
sbic PINB,1 ;Опрос порта РВ1
rjmp proverka_3;
rjmp vypolnenie_2;
proverka_3:;
….
rjmp end
vypolnenie_1:
rjmp end
vypolnenie_2:
rjmp end
vypolnenie_3:
end:
reti

Проверяем порт РВ0, если срабатывания не было, то переходим к проверке следующего порта ввода. Если есть срабатывание, то переходим на выполнение «vypolnenie_1», «vypolnenie_2» и т.д. Алгоритм очень простой, однако имеет недостаток, в виде ограничения одновременного опроса кнопок. Если на время прерывания будут сработаны несколько кнопок, то программа определит только первую в очереди, остальные пропустятся.




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

Ваш email не будет опубликован. Обязательные поля отмечены *


Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>