"Betriebssystem" für Atmel Tiny 24 Controller mit genauer Echtzeituhr und über RS232 programmierbarer Schaltuhr
Wenn man öfters kleine Programme für die Atmel Mikrocontroller schreibt, wünscht man sich schnell eine einfache Umgebung, um diese zu testen und zu debuggen. Hier ein kleines Betriebssystem für Atmel Controller, welches eine RS232 Shell mit einfachem Kommandointerpreter zur Verfügung stellt. Damit kann der Controller an die Serielle Schnittstelle oder USB (über Konverter) angeschlossen werden und über einfache Kommandos und einem Terminalprogramm (z.B. Hyperterm) können dann Befehle oder eigene Unterprogramme aufgerufen werden.
Da die Tiny24 keine Hardware UART eingebaut haben, wurde eine Full Duplex Software UART implementiert, welche transparent über Timer-Interrupts im Hintergrund läuft. Das Senden und Emfangen geschieht dabei über FIFO Ringpuffer, um schnelle und Sichere Zeichenübergabe zu ermöglichen.
Das Betriebssystem verwendet 3 Ebenen für seine Prozesse:
Auf Interrupt-Ebene werden nur die Low-Level Funktionen für UART und Uhr ausgeführt. Wenn während eines Interrupts ein Ereignis aufgetreten ist, welches einer längeren Bearbeitungszeit bedarf, wird dieses per Message-Queue an die 2. Ebene gemeldet.
Die 2. Ebene befindet sich eigentlich immer im Sleep Modus. Wenn ein Intrrupt aufgetreten ist, prüft die 2. Ebene ob ein Ereignis in der Message-Queue vorliegt (z.B. ein Sekundenüberlauf der Uhr) und führt dann einen entsprechenden Messagehandler aus.
Wenn die 2. Ebene eine vollständige Eingabezeile erhalten hat (also nach einem Carriage Return #13) prüft sie den Puffer für die Eingabezeile auf bekannte Kommandos. Wurde ein Kommando erkannt, ermittelt der Kommandozeileninterpreter die zugehörige Startadresse des Kommandos aus einer Tabelle und ruft dieses Programm auf.
Eigene Unterprogramme können sehr leicht als Kommandos eingebaut werden, es muss nur der Klartextbefehl (max. 4 Zeichen aus Platzgründen, kann aber leicht erweitert werden) sowie die Startadresse der eigenen Routine in 2 Tabellen eingetragen werden. Schon kann man bequem über eine RS232 Shell seine eigenen Programme aufrufen und auch Ausgaben des Controllers sehen.
Auch besteht die Möglichkeit, hinter dem Befehl verschiedene Parameter mit anzugeben, z.B. Hex Zahlen oder Dezimalzahlen. über einen Token-Parser können diese Parameter dann vom jeweiligen Befehl gelesen und interpretiert werden.
Als kleine Testanwendung rund um den Befehlsinterpreter ist eine kleine (Schalt) Uhr entstanden. Sie kann vollständig über RS232 programmiert und gelesen werden. Das besondere daran ist, dass auch eigene Befehle leicht implementiert und von der Schaltuhr ausgeführt werden können.
Momentan werden folgende Befehle unterstützt:
Befehl | Funktion | Syntax | Parameter | Beispiel |
RST | Reset | RST | RST | |
time | gibt die aktuelle Uhrzeit im Format hh:mi:ss dd.mm.yy aus | time | time | |
stop | haelt die Uhr an | stop | stop | |
start | startet die Uhr | start | start | |
sclk | stellt die Startzeit der Uhr ein | sclk hh mi ss dd mm yy | Uhrzeit, Datum | sclk 12 00 00 01 01 08 |
salm | (Set Alarm) trägt einen Alarm ein | salm hh mi ss dd mm yy cn a |
cn = Kommando Nr a = Alarm Nummer 0 bis 7 |
salm 12 30 00 01 01 08 04 0 |
calm | Loescht einen Alarm | calm a | a= Alarm Nummer 0 bis 7 | calm 0 |
on1 | Schaltfunktion ON1 | |||
on2 | ||||
off1 | ||||
off2 | ||||
show | Zeigt die Alarmtabelle sowie die Uhrenstartzeit an | show | show | |
xtal | setzt den Korrekturfaktor fuer den Quarz | xtal hi md lo |
hi=High-Byte der Takte pro Sekunde (hexadezimal) md=Mid-Byte der Takte pro Sekunde (hexadezimal) lo=Low-Byte der Takte pro Sekunde (hexadezimal) |
xtal 38 40 00 |
Hier der Quellcode zum Download.