Stránka 1 z 1
AVR ASM - přerušení
Napsal: 27 kvě 2013, 20:00
od Tondaxxx
Ahoj, řeším taková problém, zkouším programovat ATmegu32 v assembleru a nikde nemůžu najít, jak se nastavuje deklarace a pak obsluha přerušení z INT0 nebo časovače, ani v datasheetu to nemaj moc řešený a všechny návody po netu jsou spíš pro C, nevíte někdo?
Napsal: 27 kvě 2013, 20:44
od Jenda_KL
přerušení začíná na specifické adrese programu, adresy jsou uvedeny v té tabulce. pevné adresy se definují direktivou "org". Popsané je to tam dost dobře. příklad:
Kód: Vybrat vše
.CSEG
.org 0 RJMP MCUINIT
.org 0x04 RJMP TIM2OVF
TIM2OVF:
; kod preruseni, terba pricti vterinu
RETI
MCUINIT:
; startovaci kod
;Timer2
ldi a,0x08
out ASSR,a
ldi a,0b00000101 ;FOC2 WGM20 COM21 atd...
out tccr2,a
MAIN:
; cyklicky program
RJMP MAIN
Napsal: 27 kvě 2013, 21:06
od AB1
V Avrstudiu najdi soubor 'm32def.inc' .
Na jeho konci jsou jména a adresy přerušení..
equ INT0addr=$002 ; External Interrupt0 Vector Address
.equ INT1addr=$004 ; External Interrupt1 Vector Address
.equ INT2addr=$006 ; External Interrupt2 Vector Address
.equ OC2addr =$008 ; Output Compare2 Interrupt Vector Address
.equ OVF2addr=$00a ; Overflow2 Interrupt Vector Address
... atd
Použití je následující:
Kód: Vybrat vše
.include "m32def.inc"
; osc 8 MHz
.CSEG
.org 0
rjmp start
.org INT1addr // INT1 , adresa $04
jmp extint1_isr // pojmenuj libovolně
.org OVF2addr // přetečení timer2 , adresa $06
jmp timer1_ovf_isr
;--------------------------------
start:
; ...
main:
; ... // kód
; ...
jmp main
;--------------------------------
timer1_ovf_isr: // obsluha přerušení
push r1
in r1,SREG // schovej SREG
push r20 // ulož použité registry
push r21
ldi r20, 10 // kód
ldi r21, 20
; ...
; ...
pop r21 // obnov registry a SREG
pop r20
out SREG, r1
pop r1
reti // návrat z přerušení
;--------------------------------
extint1_isr: // obsluha přerušení
; ...
; ...
reti
Kdyby něco nebylo jasné, tak se zeptej.