Forum: Mikrocontroller und Digitale Elektronik Interrupt Bit Löschen


von Bimbo385 (Gast)


Lesenswert?

Ich benutze BasecomAVR zum Programmiren von ATmega's.

Ich hab folgendes Problem.

Durch einen Int-Interrupt (der über einen Taster ausgelöst wird), 
beginnt eine Interruptrutine.

Sobald ich in dieser Interruptrutine den Taster (mit dem ich den 
Interrupt auslöse, der an dem Int-Eingang hängt) als normalen Taster 
verwende (Disable Interrupt bzw. Enable Interrupt Befehle sind am Anfang 
und am Ende der Interruptrutine), dann setzt er dieses Interrupt Bit.

Sobald ich dann die Interruptrutine verlasse, also Enable Interrupt 
passiert ist.

Löst er das Interrupt sofort wieder aus.

Ich muss also diese Interrupt Bit Löschen, bevor ich die Interrupts 
wieder einschalte.

Aber wie mache ich das in BasecomAVR???


Mfg Bimbo385

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Pin-Interrupte nimmt man generell nicht zum Abfragen von Tasten. Da 
Taster wie Sau prellen, gehen mehrere Interruptanforderungen innerhalb 
kurzer Zeit ein, was Deinen Controller dazu veranlaßt, gleich wieder 
neue Interrupte auszulösen. Das betreffende Flag wird übrigens durch den 
Interrupt selbst gelöscht, da muß man nichts von Hand machen. Die 
richtige Lösung wäre, einen Timerinterrupt auszulösen, der alle paar ms 
zuschlägt und in dessen Interruptserviceroutine fragt man die Tastenpins 
ab, ob sich etwas geändert hat. Dabei kann man dann auch gleich eine 
Entprellung einbauen, also das Testen darauf, ob der Pinzustand für eine 
entsprechende Anzahl von Interruptdurchläufen gleich geblieben ist. Erst 
dann wird der Schaltvorgang ausgelöst.

von Johannes M. (johnny-m)


Lesenswert?

Travel Rec. wrote:
> Pin-Interrupte nimmt man generell nicht zum Abfragen von Tasten.
Außer, wenn der Taster den µC aus einem Sleep-Modus aufwecken soll. Ist 
aber eigentlich die einzige einigermaßen sinnvolle Anwendung.

> Das betreffende Flag wird übrigens durch den
> Interrupt selbst gelöscht,
...aber auch sofort wieder gesetzt, wenn der Taster prellt, was dann 
eben dazu führt, dass der Interrupt Handler nach Verlassen direkt 
nochmal ausgeführt wird.

> da muß man nichts von Hand machen.
Im obigen Fall schon. Man muss nur wissen, dass das Löschen eines 
Interrupt-Flags durch Hineinschreiben einer 1 geschieht. Ob und wenn ja, 
wie das mit BASCOM geht, entzieht sich allerdings meiner Kenntnis.

> Die richtige Lösung wäre, einen Timerinterrupt auszulösen, der alle paar ms
> zuschlägt und in dessen Interruptserviceroutine fragt man die Tastenpins
> ab, ob sich etwas geändert hat. Dabei kann man dann auch gleich eine
> Entprellung einbauen, also das Testen darauf, ob der Pinzustand für eine
> entsprechende Anzahl von Interruptdurchläufen gleich geblieben ist. Erst
> dann wird der Schaltvorgang ausgelöst.
Das ist die elegante und empfehlenswerte Methode. Zumal man eigentlich 
in fast jedem Programm irgendeine Zeitbasis (konstanten Takt) für 
irgendwelche anderen Dinge benötigt. Da ist es dann kein Akt, eben noch 
die Tasterabfrage mit zu erledigen. Es genügt bei Tastern völlig, eine 
Abfrage des Zustandes alle paar zig Millisekunden zu machen.

von Bimbo385 (Gast)


Lesenswert?

OK dann werde ich das mal mit dem Timerinterrupt probieren


Erstmal Danke

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
Noch kein Account? Hier anmelden.