PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Interrupt-Rückkehr



2512708
26.08.2009, 08:27
Hallo,

bei mir funktioniert die Rückkehr aus einen Interrupt nicht korrekt.
Ich habe ein Menü programmiert bei dem ich 2 Auswahlmöglichkeiten habe.
Entweder mit einem "setup" fortfahren oder "exit". Leider muss ich den Exit Taster immer 2 mal drücken um das Menü verlassen zu können. Sonst funktionier alle.
Hier ein Teil des Codes (ich weis, GOTO ist nicht so ideal, habe es aber auch schon anders probiert "Loop Until... usw.", aber immer dasselbe Ergebnis)


Isr_pcint1:
'Menue
Waitms 200
Cls
Do
Locate 1 , 1
Lcd "Setupmenue:"
Locate 3 , 1
Lcd "[Setup] to enter"
Locate 4 , 1
Lcd "[Exit] to leave"
If Pinc.2 = 0 Then Goto Stunde
Loop Until Pinc.5 = 0
Waitms 200
Cls
Return

'Hier gehts dann weiter mit Label Stunde: usw...

Danke schonmal

stefan_Z
26.08.2009, 09:23
Stackgrößen mal hoch gesetzt? Das ist immer ein beliebtes Problem...

2512708
26.08.2009, 15:44
Danke, war nen Versuch wert.

Hat aber leider nicht geholfen.

Sauerbruch
26.08.2009, 16:40
ich weis, GOTO ist nicht so ideal

Ich gehöre zwar nicht zu den Leuten, die Glaubenskriege über GOTO ausfechten. Um genau zu sein verwende ich diesen Befehl sogar außerordentlich gerne (man muss nur schlau genug sein, um den Überblick zu behalten).

ABER:
Wenn Du eine ISR mit ´nem GOTO verlässt, kann es nicht nur sein dass sich das Programm aufhängt, sondern es wird definitiv passieren. So sicher wie das Amen in der Kirche, weil der Stack total schnell überläuft. Egal, wie groß er definiert ist.

Also: If PinC.2 = 0 then Flag setzen, und das Flag dann in der Hauptroutine abfragen. Anders kann´s nicht gehen :-)

Und Do-Loop-Schleifen in der ISR... ich weiß ja nicht, vielleicht geht das ja auch anders?

Aber schmeiß erstmal das Goto Stunde raus, dann müsste es schon laufen!

MfG,

Daniel

stefan_Z
26.08.2009, 17:09
WAITMS in ner ISR ist eh "verboten" - also macht keinen Sinn, dass der µC seine Zeit in der ISR verballert... Versuch das lieber mit Flags zu lösen, die du dann im Main-Loop abarbeitest!

2512708
26.08.2009, 20:00
Irgendwie komm ich nicht weiter.
Ich hab jetzt sogar mal den Code total minimiert:


Isr_pcint1:
'Menue
Cls
Do
Locate 1 , 1
Lcd "Setupmenue:"
Locate 3 , 1
Lcd "[Setup] to enter"
Locate 4 , 1
Lcd "[Exit] to leave"
Loop Until Pinc.5 = 0
Cls
Return

Leider noch keine Änderung.

stefan_Z
27.08.2009, 02:30
Auch LOOP UNTIL macht in einer ISR nicht wirklich Sinn...
Die einzigen Fehlerquellen die mir noch einfallen sind:
A - PCINT1 wird dauerhaft ausgelöst und er startet immer wieder neu
B - PINC.5 wird nie 0 (mal manuell testen, Pullup an, wasauchimmer)