PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATtiny2313 ind INTERRUPT



LotharK
23.02.2007, 09:59
Hallo Leute,

seit ein paar Tagen beschäftige ich mich mit Controllern von ATM. Ich habe mir dazu das STK500 gekauft.

Schon bei dem Versuch, den Interrupt eines ATtiny2313 anzusprechen, scheitere ich kläglich. Folgenden Code habe ich mir dazu zusammengestellt.

.NOLIST
.INCLUDE "tn2313def.inc"
.LIST
; Universalregister definieren
.DEF mp = R16

; Reset-Vektor auf Adresse 0000

rjmp main
rjmp Int00 ; Int0-Interrupt
rjmp int01 ; Int1-Interrupt
reti ; TC1-Capture
reti ; TC1-Compare A
reti ; TC1-Compare B
reti ; TC1-Overflow
reti ; Timer/Counter 0 Overflow, mein Sprung-Vektor
reti ; Serial Transfer complete
reti ; UART Rx complete
reti ; UART Data register empty
reti ; UART Tx complete
reti ; Analog Comparator

;Interruptroutine fuer INT0 und INT1

Int00:
in ri,SREG ; Rette den Inhalt des Flag-Registers
ldi mp,0x0 ; Initiate Timer/Counter 0 Vorteiler
ldi mp, 0xF0
OUT PIND, mp ; Zur Kontrolle einige LEDs schalten
out SREG,ri ; Stelle Flag-Register wieder her
reti

Int01:
in ri,SREG ; Rette den Inhalt des Flag-Registers
ldi mp,0x0 ; Initiate Timer/Counter 0 Vorteiler
ldi mp, 0x0F
OUT PIND, mp ; Zur Kontrolle einige LEDs schalten
out SREG,ri ; Stelle Flag-Register wieder her
reti

; Hauptprogramm beginnt hier

main:
ldi mp,LOW(RAMEND) ;Initiate Stackpointer
out SPL,mp ; wegen Interrupts und Unterprogr.


; Interrupts 0 und 1 freigeben

ldi mp, 0b00001010 ; INT0 und INT1 konfigurieren
out MCUCR, mp

ldi mp, 0b11000000 ; INT0 und INT1 aktivieren
out EIFR, mp

sei ; Gib Interrupts im Status-Register frei

loop:
NOP ; Schicke CPU schlafen
rjmp loop

Eigentlich sollte er erst mal nichts anderes tun, als bei Signal an PIND2 und PIND3 auf die Interrupts zu reagieren.

Kann mir mal bitte jemand sagen, wo da der Fehler liegt?

MfG LotharK

SprinterSB
23.02.2007, 10:49
Was ist ri? Stehen die DDRs der POorts auf OUT?

bax
23.02.2007, 11:10
dazu kommt noch:

ldi mp, 0b11000000 ; INT0 und INT1 aktivieren
out EIFR, mp

das richtige Register hierfür ist GIMSK

Du schaltest in Deinen Interuptroutinen anschließend die INT-Eingabepins, das löst dann den Interupt neu aus.

greetz Rajko

LotharK
23.02.2007, 11:36
Danke, GIMSK wars. Jetzt funktioniert es. DDRD steht auf 0x0C.
(PIND 2 und 3 als Eingang). Ich hoffe, ich habe das richtig interpretiert.

Danke für Eure Hilfe - LotharK