Hallo AVR-Welt,
auf was man beim Basteln nicht alles Stößt und mit welchen Problemen man sich rumschlagen muss
Mit diesem Kleinprojekt möchte ich Euch ein Thema vorstellen was sicher so mancher gut gebrauchen kann und um das ich auch bei meiner Wintergartensteuerung nicht herum gekommen bin.
Eine Tastatur für Tasteneingaben, realisiert als Ressourcen schonende 3x3 Tastenmatrix mit Interruptabfrage.
Merkmale der hier vorgestellen Lösung:
- Tastenmatrix 3x3 mit jeweils 3 Spalten und 3 Zeilen.
- Um die Tastenmatrix nicht ständig zu pollen und Rechenzeit zu verbraten habe ich mir eine Interrupt-Steuerung dazu überlegt.
- Es sollte möglich sein auch mehrere Tasten gleichzeitig betätigen und erkennen zu können.
- Über den zurückgelieferten Tastencode soll rechnerisch auf die einzelnen Tasten zurückgeschlossen werden können um später schöne Menüs und Funktionen zu realisieren.
Benötigte Ressourcen:
- 3 freie Eingange für Zeilen
- 3 freie Ausgänge für die Spalten
- 1 freier Interrupt
Umsetzung:
- Um auch mehr als eine Taste in beliebigen Zeilen/Spalten betätigen zu können benötigt man Entkopplungsdioden welche ich bei meinem Prototyp in die Spalten eingebaut habe. Man kann auch jede einzelne Taste mit einer Diode absicher. Es soll auch Tasten geben welche solche Dioden gleich mit beinhalten.
- Achtung: Man findet im Internet immer wieder Lösungsvorschläge (auch im BASCOM-AVR Buch "Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR") bei dem der BASCOM Befehl "debounce" verwendet wird. Ich habe in meinem Code explizit auf debounce verzichtet da debounce verhindert, dass mehrer Tasten gleichzeit in einer Zeile betätigt werden können. Das hängt mit der speziellen Umsetzung von debounce und der Tatsache zusammen, das ein PIN wieder "losgelassen" werden muss bevor ein neuer Signalzustand von debounce erkannt wird. Mit meiner Lösung funktioniert es besser.
- Ich habe eine kleine Wartezeit mit ein paar Milisekunden eingebaut. Diese Wartezeit dient a: zum entprellen der Tasten und b: ermöglicht es dem Benutzer auch mehrere Tasten gleichzeitig zu drücken. Der Mega ist sonst ohne Wartezeit zu schnell.
- In meinem Code gibt es zwei Varianten (Variante 1 und Variante 2) die über globale Konstanten umgeschaltet werden kann. Variante 1 ist dafür gedacht, die Auswertung der Tasten nach Interrupt über ein globales Flag gesteuert in der Hauptschleife zu machen. Variante zwei erledigt die Auswertung der Tastatur gleich in der Inetrrupt-Routine. Es bleibt Euch überlassen, welche Varinate Ihr ggf. einsetzen wollt.
- Jeder Taste ist über die Spalte und Zeile eine entsprechende Wertigkeit zugeordnet so das man später über ein wenig Rechnerei auch rausfinden kann, welche Tasten alle betätigt wurden die zu dem Interrupt geführt haben.
- Eine neue Tasteneingabe wird erst nach Freigabe des Interrupts ermöglicht. Damit kann man in Ruhe die Tasten asuwerten und auch Eingaben verhindern. Achtung: Doppelt betätigte Tasten und während der Interrupt-Freigabe bereits schon anstehende Interrupts werden durch löschen des Interrupt-Flags im Interrupt-Flag-Register zum Zeitpunkt der Tastenfreigabe verhindert.
Allgemeines:
- Aufgebaut und in Betrieb genommen wurde der Prototyp auf Lochraster in Verbindung mit einem STK500 + STK501, ATmega 128 mit extern 16MHz. Im Code sind aber keine weiteren Spezialitäten vorhanden so das dieser eigentlich auf jedem anderen Mega laufen müsste.
- Die Tastenmatrix ist ohne großen Aufwand beliebig auf 4x4 oder mehr erweiterbar. Zum Rechnen würd eich dann für den Tastencode den Datentyp WORD verwenden.
- Die Anordnung der Tasten in meinem Prototyp habe ich schon auf meine Wintergartensteuerung angepasst. Dort benötige ich zwei Tasten für Bschattung auf/zu, zwei Tasten für Licht heller/dunkler und ein Tastenkreuz mit Enter für Menüs und diverse andere Funktionen. Licht aus und Beschattungsantrieb stopp realisiere ich durch gleiczeitiges Betätigen der jeweiligen Tastenpaare. Die Tastatur ist und bleibt aber eine Matrix und Ihr könnt sie ja beliebig abändern.
So, ich glaube das war das Wichtigste in Kürze. Ihr findet wie üblich den BASCOM-AVR Source-Code sowie das Schaltbild und ein Bild vom Prototyp im Anhang.
Viel Spass beim Ausprobieren,
Markus
auf was man beim Basteln nicht alles Stößt und mit welchen Problemen man sich rumschlagen muss
Mit diesem Kleinprojekt möchte ich Euch ein Thema vorstellen was sicher so mancher gut gebrauchen kann und um das ich auch bei meiner Wintergartensteuerung nicht herum gekommen bin.
Eine Tastatur für Tasteneingaben, realisiert als Ressourcen schonende 3x3 Tastenmatrix mit Interruptabfrage.
Merkmale der hier vorgestellen Lösung:
- Tastenmatrix 3x3 mit jeweils 3 Spalten und 3 Zeilen.
- Um die Tastenmatrix nicht ständig zu pollen und Rechenzeit zu verbraten habe ich mir eine Interrupt-Steuerung dazu überlegt.
- Es sollte möglich sein auch mehrere Tasten gleichzeitig betätigen und erkennen zu können.
- Über den zurückgelieferten Tastencode soll rechnerisch auf die einzelnen Tasten zurückgeschlossen werden können um später schöne Menüs und Funktionen zu realisieren.
Benötigte Ressourcen:
- 3 freie Eingange für Zeilen
- 3 freie Ausgänge für die Spalten
- 1 freier Interrupt
Umsetzung:
- Um auch mehr als eine Taste in beliebigen Zeilen/Spalten betätigen zu können benötigt man Entkopplungsdioden welche ich bei meinem Prototyp in die Spalten eingebaut habe. Man kann auch jede einzelne Taste mit einer Diode absicher. Es soll auch Tasten geben welche solche Dioden gleich mit beinhalten.
- Achtung: Man findet im Internet immer wieder Lösungsvorschläge (auch im BASCOM-AVR Buch "Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR") bei dem der BASCOM Befehl "debounce" verwendet wird. Ich habe in meinem Code explizit auf debounce verzichtet da debounce verhindert, dass mehrer Tasten gleichzeit in einer Zeile betätigt werden können. Das hängt mit der speziellen Umsetzung von debounce und der Tatsache zusammen, das ein PIN wieder "losgelassen" werden muss bevor ein neuer Signalzustand von debounce erkannt wird. Mit meiner Lösung funktioniert es besser.
- Ich habe eine kleine Wartezeit mit ein paar Milisekunden eingebaut. Diese Wartezeit dient a: zum entprellen der Tasten und b: ermöglicht es dem Benutzer auch mehrere Tasten gleichzeitig zu drücken. Der Mega ist sonst ohne Wartezeit zu schnell.
- In meinem Code gibt es zwei Varianten (Variante 1 und Variante 2) die über globale Konstanten umgeschaltet werden kann. Variante 1 ist dafür gedacht, die Auswertung der Tasten nach Interrupt über ein globales Flag gesteuert in der Hauptschleife zu machen. Variante zwei erledigt die Auswertung der Tastatur gleich in der Inetrrupt-Routine. Es bleibt Euch überlassen, welche Varinate Ihr ggf. einsetzen wollt.
- Jeder Taste ist über die Spalte und Zeile eine entsprechende Wertigkeit zugeordnet so das man später über ein wenig Rechnerei auch rausfinden kann, welche Tasten alle betätigt wurden die zu dem Interrupt geführt haben.
- Eine neue Tasteneingabe wird erst nach Freigabe des Interrupts ermöglicht. Damit kann man in Ruhe die Tasten asuwerten und auch Eingaben verhindern. Achtung: Doppelt betätigte Tasten und während der Interrupt-Freigabe bereits schon anstehende Interrupts werden durch löschen des Interrupt-Flags im Interrupt-Flag-Register zum Zeitpunkt der Tastenfreigabe verhindert.
Allgemeines:
- Aufgebaut und in Betrieb genommen wurde der Prototyp auf Lochraster in Verbindung mit einem STK500 + STK501, ATmega 128 mit extern 16MHz. Im Code sind aber keine weiteren Spezialitäten vorhanden so das dieser eigentlich auf jedem anderen Mega laufen müsste.
- Die Tastenmatrix ist ohne großen Aufwand beliebig auf 4x4 oder mehr erweiterbar. Zum Rechnen würd eich dann für den Tastencode den Datentyp WORD verwenden.
- Die Anordnung der Tasten in meinem Prototyp habe ich schon auf meine Wintergartensteuerung angepasst. Dort benötige ich zwei Tasten für Bschattung auf/zu, zwei Tasten für Licht heller/dunkler und ein Tastenkreuz mit Enter für Menüs und diverse andere Funktionen. Licht aus und Beschattungsantrieb stopp realisiere ich durch gleiczeitiges Betätigen der jeweiligen Tastenpaare. Die Tastatur ist und bleibt aber eine Matrix und Ihr könnt sie ja beliebig abändern.
So, ich glaube das war das Wichtigste in Kürze. Ihr findet wie üblich den BASCOM-AVR Source-Code sowie das Schaltbild und ein Bild vom Prototyp im Anhang.
Viel Spass beim Ausprobieren,
Markus