fRIeD
19.08.2006, 20: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
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