Anschließen einer Tastatur an einen AVR
Lesen eines solchen Tastatur digitale Logikkomponenten verwenden, benötigen Sie mindestens:
- ein Oszillator, ein Schieberegister und ein Start / Stopp-Gate der Spaltensignale zu erzeugen,
- Erkennung, wenn eine der vier Zeilensignale Null ist,
- ein recoder zur Umwandlung der sieben Signale an den Keycode.
Eine Tastenfeld-Matrix kann direkt an einen I / O-Port eines AVR, ohne zusätzliche Komponenten angeschlossen werden.
Das Beispiel zeigt, eine Verbindung zu den unteren sieben I / O-Pins von Port B. andere Ports lassen sich ebenso verwendet werden.
Die Port-Pins PB4..PB6 als Ausgänge definiert werden, liefern sie die Spaltensignale. Der Port-Pins PB0..PB3 verwendet wird, in den Zeilen Ergebnisse zu lesen. Pull-up-Widerstände auf diesen Eingaben durch Software aktiviert sind, externe Widerstände sind nicht erforderlich.
Das folgende Software Beispiel zeigt erste Initialisierung des Ports. Diese Software Teil muss nur einmal beim Programmstart der AVR excecuted werden.
Init-Routine
Überprüfen Sie für jede Taste gedrückt
Die folgende Routine stellt fest, ob irgendeine der Tasten 12 gedrückt wird. Diese Routine wird in Intervallen aufgerufen, z.B. in einer Verzögerungsschleife oder durch die Verwendung eines Timers.
Identifizieren Sie die Taste gedrückt
Nun wird das Tastenfeld ausgelesen. Einer nach dem anderen der Hafen PB6, PB5 und PB4 Bits zu niedrig eingestellt, und PB0..PB3 werden Nullen geprüft. Das Registerpaar Z (ZH: ZL) zeigt auf eine Tabelle mit dem Schlüsselcodes. Wenn die Routine verlassen, Punkte dieses Paar an den Tastencode der gedrückten Taste. Durch den LPM-Befehl verwendet, wird der Schlüsselcode aus der Tabelle im Flash-Speicher in dem Register R0 gelesen.
Entprellung
Die Routinen KeyProc und NoKeyPressed haben die gedrückte Taste zum Entprellen. Zum Beispiel durch einen Zähler Aufwärtszählen immer dann, wenn der gleiche Schlüssel identifiziert wird. Wiederholen Sie dies für z.B. 50 Millisekunden. Die NoKeyPressed Routine löscht den Zähler und die Taste gedrückt wird. Da das Timing auf anderen notwendigen Timing-Anforderungen des AVR-Programms abhängig ist, wird es hier nicht dargestellt.
Hinweise, Nachteile
Die Routinen oben gezeigt wird, sind nicht mehr Zeit zwischen der Einstellung der Spaltenadresse und dem Lesen der Zeileninformationen verlassen. Bei hohen Taktfrequenzen und / oder mehr Verbindungen zwischen Tastatur und Prozessor ist es notwendig, mehr Zeit zwischen Schreib zu verlassen und lesen (beispielsweise durch Einfügen von NOP-Befehlen).
Die internen Pull-ups Widerstände haben Werte um 50 kOhm. Lange Schlangen oder einer lauten Umgebung kann stören und Störungen erzeugen. Wenn Sie es weniger empfindlich mögen, fügen vier externen Pull-ups.
Ein Nachteil der Schaltung ist, dass es sieben Portleitungen ausschließlich erfordert. Die Modifizierung mit einem AD-Wandler und ein Widerstandsnetzwerk (siehe Kapitel 3) eine wirtschaftlichere und speichert Portleitungen.
3. Anschluss an einen ADC mit einer Widerstandsmatrix
Die meisten der Tiny und Mega-AVR-Geräte heute einen AD-Wandler an Bord haben. Ohne zusätzliche externe Hardware sind diese in der Lage von analogen Spannungen messen und lösen diese mit 10 Bit Auflösung. Diejenigen, die wollen I / O-Ports speichern müssen nur die Tastatur erhalten, um eine analoge Spannung zu erzeugen. Das ist die Aufgabe für eine Widerstandsmatrix.
Hinweis: Eine verbesserte Version dieses Textes mit mehr Beispiele, ein Kommandozeilen-Software-Tool, etc. finden Sie hier. Eine grafische Software-Tool für die Untersuchung verschiedener Schaltungsvarianten und Größen finden Sie hier.
Widerstandsmatrix
* 1 + k ω 820 = 1,82k an Masse,
* 3,3 + 680 k ω + ω = 180 bis plus 4,16k.
Bei einer Betriebsspannung von 5 Volt eine geteilte Spannung von
1,82 * 5 / (1,82 + 4,16) = 1,522 Volt
ist auf dem AD-Wandler-Eingang gesehen. Wenn wir 5% Toleranz der Widerstände betrachten, ist die resultierende Spannung irgendwo zwischen 1.468 und 1.627 Volt. Der 10-Bit-AD-Wandler wandelt dieses (bei 5 V Referenzspannung) auf einen Wert zwischen 300 und 333. Wenn man den unteren zwei Bits des Ergebnisses (zB unterteilt das AD Ergebnis durch vier oder links Einstellen des Ergebnisses ignorieren - wenn die ADC liefert diese Funktion) Dies ergibt einen 8-Bit-Wert zwischen 74 und 78.
Jeder Tastendruck erzeugt einen typischen Spannungsbereich, mit dem Schlüsselcode umgewandelt werden.
Key Codiertabelle
Die Matrix verwendet Widerstände der E12 Reihe, die in jedem elektronischen Speicher verfügbar sind. Deshalb sind die Widerstandswerte (zum Beispiel 820 oder 3300) ein wenig lustig Zahlen sind.
Die verschiedenen Widerstände sind notwendig, um eine glatte Kurve der Analogspannungen von diesen 12 verschiedenen Tasten zu erreichen. Wenn Sie denken, dass es praktischer ist, nur für alle einen Wert verwenden, versuchen Sie die resultierenden Spannungen zu berechnen. Sie werden bald erfahren, dass alle diese Widerstände unterschiedliche Werte haben müssen. Der Grund dafür, dass in Teil ist, dass sie in den beiden Reihen addieren, ist ein weiterer Grund, die Spannungsteiler Formel, die nicht linear ist. Wenn Sie in der Lage sind, dass mit ein paar Formeln in optimaler Weise zu lösen, versuchen. Ich habe sehr schnell auf.
Das Folgende ist eine Tabelle für die oben dargestellt Matrix, die die sich ergebende Widerstände für jede Taste gedrückt berechnet. Natürlich, wenn Sie davon ausgehen, dass zwei Tasten gleichzeitig gedrückt werden können, müssen Sie stattdessen auf eine PC-Tastatur bewegen. Aber nicht viele Leute drücken zwei Tasten auf einmal.
Die zweite Zeile der Tabelle zeigt die Widerstandswerte gegen Erde, die dritte in Richtung der Betriebsspannung. Die Spannung, die von diesem Spannungsteiler ergibt, wird mit der Formel berechnet
Da verfügbare Widerstände eine Toleranz von +/- 5% aufweisen muss das Minimum und Maximum zu berechnen. Auf das Minimum, alle Widerstände mit Masse berechnen angenommen -5% haben, die alle in Richtung VCC angenommen hat + 5%. Das ist nicht sehr realistisch, aber wir wollen nicht von Hand wählen Widerstände und testen sie im Sommer und Winter.
Die die Spannungen, die mit den Tasten verbunden sind, und deren Variation durch Toleranz wird im folgenden Diagramm dargestellt.
Wie zu sehen ist, beeinflusst die Toleranz nur die mittleren Tasten.
In der Tabelle werden die Werte N hinzugefügt, dass von einer AD-Wandlung mit 8-Bit-Ergebnis würde. Diese Auflösung ist in Ordnung, da alle Werte in ausreichender Entfernung von dem vorherigen und dem nächsten Wert haben.
Spannungen und Tastenerkennung
Wie aus der Tabelle ersichtlich ist, gibt es keine Überlappung der verschiedenen Erfassungswerte für die Schlüssel, unter 5% Toleranz der Widerstände berücksichtigt.
Diejenigen, die mit anderen Widerstandskombinationen zu spielen, um zu sehen, können das Berechnungsblatt herunterladen (als Open-office-Format. Als Excel-XP-Format).
Hinweise für die AD-Wandler-Hardware
ATtiny Geräte in den meisten Fällen bieten die Möglichkeit, nur eine intern erzeugte Spannung oder die Versorgungsspannung des AVR als Referenz für den AD-Wandler zu verwenden. Für die Tastatur Umwandlung ist nur die Versorgungsspannung als Referenz geeignet. Diese Option muss gewählt werden, wenn die AD-Wandler-Hardware beim Programmstart zu initiieren.
Viele Typen ATmega kann die Referenzspannung an einen externen Pin, AREF verbinden. Dieser Stift kann entweder ein- oder ausgegeben werden. Es ist ein Ausgang, wenn entweder die Versorgungsspannung oder die interne Referenz als AD-Wandler Referenz ausgewählt ist. In diesem Fall sollte der AREF Stift einen Kondensator muss Grundrauschen auf der Referenzspannung weiter zu verringern. Der AREF Pin ist ein Eingang, wenn eine externe Referenzquelle als Option ausgewählt ist. In diesem Fall ist eine externe Quelle liefert die Referenzspannung. Wenn eine externe Quelle der Referenzspannung liefert, soll die Tastaturmatrix auch von dieser Quelle zugeführt werden. Beachten Sie in diesem Fall, dass die Tastatur bis zu 10 mA verbraucht, Geräuschempfindlichkeit zu verbessern.
ATMEGA Geräte ermöglichen den AD-Wandler von einem zusätzlichen Stift (AVCC) zu liefern, um weitere Rauschen zu reduzieren. Wenn nur das Tastenfeld AD-Wandlung die niedrige erforderliche Auflösung von 8 Bits verwendet, keine separate Versorgung des AVCC Stift erforderlich ist, kann es auf die normale Versorgungsspannung verbunden werden. Wenn andere Messaufgaben auf anderen Kanälen durchgeführt werden müssen, sollte der AVCC Stift über eine Spule von 22 & mgr; H an die Versorgungsspannung angeschlossen werden und soll von einem Kondensator von 100 nF blockiert werden zu erden.
Initiierung und Lesen des AD-Wandler Ergebnis
Für die Tastaturmatrix Spannung einen AD-Wandler Kanal Lesen erforderlich ist. Der AD-Wandler wird eingeleitet, sobald beim Programmstart. Die beiden Beispiele zeigen die Startsequenz für einzelne Konvertierung, hier für einen ATmega8 und einer für ein Interrupt automatischen Start des ADC angetrieben, hier für einen ATtiny13.
ATmega8: manueller Start des ADC
Das erste Beispiel zeigt eine Routine für einen ATmega8, ohne Unterbrechungen, mit einem manuellen Start und Stopp des der AD-Wandlers. Das Tastenfeld-Signal wird an AD Kanal ADC0 verbunden. Bitte beachten Sie, dass diese einzelne Umwandlung 25 * 128 Taktzyklen erfordert, bei 1 Mcs / s Uhr 3,2 Milli-Sekunden. Nur tun, dass die Art und Weise dies, läuft im Kreis herum, wenn Sie für andere Dinge nicht zwischen dieser Zeitverzögerung müssen kümmern (es sei denn, diese anderen Dinge sind innerhalb Unterbrechungen durchgeführt).
ATtiny13: Autostart-AD-Wandlung, Interrupt-driven
Ja, ein ATtiny13 mit 8 Pins können unsere Tastaturmatrix (wir können nicht schließen Sie die Tastaturmatrix selbst aufgrund der begrenzten Anzahl von I / O-Pins) lesen.
Eine typische Routine für diese Aufgabe wäre die folgende Sequenz sein, dass die Spannung an ADC3 umwandelt (Pin 2 des ATtiny13) kontinuierlich (nach der Umwandlung abgeschlossen ist, die nächste Umwandlung wird automatisch gestartet). Läuft im Unterbrechungsmodus erfordert die Definition der jeweiligen int Sprungvektor, z.B. Natürlich muss der Stapel eingeleitet wird Interrupts zu verwenden, und der Interrupt-Status-Flag muss (SEI) eingestellt werden.
Die Serviceroutine intadc liest das AD-Wandlungsergebnis. Da Left-Adjust ausgewählt wurde, genügt es, das MSB des Ergebnisses zu erhalten: Das Register RKEY kontinuierlich den aktuellen Wert der Widerstandsmatrix liefert.
Die Umwandlung des AD Ergebnis an den Schlüsselcode
Das Wandlungsergebnis ist als solche nicht sehr nützlich. Die Spannungen und das Umwandlungsergebnis nicht leicht mathematischen Gesetzen folgen (die Widerstandswerte von 4,7 bis 5,6 - 6,8-8,2 muss von einem betrunkenen Mathematik-Professor entworfen worden sind, die Formel V = R1 / (R1 + R2) ist nicht sehr einfach zu handhaben ), so dass wir besser einen Tisch verwenden unsere Schlüsselcodes zu lösen. Die Tabelle kann nicht eine primitive Look-up-Tabelle, weil wir 256 verschiedene mögliche Ergebnisse der Konvertierung haben, und wir möchten schlanke Tabellen.
Wie ein Affe, klettern wir die Matrix Baum Schritt für Schritt durch die folgende Tabelle gehen: Das erste Byte ist der Vergleichswert für unser Umwandlungsergebnis, das zweite Byte der Schlüsselcode ist, wenn dieser Wert vergleichen, ist größer als unser Ergebnis. Wenn das Ergebnis zwischen 0 und <7: no key is pressed (key code is 255), if it is between 7 and <18 the key code is 1, etc.
Oder, wenn Sie ASCII für die Tastencodes bevorzugen: Der Code für Schlüssel Übersetzung lautet: Natürlich müssen wir überprüfen, wenn keine Taste gedrückt wird (R0 = 0xFF bzw. wenn ASCII:. R0 = 0), und wir müssen prüfen, für Pannen (wenn der gleiche Tastencode 20 oder mehr mal kommt, nehme ich es für ernst.).
Erfahrungen
Die Hard- und Software arbeitet sehr zuverlässig. In der ersten Version waren die Widerstandswerte der Matrix zehnmal höher. Diese Version war anfälliger für HF Rauschen, z.B. wenn in der Nähe mit einem 2 W VHF-Sender übertragen.