PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisprobleme über die Funktionsweise eines Interrupts



electrofux
26.10.2006, 14:28
Hallo,

ich programmiere gerade eine Motorsteuerung mit Bascom und der rn-control at mega32.

Ich habe dabei u.a. eine Lichtschranke an den INT2 angeschlossen, die eine Rückwährtsfahrt durch Auslösen der entsprechenden Interruptroutine beenden soll.

Im Laufe des Programms enablen und disablen wir den Interrupt, je nachdem ob eine Rückwärts oder Vorwährtsfahrt ansteht.
Während der Phase, in der der Int2 disabled ist, arbeitet die Lichtschranke natürlich weiter und gibt Signale an den Port weiter, nur daß diese keine Interruptroutine auslösen (so weit so gut)

Das Problem, ist nur, daß sobald wir den Int2 wieder enablen (Enable Int2), löst er auch sofort aus, obwohl die Lichtschranke gar nichts von sich gibt (passiert auch im stehenden Zustand).

Wird eine Interruptauslösung irgendwo zwischengespeichert obwohl der Interrupt diasabled ist ? Ist das normal und ich muß das irgendwie programmiertechnisch umgehen oder versteh ich da irgendetwas komplett falsch und es liegt nur an einer Einstellung?
Ist das mit dem enablen und disablen des Interrupts überhaupt sinnvoll, oder empfiehlt sich eine solche Vorgehensweise aus irgendwelchen Gründen nicht?
Stecke jetzt echt fest.

Grüße
Markus Fuchs

electrofux
26.10.2006, 18:12
Ich check das einfach nicht. Ich habe das ganze jetzt mal isoliert und ein einfaches Programm geschrieben.

Also wir haben die Lichtschranke, die bei Auslösung in der lichtschranke_isr einfach nur eine meldung per print plus einen Zaehler ausgibt.

Das klappt auch ohne Probleme - sprich, wenn die Lichtschranke unterbrochen ist, dann kommt nix und wenn die Lichtschranke ununterbrochen ist, dann kommt die Meldung und ein Zaehler.

Dann habe ich zwei Taster. Der eine schaltet den Int2 per "enable Int2" an und der andere per "disable Int2" aus.

Ist der Int2 disabled kommt auch keine Meldung mehr.

Wenn ich aber hingehe und während der Int2 disabled ist, die Lichschranke einmal auslöse und danach den Int2 irgendwann wieder enable, dann bekomme ich sofort die Meldung (d.h. der Interrupt wird ausgelöst) plus einen um eins erhöhten Zähler.
Wie kann das sein????

In dem Moment, wo ich den int2 wieder enable, wird doch an der Lichtschranke nichts ausgelöst. Als hätte er die Auslösung während er disabled war irgendwo gespeichert.

Kann sich da jemand eine Reim drauf machen.

Grüße
Markus

PicNick
26.10.2006, 18:31
Ja, da ist der AVR wie ein Elephant, merkt sich alles. Du muß VOR dem wieder-enablen das INT-Bit löschen, indem du "1" reinschreibst.
Das register heißt GIFR ,
Bit 5 Int2
Bit 6 Int0
Bit 7 Int1

also GIFR.5 = 0 in deinem Fall

electrofux
31.10.2006, 17:14
Aaahh, okay,

das erklärt einiges. Besten dank. Das werde ich morgen gleich ausprobieren aber das wird bestimmt die Lösung sein.

Grüße
Markus Fuchs