PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt benötigt zu viel Zeit



fRIeD
19.08.2006, 19:20
Hallo,

mit folgendem Code wollte ich einmal die Interrupts ausprobieren,

an PortB hängen 8 Leds zur Ausgabe, die werden anfangs alle angeschaltet und bei Tastendruck soll dann das hohe Nibble ausgeschaltet werden.

Das ganze wird über den INT0 am PortD2 gemacht.

Das ganze funktioniert auch eigentlich,

allerdings brauchen die Leds nach dem Tastendruck ca. eine Sekunde bis sie aus sind.

Verstehe nicht warum da soviel Zeit verstreicht? Im Simulator vom AVR Studio sehe ich nicht wo so eine Verzögerung herkommen könnte.

Liegt es eventuell an einer fehlenden Tastenentprellung? Obwohl ich in dem Beispiel dafür keinen Sinn sehen würde.

Vielen Dank für die Hilfe.

Hier der Code:



rjmp main ;1 POWER ON RESET
rjmp meinint ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main:

;Stack init:
ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16

;Programm init:
ldi r16,0xff ; Port B as output
out DDRB, r16

ldi r16, (1<<ISC00) | (1<<ISC01) ; set interrupt bits
out MCUCR, r16

ldi r16, (1<<INT0) ; enable INT0
out GICR, r16

sei ; enable interrupt

ldi r17,0xff ; init output register

;------------------------------------------------------------------------
mainloop: wdr
out PORTB,r17
rcall wait

rjmp mainloop

meinint: push r16
in r16, SREG
push r16

ldi r17, 0x0f

;in r16, GIFR
;cbr r16, INTF0
;out GIFR, r16

pop r16
out SREG,r16
pop r16
reti


wait: push r15
push r16

clr r15
clr r16

skip: dec r15
brne skip
dec r16
brne skip

pop r16
pop r15

ret

izaseba
19.08.2006, 19:29
Hallo,
wie lange dauert die wait Routine ?
ich würd mal sagen, es liegt daran, Dein
out PORTB,R17
kommt ja immer zwischen zwei rcall wait

oder sehe ich das falsch ?

Gruß Sebastian

fRIeD
19.08.2006, 21:00
hm, daran kann es eignetlich nicht liegen, hab das nämlich auch schon ohne wait ausprobiert, da hatte ich das gleiche Problem. Und die wait Routine braucht auch nur etwas unter 20 ms bei 4 MHz.

19.08.2006, 21:13
und warum änderst Du den Port nicht direkt in der ISR ?

Cheeco2
23.08.2006, 03:36
Ich könnte mir eine mögliche Antwort vorstellen!
Dein Code sollte korrekt sein; er läuft ja auch im Studio.
Bei einem Mega8 oder größer (und du verwendest einen größeren AVR, weil du einen großen Stack hast) ist standardmäßig der integrierte Schwinger aktiviert, der auf 1MHz läuft. Auch wenn du einen externen Quarz dransteckst, muss der erst noch in den Fusebits aktiviert werden. Ich hoffe das könnte dein Problem gewesen sein!

Stefan

fRIeD
23.08.2006, 09:59
Erstmal danke für die Antworten, die Fuses sind richtig gesetzt.

Nachdem ich den Port nochmal explizit auf Eingang gesetzt und die PullUps aktiviert habe gings dann. :)