| 28.10.2007 | ||
CLI (Command Line Interface) | ||
Inhalt:
Motivation:Für die folgenden Projekte mit dem Atmel μC und zur schnelleren Fehlersuche vor allem in Assemblerprogrammen brauchte ich erstmal eine vernünftige Möglichkeit, interne Daten (Registerwerte, Zustandswerte, etc.) anzeigen zu lassen. Und für z.B. eine Motorsteuerung möchte ich als von der bash-Shell verwöhnter Linux-User auch Befehle eingeben können (Bsp. Motor einschalten) und ein Ergebnis als Output zurückbekommen.
Die einfachste Lösung für die eben geschilderte
Problemstellung findet man unter dem Begriff "Command
Line Interface (CLI)" zusammengefaßt, wofür
sich die serielle Schnittstelle zur Kommunikation zwischen
Microcontroller und PC anbietet (man kann natürlich auch
eine LCD-Anzeige und Keyboardeingabe implementieren, wenn einem
das nicht genügt ;-). Der ATtiny2313 ist erfreulicherweise
mit einem "Full Duplex USART" (USART - Universal
Synchronous and Asynchronous serial Receiver and Transmitter)
ausgestattet.
Auf dem PC gibt es für die Kommunikation über den Serial-Port genügend Tools, z.B. unter Linux das minimalistische picocom oder das etwas komfortablere minicom. Unter Windows kann man das Hyperterminal z.B. auf Serial-Port COM1 verwenden. Bevor man den Serial-Port auf dem Atmel μC benutzen kann, muß man zuerst den USART-Baustein initialisieren, d.h. die Baudrate konfigurieren, Frame-Format festlegen und Receiver/ Transmitter aktivieren. Dann kann man die Interrupts freischalten (RX Complete Interrupt Enable und Global Interrupt Flag), wenn man jedes empfangene Byte Interrupt-gesteuert auswerten möchte. Als Baudrate ist 9600 (Bits/sec) üblich. Der Standard für das Frame-Format ist 8N1, d.h. 8 Data bits, no Parity bit, 1 Stop bit. Die genaue Prozedur kann man im ATtiny2313-Manual, Seite 115 ff. nachlesen.
Das fertige Assembler-Programm für die echo-Funktion ist
hier:
Dazu gehört noch die Include-Datei mit den Definitionen der
Register und Bitvalues vom ATtiny2313 (für den
Und wie immer das Makefile dazu:
Das Makefile ist inzwischen auch etwas umfangreicher
geworden. Ein Dann habe ich zusammen mit meinem Kollegen die Receive- und Transmit-Leitungen vom Serial-Port mit einem Oszi durchgemessen und festgestellt, daß nur ein Rx-Interrupt ausgelöst wurde. Schließch hatte er die zündende Idee, daß der Atmel-μC einen internen Oszillator hat, der standardmäßig eingeschaltet ist. Ich hatte erwartet, daß der Atmel-μC automatisch mit dem externen Quarz getaktet wird, wenn der an XTAL1 und XTAL2 angeschlossen wird, was bei dem μPSD der Fall war, mit dem ich vorher experimentiert hatte. Das war aber nur die halbe Miete. Der interne Oszillator hatte nämlich auch die Frequenz 8Mhz. Daran lag es also nicht unbedingt. Wie sich herausstellte, gibt es noch einen Takt-Teiler, der defaultmäßig eingeschaltet ist und den Wert 8 hat! Damit konnte natürlich nichts mit dem USART funktionieren, denn der hatte damit eine Baudrate von 9600/8.
Im Manual
(Seite 24 ff., System Clock and Clock options), fand sich dann
der Hinweis, wo man auf den externen Quarz umschalten (CKSEL3:0 &
CKOUT) und den Takt-Teiler (CKDIV8) umstellen konnte: im Flash
Fuse Low Byte, das man mit dem make init_chip /home/akagisan/uC/tools/uisp/uisp-20050207/src/uisp -dprog=dasa2 -dserial=/dev/ttyS0 --wr_fuse_l=0xef Atmel AVR ATtiny2313 is found. Fuse Low Byte set to 0xefMit uisp --rd_fuses kann man die Werte aus den Flash
Fuses auch auslesen, das habe ich im Makefile ins Target
show_fuses geschrieben:
make show_fuses
/home/akagisan/uC/tools/uisp/uisp-20050207/src/uisp -dprog=dasa2 -dserial=/dev/ttyS0 --rd_fuses
Atmel AVR ATtiny2313 is found.
Fuse Low Byte = 0xef
Fuse High Byte = 0xdf
Fuse Extended Byte = 0xff
Calibration Byte = 0x54 -- Read Only
Lock Bits = 0xff
BLB12 -> 1
BLB11 -> 1
BLB02 -> 1
BLB01 -> 1
LB2 -> 1
LB1 -> 1
Also eine Menge Stolperfallen, die einem in den Weg gelegt
werden, wenn man sich das erste Mal mit dem Atmel
beschäftigt. Aber jetzt war der Weg frei, um ein
Command-Line-Interface für den Serial-Port zu realisieren.
CLI am Serial-Port:Ich habe mich dafür entschieden, die CLI (usart-cli.asm) in Assembler und nicht in C zu schreiben, da ich mir ausmalen konnte, daß der Code viel umfangreicher als bei echo-Funktion werden würde, und beim ATtiny2313 nur 2KB Flash als Programm-Speicher zur Verfügung stehen. Bei der Erweiterung des Befehlsumfangs der CLI würde der Code sicher schnell an die Grenzen des Flash-Speichers stoßen (OK, ich könnte auch einfach auf einen anderen Atmel μC mit mehr Flash umsteigen, z.b. ATmega). Außerdem wollte ich noch etwas mehr vom Assembler kennenlernen.Dann mußte ich mir noch über den Funktionsumfang der CLI klarwerden. Nach einem Reset sollte ein Header-Text mit einer kurzen Identifikation, der Versionsnummer, dem Autor (ich!) und einem Prompt in der folgenden Zeile ausgegeben werden, z.B.: Atmel Evaluations-Board by Pollin, Version 2.0 Atmel AVR ATtiny2313 console, version 0.1 written by Thomas Hoehn, Erding, 10/2007 cli >Die Eingabezeile (Command Line) wird auf 48 Zeichen begrenzt (reicht aus, Variable INPUT_BUF_LEN), danach stoppt die Eingabe. Eine minimale Editier-Funktion wird mit dem Backspace-Key geboten, der das letzte Zeichen löscht, bis zum Anfang der Eingabezeile. Mit Enter wird die Eingabe abgeschlossen und der eingegebene Befehl ausgewertet. Ist der Befehl nicht implementiert, wird eine Fehlermeldung ausgegeben. Nur 3 Commands werden hier implementiert:
bcd-convert.inc (leicht
modifizierte Version von konvert.asm,
Quelle: www.avr-asm-tutorial.net)
ist notwendig für den sysinfo-Befehl zur Umwandlung der
Hex-Werte für SRAM/EEPROM/Flash-Size in Dezimal-Werte.
Der assemblierte Programmcode (Hexcode) ist nun bereits auf 1KB
angewachsen, belegt also die Hälfte vom verfügbaren
Flash-Speicher! Segment usage: Code : 536 words (1072 bytes) Data : 60 bytes EEPROM : 0 bytesHier der Output von einem Test der CLI mit picocom, das über /dev/ttyUSB0 (USB/Serial-Adapter) mit dem
Atmel-Board kommuniziert:
akagisan@kobe:~/uC/atmel/projects/usart-cli$ picocom /dev/ttyUSB0
picocom v1.4
port is : /dev/ttyUSB0
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
escape is : C-a
noinit is : no
noreset is : no
nolock is : no
send_cmd is : ascii_xfr -s -v -l10
receive_cmd is : rz -vv
Terminal ready
Atmel Evaluations-Board by Pollin, Version 2.0
Atmel AVR ATtiny2313 console, version 0.1
written by Thomas Hoehn, Erding, 10/2007
cli >
cli > foobar
Error: unknown command. Type 'help' for available commands.
cli > help
Available commands: sysinfo, help, led1
cli > sysinfo
System info:
Device: ATtiny2313
Flash: 2048 Byte
SRAM: 128 Byte
EEPROM: 128 Byte
f_osc: 8Mhz
cli >
Thanks for using picocom
akagisan@kobe:~/uC/atmel/projects/usart-cli$
Erweiterung der CLI:Weitere Befehle für die Command-Line lassen sich mit wenig Aufwand hinzufügen. Man muß dafür nur folgendes inusart-cli.asm ändern/hinzufügen:
|