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.