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
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