Pfad:
Home =>
AVR-DE =>
Anwendungen =>
Schalter und Tasten am ADC =>
Tastenfelder => Tastenfelder mit avr_sim
This page in English:
 |
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.
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.
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.
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.
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.
Der Button "Show picture" zeigt uns den Typ in seiner
eingestellten Verpackung an.
Mit "Ok" verlassen wir diesen Dialog.
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.
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 bietet folgende Möglichkeiten für
Einstellungen:
- Die ADC-Referenzspannung kann beliebig eingestellt werden.
- Die Betriebsspannung kann ebenfalls beliebig eingestellt werden.
- Wählt man einen ADC-Kanal aus dem Ausklappfeld aus, kann
dessen Spannung im Editierfeld eingegeben werden.
- Mit dem Auswahlfeld "Show R-Matrix" kriegt man das
Widerstandsmatrixfenster angezeigt.
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).
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
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.
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.
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.
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.
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