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
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.
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.
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.