Im Schaltplan bei den Kondensatoren ist ein Kondensator, der Betriebsspannung hat. Wird jetzt ein Schalter gedrückt, wird dieser Kondensator Entladen und gibt so einen Wert an den ADC. Zumindest habt ich den Schaltplan so verstanden. Und weil die Kondensatorspannung träge ist (ic=c*du/dt nicht) muss man dem kurz Zeit geben, sich zu entladen.
- - - Aktualisiert - - -
Es wird immer skurriler...
Habe die ISR jetzt nur mit einer Flag änderung belegt die dann im Hauptprogramm abgefragt werden soll.
Aufgerufen wird dann:Code:
taster:
ldi r20,1
reti
Hier tritt jetzt folgender Fehler auf:Code:.include "m8def.inc"
;############## M A I N ###########################
.CSEG
.org 0x0000
rjmp main ; Reset Handler
reti; interrupt for into
.org INT1addr
rjmp taster;_interrupt ; IRQ1 Handler
reti; interrupt timer2 comp
reti; interrupt for timer2 ovf
reti; interrupt for timer1 capt
reti; interrupt for timer1 compa
reti; interrupt for timer1 compb
reti; interrupt for timer1 ovf
reti; interrupt for timer ofv
reti; interrupt for spi,stc
reti; interrupt for usart,rxc
reti; interrupt for usart,udre
reti; interrupt for usart, txc
reti; interrupt for adc
reti; interrupt for ee_rdy
reti; interrupt for ana_comp
reti; interrupt for twi
reti; interrupt for spm_rdy
.include "macros.inc"
.include "functions.inc"
.include "interrupts.inc"
main:
init:
;hier stehen alle möglichen inits
sei
start:
ldi R16, 100
mov R2, R16
mov R3, R16
rcall change_motorspeed
MotorDir_FWD_FWD
clr r20 ;test anderer interrupt
wait:
sbrc R20,0 ;if r20 bit 0 is clear dont go to get it
rjmp get_it
SWITCH_LEFT_BACKLED_ON
rcall delay_turn
SWITCH_LEFT_BACKLED_OFF
rcall delay_turn
rjmp wait
get_it:
cli ;dont make another interrupt here
;dont save r16 and r17 here just a test
clr r20
MOTOR_BREAK
SBI DDRD, PD3
SBI PORTD, PD3 ;if set the interrupt will not stop
SET_BUMPER_TO_ADC_SOURCE
;rcall delay_short ;give the capacitor a bit time
GET_ADC_VALUE R17, R16 ;r17=high, r16=low
CBI PORTD, PD3
CBI DDRD, PD3 ;so now that the value is in done by the adc make it again
TRANSMIT R17 ;and send the high result
TRANSMIT R16 ; and send the low result
sei ;ok now you can interrupt again
ret
- Anstatt nach dem drücken eines Tasters in der Wait weiterzumachen, wird offenbar Resetet und das Teil fängt wieder an zu fahren... Mit dem anderen ISR ist er wenigstens stehen geblieben.
- Dabei sendet er aber richtig die beiden Werte vom ADC (ob die Werte auch richtig sind, kann ich nicht sagen).
- Bei einem bestimmten Schalter wird sporadisch wieder wie mit der anderen ISR plötzlich eine Endlosschleife ausgelöst.
Kann es sein, das der Taster hängt, und so tatsächlich einen Dauerinterrupt auslöst? Aber wenn ja wieso bei der 2. ISR Routine nur ab und zu und bei der anderen immer? Und warum Resetet der µP bei der 2. Routine?
Ich habe das gefühl irgendwie stimmt was mit den Sprüngen nicht so ganz...