closeThis post has been published 2 years 9 months 13 days ago and may be out of date. Please read it carefully, I'm not responsible for any mistakes.

Bei einer Tastenabfrage gibt es 2 primäre Lösungswege, wie ein Drücken vom Mikrocontroller detektiert werden kann: einerseits gibt es das sog. Polling, wo zyklisch der Zustand eines Tasters abgefragt wird und andererseits den Interrupt. Ersteres hat den Nachteil, dass ein großer Anteil an CPU-Ressourcen für die Abfrage aufgebracht werden muss, auch wenn keine Eingabe erfolgt. Das begleicht die Methode mit dem Interrupt damit, nur dann aktiv zu sein, wenn sich die Spannung am Pin auch tatsächlich ändert.

-> Wo das Polling dennoch Einsatz findet: ein zusätzlicher Mikrocontroller, der alle Tasteneingaben aufnimmt und in Variablen abspeichert, die zyklisch per I2C abgefragt werden.

 


Praktische Umsetzung

In Mikrocontrollern sind an einigen wenigen Pins Hardware-Interrupts verbaut, deren Funktion die aktuelle Programmschleife nicht beeinflussen, also verlangsamen. Erst wenn eine Zustandsänderung vorliegt, pausiert der Interrupt-Handler (Unterbrechungsroutine) den aktuellen Befehl und führt den Code aus, der in der Interrupt-Methode definiert ist.

Das Problem hierbei ist, dass insgesamt nicht genug interruptfähige Pins zur Verfügung stehen, um komplexe Eingaben ermöglichen zu können. Die meisten AVRs mit 8-Bit besitzen 3 Pins dieser Art, wobei es für manche Projekte weniger sinnvoll ist, alle HW-Interrupts für Tasteneingaben zu “missbrauchen”, zumal selbst ein Dreh-Encoder schon 2 Interrupts benötigt.

Ziel ist es also, jede Taste einzeln mit einem “normalen” Pin zu verbinden, um ein Drücken eindeutig identifizieren zu können und zusätzlich alle als Summe an einen Interrupt, damit die Aktion “Drücken” überhaupt eine Reaktion auslösen kann. Folgender kleiner Schaltplan beinhaltet diese Rahmenbedingungen:

multiple_buttons_schmematic

Wichtig: bei allen Pins muss der Pull-up-Widerstand aktiviert sein oder alternativ ein solcher zusätzlich gegen Vcc hinzugefügt werden. Somit liegt immer ein High-Pegel an, der durch den Taster/Schalter/Encoder gegen Masse gezogen wird. Über den RC-Tiefpass aus Rx und Cx wird die Bandbreite auf etwas 500 Hz begrenzt, was beim Einsatz eines Interrupts absolut essentiell ist, da mechanische Schalter stark prellen. (oszillierender Übergang von nichtleitend auf leitend)

Die Dioden sorgen für eine unabhängige Operation der Taster, ohne diese würden bei Betätigung eines Tasters alle Pins gegen Masse gehen. Drückt man einen, wird die Kathode der Diode negativer, als die Anode, somit wird diese leitfähig. Das führt dazu, dass die komplette Leitung zum Interrupt-Pin etwa 0,6-0,7V führt, je nach Diodentyp. Einen anderen Pin beeinflusst dies jedoch nicht, da die jeweilige Diode dann sperrt!

 

[Total: 0    Average: 0/5]

Leave Comment

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.