PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ISR wird nach enable INT2 ausgeführt, obwohl Pin auf high



robodriver
04.05.2008, 00:18
Hallo Leute,

ich hock hier seit inigen Stunden an einem Problem und komm nicht mehr weiter.
Leider ist mein Programm schon äußerst umfangreich (Über 1000 Zeilen in Bascom). Desshalb hänge ich das Programm als anhang mal mit dran, falls sich jemand die Mühe machen möchte da mal drüber zu schaun.

Mein Problem ist recht schnell beschrieben: Immer wenn ich in meinem Code den Befehl "Enable INT2" verwende, springt mein Programm in die ISR Routine.
In der ISR wird der INT2 disabled. Dann werden Daten verarbeitet und der INT2 wieder Enabled und mit diesem Enable springt er wieder direkt in die ISR und so weiter....

Problem ist: Der INT2 Pin ist die ganze Zeit auf glatten 5V
Habe den INT2 als Falling configuriert.
Aber dennoch: Die ISR wird beim enablen aufgerufen, trotz das der Pin auf High ist.

Ich nutze einen Mega32. Die Frames sind wie folgt eingestellt:
$hwstack = 128
$swstack = 64
$framesize = 80

Hat irgendjemand vielleicht eine Idee was zu diesem, mir unerklärlichen, Verhalten führen kann?

robodriver
04.05.2008, 11:27
Hallo Leute,

also mir ist jetzt noch eine Idee gekommen woher das eventuell kommen könnte:
Ich habe mal gehört, das sich der AVR einen Interrupt "merkt" wenn er während der disable-Zeit kommt.
Kann das sein?

Weil bei mir ist es so, das der Interrupt unzählig oft kommt. Aber halt während er disabeld ist (desshalb disable ich ihn ja).
Wenn er sich das irgendwie merkt, dann würde das erklären warum er mit der aktivierung in die ISR springt.

Dann wäre aber meine Frage: Wie kann man das wieder raus löschen, wenn er sich das gemerkt hat?

for_ro
04.05.2008, 11:54
Problem ist: Der INT2 Pin ist die ganze Zeit auf glatten 5V
Habe den INT2 als Falling configuriert.
Aber dennoch: Die ISR wird beim enablen aufgerufen, trotz das der Pin auf High ist.

Weil bei mir ist es so, das der Interrupt unzählig oft kommt. Aber halt während er disabeld ist (desshalb disable ich ihn ja).

Was stimmt denn nun?
Bleibst du so lange in der INT2 ISR, bis keine impulse mehr kommen? Woher weißt du das?
Die aufgelaufenen Interrupts kannst du über EIFR Register (zumindestens bei meinem Mega128) löschen. Unmittelbar vor dem Enable musst du das entsprechende Bit auf 1 setzen, dann sind die mittlerweile aufgelaufenen Interrupts für diesen Typ gelöscht. Schau mal unter INTF2 in deinem Manual.

Gruß

Rolf

robodriver
04.05.2008, 12:11
Okay, ist etwas unglücklich ausgedrückt.

Sagen wir es mal so: An dem Interrupt hängt die Datenleitung eines anderen Moduls. Das Modul zieht diesen Pin zunächst auf Low, wenn es Daten hat. Dann kann ich die Daten vom Modul auslesen (mit einem weiteren Befehl) Und während die Daten kommen geht der INT dann mehrfach auf high und low. Logisch, sind ja Daten.
So, wenn ich dann alle Daten ausgelesen habe, ist der Pin wieder auf high, ich aktiviere den INT wieder und der springt sofort wieder in die ISR.

So ist es halt auch bein Einschalten des Moduls: Bei der initialisierung des Moduls wechselt der INT2 Pin mehrfach zwischen high und low. Wenn die Initialisierung durch ist, ist der Pin auf high.
(hab da auch mal wait 4 rein geschrieben und mit dem Multimeter nachgemessen) und wenn dann der Befehle "Enable INT2" ausgeführt wird, springt er direkt in die ISR.

Das meine ich damit, das der PIN die ganze Zeit auf high ist, wenn er in die ISR springt.

Und das passiert halt echt immer. Mit dem Enabeln springt er immer gleich wieder zur ISR obwohl der pin auf 5V ist.

Hab mal im Datenblatt nachgesehen ein External Interrupt Flag Register (EIFR) hat der Mega32 nicht.

robodriver
04.05.2008, 12:38
Ah, jetzt hab ich was gefunden:
Das GIFR scheint das beim Mega32 zu sein.

Hab jetzt mal das Bit5 im GIFR (INT2) vor dem enabeln gesetzt und dann wird die ISR nicht mehr aufgeführt beim enabeln.

Und wenn ein Interrupt kommt, dann wird die ISR ausgeführt.
Also alles genau so wie es sein soll :)

Vielen Dank für deinen Hinweis.

Ich verstehe zwar nicht so ganz warum dieses Bit nicht vom Compiler bei dem Befehl Enable automatisch gesetzt wird.

Weil wenn ich einen INT disable, dann ja wohl aus gem Grund, weil ich ankommende INTs ignorieren möchte. Also ists doch sinnlos, wenn das dann beim enabeln ausgeführt wird.
Oder hab ich da jetzt einen Denkfehler?

linux_80
04.05.2008, 12:46
Hallo,

das mit dem automatischen INT-Flag löschen ist evtl. jetzt in Deinem Fall praktikabel, aber was ist, wenn das der INT von TWI, SPI oder UART ist, dann gehen Dir die Daten verloren wenn der INT einfach so verschluckt wird !

robodriver
04.05.2008, 12:52
Naja, wenn man will das die Daten nicht verloren gehen, dann disabled man den Interrupt einfach nicht.

Dann wird er ausgeführt wenn die ISR beendet ist.