Пятница, Ноябрь 27, 2020

Бегущие огни с использованием прерывания от таймера AVR ASM

;Схема и задача остаётся прежняя.В этом листенге будем использовать прерывание.Процессор в такой программе практически не чего не делает,а счёт осуществляет встроенный Таймер1 и сравнивает значение со специальным регистром сравнения.При совпадении значений осуществляется переход в подпрограмму обслуживания прерывания.Где прцессор производит нужные переключения битов,затем выходит из этой подпрограммы и опять не чего не делает.
.include "tn2313def.inc"
.list
.def     temp=r16
.def     rab=r17
.equ     kdel=50
         .dseg           ;Выбираем сегмент SRAM
         .org    0x60    ;Устанавливаем текущий адрес сегмента
buf:     .byte   1       ;Один байт для хранения рабочего значения
         .cseg           ;Выбор сегмента программного кода
         .org    0       ;Установка текущего адреса на ноль
;---------------Переопределение векторов прерывания 19шт.-----------------
start:   rjmp    init    ;Переход на начало программы.Прерывание по сбросу
         reti            ;Внешнее прерывание 0
         reti            ;Внешнее прерывание 1
         reti            ;Таймер/счётчик 1,захват
         rjmp     prtim1 ;Таймер/счётчик 1,совпадение,канал А
         reti            ;Таймер/счётчик 1,прерывание по переполнению
         reti            ;Таймер/счётчик 0,прерывание по переполнению
         reti            ;Переполнение UART пирём завершён
         reti            ;Переполнение UART регистр данных пуст
         reti            ;Переполнение UART передача завершена
         reti            ;Прерывание по изменению на любом контакте
         reti            ;Переполнение по компаратору
         reti            ;Таймер/счётчик 1,совпадение,канал В
         reti            ;Таймер/счётчик 0,совпадение,канал В
         reti            ;Таймер/счётчик 0,совпадение,канал А
         reti            ;USI готовность к старту
         reti            ;USI Переполнение
         reti            ;EEPROM Готовность
         reti            ;Переполнение охранного таймера
init:    ldi     temp,ramend
         out     spl,temp
         ldi     temp,0x80
         out     acsr,temp
         ldi     temp,0
         out     ddrd,temp
         ldi     temp,0xff
         out     ddrb,temp
         out     portb,temp
         out     portd,temp
;--------------------Инициализация таймера1-------------------------
         ldi     temp,0x0d       ;Выбор режима таймера
         out     tccr1b,temp
         ldi     temp,high(kdel) ;Старший полубайт кода совпадения
         out     ocr1ah,temp     ;Запись в регистр совпадения
         ldi     temp,low(kdel)  ;Младший полубайт кода совпадения
         out     ocr1al,temp     ;Запись в регистр совпадения
;-------------------Определение маски прерываний--------------------
         ldi     temp,0b01000000 ;Байт маски.Разрешено одно прерывание №4
         out     timsk,temp      ;Записываем маску
main:    ldi     rab,0b00010000  ;Запись начального значения
         sts     buf,rab         ;Запись содержимого регистра rab в SRAM
         sei                     ;Разрешаем прервание
loop:    rjmp    loop            ;Сдесь можем записать любой код
;-----------------Программа обработки прерывания--------------------
prtim1:  push    temp
         push    rab
         lds     rab,buf         ;Читаем содержимое rab из SRAM
         in      temp,pind       ;Проверяем кнопку
         sbrs    temp,0
         rjmp    left
right:   lsr     rab
         brcc    exit
         ldi     rab,0b10000000
         rjmp    exit
left:    lsl     rab
         brcc    exit
         ldi     rab,0b00000001
exit:    ldi     temp,0xff
         eor     temp,rab
         out     portb,temp
         sts     buf,rab
         pop     rab
         pop     temp
         reti




НАЗАД                  Assembler PIC                  Си AVR                  ДАЛЬШЕ


 

Back to Top