Pfad: Home => AVR-DE => Anwendungen => Schalter und Tasten am ADC => Tastenfelder => Tastenfelder mit avr_sim   This page in English: Flag EN Logo
Tastenfeld Anwendungen von
AVR-Einchip-Mikrokontrollern AT90S, ATtiny, ATmega und ATxmega
Tastenfelder mit avr_sim berechnen

12/16-er-Tastatur mit avr_sim berechnen

Es gibt viele Varianten, den Anschluss einer 12-er- oder 16-er-Tastatur an einen AVR-ADC-Eingang zu gestalten und zu berechnen. Hier gibt es eine zusätzliche Variante: man erledigt das mit dem AVR-Simulator avr_sim, und zwar mit einer Version ab 2.7 aufwärts.

Starten von avr_sim

Zu allererst braucht man avr_sim. Das kriegt man entweder als fertig kompilierte Version für 64-Bit-Linux oder -Windows oder als Pascal-Quellcode für Lazarus zum Selberkompilieren. Bei der fertig kompilierten Version reicht es, den gezippten Download auszupacken und die ausführbare Datei zu starten. Wie man den Quellcode selbst kompiliert, steht im zugehörigen Handbuch zu der Quelltext-Datei ausführlicher beschrieben.

Startet man avr_sim erstmalig, wird man nach einem Ordner gefragt, in dem AVR Assembler-Dateien bevorzugt abgelegt sind. Hat man so was nicht, kann man es neu anlegen. Beim weiteren Starten von avr_sim wird man das nicht erneut gefragt.

Menue beim Start von avr_sim Im Menue "Project" startet man ein neues Projekt mit "New". Wenn wir das schon angelegte Projekt später erneut öffnen wollen, brauchen wir nur den Menuepunkt "Open previous" zu betätigen und können aus den gespeicherten Projekten eins auswählen.

Das Projektfenster fuer ein neues Projekt Daraufhin öffnet sich dieses Fenster. Wir tragen nacheinander einen Projektnamen ein, wählen durch Klicken in das Editierfeld einen Ordner für das neue Projekt aus, stellen die Version mit den beiden Auswahlfeldern auf "Short version" und "Linear program" ein und klicken dann auf den Button "Device selector". Wenn wir schon wissen, in welchem AVR-Typ wir die Tastenmatrix betreiben wollen, können wir den Typ auch mit den beiden Ausklappfeldern links davon auswählen und brauchen den Device- Selektor dann nicht.

Auswahl des AVR-Typs Mit dem Device-Selektor markieren wir aus dem ADC-Ausklappfeld einen ADC-Kanal, an dem die Matrix später mal hängen soll.

Aus der großen Vielfalt angebotener AVR-Typen können wir im mittleren Typenfenster einen Typ auswählen, den wir dann mit seiner Anschlussbelegung auch im rechten Fenster sehen. In dem Fenster mit der Anschlussbelegung ist nun ein ADC-Kanal in Kleinbuchstaben mit Adc_ markiert.

Mit dem Button "Save" können wir diese Anschlussbelegung speichern und mit "Ok" die Auswahl bestätigen.

Auswahl der AVR-Packung Bei manchen Typen gibt es mehr als eine Packungsart. Dann wird gefragt, ob wir ein anderes IC-Gehäuse haben wollen. Das können wir mit den drei Radioknöpfen einstellen.

Bild des AVR-Typs Der Button "Show picture" zeigt uns den Typ in seiner eingestellten Verpackung an.

Mit "Ok" verlassen wir diesen Dialog.

Der Editor Nun hat avr_sim ein erstes kurzes Korsett eines Assemblerprogramms gebastelt und zeigt uns dies im Editor an. Darin können wir nach Belieben herumschmieren und Kommentare ändern oder mit der Taste F2 unsere gespeicherte Pinbelegung einfügen.

Irgendwann wollen wir dann aber das Geschriebene assemblieren und drücken daher diesen Menueeintrag.

War das erfolgreich, müsste nun der zusätzliche Menueeintrag "Simulate" auftauchen.

Das Simulatorfenster Wenn wir das gedrückt haben, kriegen wir das Simulatorfenster. Hier markieren wir unter "Show internal hardware" den Knopf für die Ansicht des AD-Wandlers.

Das ADC-Fenster Das ADC-Fenster bietet folgende Möglichkeiten für Einstellungen: Bei allen Eingaben wird das Eingabefeld gelb hinterlegt, mit der Taste Enter wird die Zahl übernommen. Zahlen sind in angelsächsischer Notation einzugeben, sonst gibt es Fehlermeldungen (ein rot hinterlegtes Eingabefeld).

Die Widerstandsmatrix Hat man das Auswahlfeld angeklickt, zeigt sich dieses hier. Darin kann man nun beliebig herumklicken, die Einträge sind fast selbsterklärend. Wer mehr wissen möchte, schaut sich im Handbuch von avr_sim das betreffende Unterkapitel an. Dort ist auch erklärt, was das Auswahlfeld "Use int. VRef" macht und was man mit "View data table" und "View voltages", durch Klicken auf die angezeigten Tasten der Tastenfelder sowie durch Klicken auf die Widerstände kriegt.

Mit dem ADC eine Tastenspannung auslesen

In die erzeugte Quellcode-Vorlage bringen wir nun folgende Zeilen an Code ein:

Main:
  ; Set the ADLAR bit to enable 8-bit conversion,
  ; note that the ADLAR bit in a tiny13 is in the ADMUX
  ; port register, other devices place this bit elsewhere
  ldi rmp,(1<<ADLAR)|(1<<MUX1) ; 8-bit ADC, select ADC channel input
  out ADMUX,rmp
  ; Enable the ADC, start conversion, AD prescaler = 128
  ldi rmp,(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
  out ADCSRA,rmp
WaitAdc:
  sbic ADCSRA,ADSC ; Wait for ADSC bit to get clear
  rjmp WaitAdc ; ADSC bit not yet cleared, continue waiting
  in rmp,ADCH ; Read the MSB of the result
Loop:
  rjmp loop

Simulation des Wandlungsprozesses Aktive AD-Wandlung Wenn wir das nun assemblieren und im Simulator starten, in die Zeile mit "rjmp loop" einen Breakpoint setzen (in die linke Gutter-Area dieser Zeile klicken) und das Ganze mit Einzelschritten oder mit "Run/Go" laufen lassen, kriegen wir den Wandlungsprozess im ADC-Fenster angezeigt.

Zeit der Umwandlung Da unser Takt durch 128 geteilt wird, braucht es 1,39 Millisekunden, bis der ADC fertig ist und das Ergebnis im Register R16 ankommt: eine Null. Natürlich kam da eine Null heraus, weil wir die Spannung am ADC1-Eingang noch gar nicht gesetzt hatten.

16-Tasten mit R-Matrix Wenn wir nun die R-Matrix anzeigen lassen, sie auf 16-Bit einstellen, die vertikalen Widerstände nach Plus einzeln wählen, ein Prozent wird automatisch eingestellt und mehrfach "Optimize" drücken, gehen hoffentlich alle Overlaps auf Null und wenn wir nun auf die Eins in der Schaltbild-Darstellung klicken, kriegen wir die 571,1 mV auch an den ADC1-Eingang im ADC-Fenster übertragen. Die Tabelle sagt dazu, dass beim 8-Bit-Wandeln nun ein Ergebnis von 29 herauskommen sollte.

AD-Wandlung einer gedrückten Eins In der Tat: das korrekte Ergebnis der Wandlung kommt auch heraus. Nun stellt sich allerdings die Frage, wie man von der 29 auf die Taste 1 kommt.

Tabellen in der Include-Datei Dazu klicken wir auf irgendeinen der Widerstandswerte und kriegen die Meldung, dass eine Include-Datei mit der Widerstandsmatrix erzeugt wurde. Diese fügen wir mit der Zeile ".include "resistormatrix.inc" hinter der Zeile "rjmp loop" in den Quellcode ein.

Das bringt uns in den Besitz zweier Tabellen: die erste heißt "KeyTable:" und enthält den unteren und den oberen Wert des ADC für alle 16 Tasten. Sie schließt mit dem Label "KeyTableEnd:" ab.

Die zweite Tabelle mit Namen "Keys:" enthält alle Tasten in der korrekten Spannungsreihung als ASCII-Zeichen.

Mit diesen beiden Tabellen lässt sich nun ein famoses Übersetzungsprogramm basteln, mit dem die ADC-Werte in Tastenbeschriftungen übersetzt werden können. Das Programm dafür ist ganze 34 Zeilen lang und findet sich hier, es benötigt natürlich eine funktionierende Include-Datei "keymatrix.inc". Das zugehörige Flussdiagramm findet sich im Handbuch von avr_sim.

Das Umschreiben für einen anderen AVR-Typ dürfte ein Leichtes sein. Obacht, Arduino-Sozialisierte: beim ATmega328 sind die AD-Wandler-Portregister nicht mehr mit IN und OUT zugänglich, weil sie oberhalb der Adressgrenze liegen.

Auch das Umstellen von der langwierigen Polling-Prozedur auf Interrupts dürfte ein Leichtes sein.

Etwas anspruchsvoller dürfte das Entprellen ausfallen. Hier hilft es, dass es pro AD-Wandlung schon mal ein paar Millisekunden dauert. Bleibt die gedrückte Taste acht Mal diesselbe, dann ist es tatsächlich diese, die gedrückt ist. Dann muss man nur noch noch abwarten, bis die Tasten weitere acht mal mit einer Null zurückkommen.

Und jetzt: Viel Erfolg beim sukzessiven Annäherungsgeschehen.

An den Seitenanfang

©2022 by http://www.avr-asm-tutorial.net