Hallo, bei einem ATMEGA8L ist der ADC-Interrupt und der Int0 aktiv. Der ADC-Int. läuft zu 99% der Zeit mit 5000sps (clock 8 MHz) Ub=4V. Alles korrekt abgeblockt usw. Das Programm ist in Assembler (AVR-Studio) geschrieben und belegt ca. 3700 Bytes (cseg). Der Int0 wird mit einem Taster gegen Masse ausgelöst. Der Pullup-Widerstand für den Pin ist aktiv. Es ist noch reichlich RAM vorhanden (Stack). Int0 soll später einen Flag in einem Register verändern. Allerdings gibt es schon mit der gezeigten Int0-ISR seltsame Probleme. Siehe Kommentar. Das Gleiche passiert übrigens auch bei Verwendung anderer Register. Bin etwas ratlos... Initialisierung: outi MCUCR,0b00000000 ;Int0: Low-Level, Int1:Low-Level (S.65) sbit GICR,INT0 ;Int enabled:bit6 (S.65) ....main.... int0_isr: ;es ist jeweils nur eine der auskommentierten Zeilen aktiv! push r17 ;ori r17,0b10000000 ; manchmal RESET ;andi r17,0b01111111 ; manchmal RESET ;ldi r17,33 ; nie RESET ! pop r17 reti Wieso kommt es manchmal zum Reset bzw. auch "Absturz" d.h. Programm läuft nicht mehr? Gruß+Danke Andreas
Hi > ;ori r17,0b10000000 ; manchmal RESET > ;andi r17,0b01111111 ; manchmal RESET > ;ldi r17,33 ; nie RESET ! 'ori' und 'andi' verändern u.U. die Flags in SREG. 'ldi nicht. Du solltest in der ISR SREG sichern. z.B push r16 in r16,SREG push r16 .... pop r16 out SREG,r16 pop r16 reti MfG Spess
> Wieso kommt es manchmal zum Reset bzw. auch "Absturz" d.h. Programm > läuft nicht mehr? Weil ori und andi Einfluss auf das SREG haben und du es in der ISR nicht sicherst und restaurierst.
Mist, hätte ich auch selber drauf kommen können, zumal ich das in der ADC-ISR auch so gemacht habe.... Vielen Dank! Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.