;#####################################
;#### Использование прерывание Т0 ####
;#####################################
.include "tn2313def.inc"
.list
.def temp = R16
.def flag=R17
; начало программного кода
.cseg
.org 0
;передопределение векторов прерываний
start: rjmp init
reti
reti
reti
reti
reti
rjmp PrTim; прерывание по переполнению TCNT0
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
; модуль инициации
init:
;инициализация стека
ldi temp, RAMEND
out SPL, temp
;инициаализация портов
ldi temp, 0
out DDRB, temp
ldi temp, 0xFF
out DDRD, temp
;инициализация таймера
ldi temp, 0b00000101 ;ВЫБОР ИСТОЧНИКА ТАКТОВОГО СИГНАЛА ДЕЛЕНИЕ НА 1024 и соответственно запуск таймера
out TCCR0B, temp
;определение маски прерываний
ldi temp, 0b00000010 ; разрешение прерывания по переполнению таймера Т0
out TIMSK, temp
;инициализация компаратора
ldi temp, 0x80 ; А.В. Белов рекомендует добавлять данный код
out ACSR, temp
;начало основной программы
ldi flag, 0xFF ; моргнем для видимости начала программы
out PORTD, flag
main: ; бесконечный цыкл до момента прерывания
sei ;разрешаем прерывания глобально
rjmp main
PrTim0: ; подпрограмма обработки прерывания
lsl flag ; сдвиг влево
out PORTD, flag
reti
В данном примере светодиоды подключенные к порту D моргнут 1 раз при запуске и поочередно зажгутся.
;#####################################
;#### Использование прерывание Т1 ####
;#####################################
.include "tn2313def.inc"
.list
.def temp = R16
.def rab = R17
.def Flag = R18
.equ kdel=550 ; константа задержки
; начало программного кода
.cseg
.org 0
;передопределение векторов прерываний
start: rjmp init
reti ;внешенее прерывание 0
reti;внешнее прерывание 1
reti;таймер\счетчик 1, захват
rjmp prtim1 ;тймер счетчик 1 совпадение канал А
reti;таймер 1 прерывание по совпадению
reti;таймер 0 прерывание по переполнению
reti;прерывание USART прием завершен
reti;прерывание USART регистр данных пуст
reti;прерывание USART передача завершена
reti;прерывние по компаратору
reti;прерывание по изменению на любом контакте
reti;таймер 1 совпадение канал В
reti;таймер 0 совпадение канал В
reti;таймер 0 совпадение канал А
reti;USI готовность к старту
reti;USI переполнение
reti;EEPROM готовность
reti;переполнение охранного таймера
; модуль инициации
init:
;инициализация стека
ldi temp, RAMEND
out SPL, temp
;инициаализация портов
ldi temp, 0
out DDRB, temp
ldi temp, 0xFF
out DDRD, temp
;инициализация таймера
ldi temp, 0b00001011
out TCCR1B, temp
ldi temp, high(kdel)
out OCR1AH, temp
ldi temp, low(kdel)
out OCR1AL, temp
;определение маски прерываний
ldi temp, 0b01000000
out TIMSK, temp
;инициализация компаратора
ldi temp, 0x80
out ACSR, temp
;начало основной программы
main:
sei
rjmp main
prtim1:
sbrs Flag, 0
rjmp p1
rjmp p2
p1: ldi temp, 0xFF
out PORTD, temp
ldi Flag, 1
reti
p2: ldi temp, 0
out PORTD, temp
ldi Flag, 0
reti
Здесь просто все светодиоды моргают в зависимости от константы и выбора тактовой частоты регистра TCCR1B
Отдельное спасибо А.В. Белову за книги. Хотя даже у такого корифея AVR попадаются нелепые опечатки или недопечатки
