AVR ASM - přerušení

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Tondaxxx
Příspěvky: 18
Registrován: 03 kvě 2011, 00:00

AVR ASM - přerušení

#1 Příspěvek 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?
Jenda_KL
Příspěvky: 1173
Registrován: 10 zář 2008, 00:00
Bydliště: Kadaň
Kontaktovat uživatele:

#2 Příspěvek 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
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#3 Příspěvek 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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“