AVR interrupt - сбросить обработку векторов в сборке - PullRequest
0 голосов
/ 20 сентября 2019

Я использую AVR ATmega16 , и я пытаюсь реализовать счетчик, который считает секунды .Я использую timer0 для создания прерывания каждые 1/16 секунды в цикле, который повторяется 16 раз.Учитывая частоту микропроцессора (f=4Mhz) и значение prescaler (=1024), я рассчитываю, что мне нужно дать таймеру начальное значение 12.

Здесьначало примера кода, который я нашел в моем учебнике:

.include "m16def.inc"
.equ start = 12
.equ loops = 16
jmp reset
reti (x16)    ;there will be needed a total of 16 reti's in order for the next
              ;instruction to be at 0x12 = 0d18 where the jmp instruction is placed at the 
              ;overflow interrupt handling routine of timer0
jmp TIM0_OVF
reti          ;other Handlers

Не могли бы вы объяснить, что на самом деле делают эти две команды reti?Как они работают?Что означает комментарий к коду?

* Позвольте мне сообщить вам, что на ATmega16 вектор TIMER0_OVF находится на program memory address = 0x12

1 Ответ

1 голос
/ 20 сентября 2019

Это таблица векторов прерываний ATMega16:

1 $000(1) RESET External Pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, and JTAG AVR
Reset
2 $002 INT0 External Interrupt Request 0
3 $004 INT1 External Interrupt Request 1
4 $006 TIMER2 COMP Timer/Counter2 Compare Match
5 $008 TIMER2 OVF Timer/Counter2 Overflow
6 $00A TIMER1 CAPT Timer/Counter1 Capture Event
7 $00C TIMER1 COMPA Timer/Counter1 Compare Match A
8 $00E TIMER1 COMPB Timer/Counter1 Compare Match B
9 $010 TIMER1 OVF Timer/Counter1 Overflow
10 $012 TIMER0 OVF Timer/Counter0 Overflow
11 $014 SPI, STC Serial Transfer Complete
12 $016 USART, RXC USART, Rx Complete
13 $018 USART, UDRE USART Data Register Empty
14 $01A USART, TXC USART, Tx Complete
15 $01C ADC ADC Conversion Complete
16 $01E EE_RDY EEPROM Ready
17 $020 ANA_COMP Analog Comparator
18 $022 TWI Two-wire Serial Interface
19 $024 INT2 External Interrupt Request 2
20 $026 TIMER0 COMP Timer/Counter0 Compare Match
21 $028 SPM_RDY Store Program Memory Ready

В показанном вами коде первый слот (RESET) заполняется инструкцией jmp reset.Следующий слот, который вас интересует - это TIMER0_OVF, но между RESET и TIMER0_OVF есть 8 слотов, которые вы должны заполнить чем-то .Заполнение их инструкциями reti (RETurn from Interrupt), вероятно, будет достаточно, если вы не заботитесь об обработке этих прерываний.

Если мы предположим, что reti (x16) интерпретируется этим ассемблером как "output16 reti инструкция ", тогда это позаботится о заполнении этих 8 слотов.Если вам интересно «почему 16 инструкций для 8 слотов?» - это потому, что каждый из этих слотов занимает 2 слов (достаточно, чтобы соответствовать инструкции jmp), иразмер одной reti инструкции составляет 1 слово.Таким образом, вы заполняете каждый слот двумя reti инструкциями, вторая из которых не имеет смысла.

...