|
So schön geht AVISE
|
.
.
.
Avise ist eine FORTH-Variante, die von Herrn W. Schemmert (Fa. CINETIX, Frankfurt) für verschiedene AVR-Prozessoren von ATMEL entwickelt wurde. Aktuell ist die Version AVISE4.3, die kostenlos von der Firma CINETIX herunter geladen werden kann.
Solche Prozessoren wurden am Friedrich-Koenig-Gymnasium Würzburg für einen Robotik-Kurs und als Messinterface für physikalische Schülerversuche eingesetzt. Wegen ihrer geringen Kosten stand je zwei Schülern ein Messinterface zur Verfügung. Während im Robotik-Kurs AVISE von den Schülern zum Programmieren ihrer Roboter eingesetzt wurde, liegen für das vorgeschlagene Messinterface fertige Software-Lösungen vor, die aber beliebig modifiziert oder ergänzt werden können. Die so programmierten Messinterfaces können von bestimmten PC-Programmen bedient und programmiert werden.
AVISE ist wie FORTH zugleich eine Compiler- und Interpreter-Sprache. Sie ist eine Hochsprache, aber doch auch sehr maschinennahe. Sie wird einmalig in den Flash-Speicher des Prozessors geladen und steht dann im Interpreter-Modus und im Compiler-Modus zur Verfügung. Interpreter-Modus bedeutet u.a., dass Befehle, die hier Worte genannt werden, über die Tastatur eines PCs gestartet werden können. Ein Terminalprogramm schickt das Ausführungskommando über eine serielle Schnittstelle (USB-Schnittstelle) an den Prozessor, der nach Ausführung eine OK-Meldung an das Terminalprogramm zurücksendet. Im Compiler-Modus können z.B. über die PC-Tastatur, neue Worte eingegeben werden, die im Prozessor compiliert werden und als neue Worte zur Verfügung stehen. Mit Hilfe eines Terminalprogramms ATOOL33, ebenfalls von Herrn Schemmert entwickelt, können ganze txt-Dateien mit dem Source-Code an den Mikroprozessor geschickt und dort in den Flash-Speicher compiliert werden.
Hier eine Übersicht über die in AVISE4.1 bzw. AVISE4.3 enthaltenen Grundworte.
Eine typische Eigenart der meisten FORTH-Varianten wie auch von AVISE ist die umgekehrte polnische Notation, die manche vielleicht noch von den ersten Taschenrechnern her kennen. Will man zwei Zahlen addieren, subtrahieren, multiplizieren, ... oder bitweise verknüpfen, muss man beide Zahlen erst auf den Stapel (stack) legen, z.B. durch Eingabe über die PC-Tastatur. Dann erst wird die Rechenoperation eingeben. Der Prozessor nimmt beide Eingabewerte vom Stapelspeicher, verarbeitet sie und legt das Ergebnis wieder auf den Stapel. Von dort können sie durch Eingabe eines Punktes ( . ) weggenommen und an den PC gesandt werden. Ein Beispiel:
$ 40 & 64 + . <enter>
Tippt man diese Zeichenfolge am PC ein, so erscheint im Fenster des Terminalprogramms 128 OK. Das stimmt ja auch, denn $ sagt: Benutze von jetzt ab Hexadezimalzahlen. Also 40(16) = 64(10). & sagt dem Prozessor: Benutze von jetzt ab Dezimalzahlen. Weil die Zahlenbasis nicht mehr geändert wird, ist auch das Ergebnis als Dezimalzahl zu interpretieren. Zum Glück ist durch den Punkt ( . ) das Ergebnis der Rechnung vom Stapel entfernt worden. Der Programmierer muss immer darauf achten, dass der Stapel "ausgeglichen" bleibt.
Mit Rücksicht auf den beschränkten Speicher im Mikroprozessor arbeitet AVISE ohne Tricks mit 2-Byte-Worten; bestimmte Worte arbeiten auch mit Einzel-Bytes. In der Regel muss man sich auf Integer-Zahlen von 0 bis FFFF beschränken. Für alle Sensoren und Aktoren reicht das vollkommen aus.
Ein neues Wort PLUS wird so definiert:
: PLUS & + . RET
Der Doppelpunkt sagt: Compiliere das Wort PLUS in den Flash-Speicher. Es umfasst alle Wort bis RET. Die Compilation beginnt, wenn Sie die Wortfolge vom Doppelpunkt bis RET mit der <enter>-Taste an den Mikroprozessor geschickt haben. & schaltet wieder in den Dezimalmodus um, d.h. ganz gleich, in welchem Modus Sie die Summanden auf den Stapel gelegt haben, das Ergebnis wird im Dezimal-Modus sein. Sie nutzen das Wort z.B. so:
$ FF B0 PLUS <enter> und erhalten auf dem Bildschirm 431 OK. Stimmt ja auch, denn die Eingabewerte sind Hexadezimalzahlen, also FF = 255(10) und B0 = 176(10). Das Ergebnis 255 + 176 = 431 ist eine Dezimalzahl.
Die verwendeten Prozessoren haben bis zu 8 AD-Wandler mit 10-Bit Auflösung. Sie liefern also Werte von 0 bis 1023. Wenn eine Referenzspannung von 5 V eingestellt ist, bedeutet das Messergebnis 0 dann 0 V, das Messergebnis 3FF=1023(10) bedeutet 5 V * 1023/1024 = 4, 995 V. Eine Messung ist geradezu primitiv: Sie geben über die Tastatur ein:
0 AIN . <enter>
und erhalten auf dem Bildschirm z.B. 1FF OK . Es wurde also eine Spannung 5 V * 511/1024 = 2,495 gemessen. Sie wollen sie vielleicht gleich in mV ausgeben? Also, wobei wir gleich ein neues Wort definieren wollen:
: MISS & AIN 5000 1024 */ . . RET
Wir schalten wieder in den Dezimalmodus um AIN legt das Messergebnis auf den Stapel, darüber kommen noch 5000 und 1024, und */ führt die gewünschte Rechnung durch. Das Ergebnis ist eigentlich von 32 Bit Genauigkeit. Die obersten 16 Bit sind allerdings 0, d.h. der erste "Druck"befehl könnte auch durch DROP ersetzt, die 0 so vom Stapel entfernt werden:
: MISS & AIN 5000 1024 */ DROP . RET
Aber es fehlt doch noch die Angabe des Kanals?! Natürlich, sie muss vor dem Aufruf von MISS auf den Stapel gelegt werden. Eine Messung auf Kanal 1 wird jetzt also so durchgeführt:
1 MISS <enter>
und auf dem Bildschirm erscheint z.B. 2495 OK.
Damit folgende Messergebnisse immer in eine neue Zeile geschrieben werden, lassen wir mit dem Druckbefehl noch ein Vorschubzeichen (D=13(10)) vom Prozessor senden (mit EMIT). Dann lautet MISS:
: MISS $ AIN 5000 1024 */ DROP . 13 EMIT RET
Es wäre mühsam, bei vielen Messungen immer den Messbefehl mit der Hand einzugeben. Also definieren wir ein Wort IMMERWIEDER, das misst und misst, bis Sie irgendeine Taste drücken. Das geht so:
: IMMERWIEDER BEGIN 0 MISS KEY? UNTIL DROP RET
Neu ist also die Schleife, die mit BEGIN anfängt und mit UNTIL endet. In der Schleife steht der Messbefehl, jeweils mit der Kanalangabe, und KEY?. KEY? fragt ab, ob eine Taste gedrückt wurde. Wenn nein, hinterlässt sie auf dem Stapel ein FALSE-Flag. Darauf reagiert das Wort UNTIL, nimmt das Flag vom Stapel und führt einen Sprung zum Anfang der Schleife aus. Es wird erneut gemessen. Wurde aber eine Taste gedrückt, wird der Code der Taste auf den Stapel gelegt, und darüber ein TRUE-Flag. UNTIL reagiert darauf, indem es die Schleife beendet. Dann liegt aber noch der Code der gedrückten Taste auf dem Stapel. Damit dieser nicht irgendwann überläuft, wird das oberste Stapelelement mit DROP entfernt. Die Farben wurden hier nur zur Verdeutlichung eingefügt. Wahrlich einfach!
Geben Sie IMMERWIEDER <enter> ein, und Sie erhalten Tausende von Messwerten in mV untereinander, wenn Sie nicht eine beliebige Taste drücken. Das Wort kann leider nur auf Kanal 0 messen. Wir wollen es verallgemeinern, so dass wir mit 6 IMMERWIEDER z.B. auf Kanal 6 messen und mit 4 IMMERWIEDER auf Kanal 4.
: IMMERWIEDER BEGIN DUP MISS KEY? UNTIL DROP DROP RET
Mit DUP wird die Kanalnummer auf dem Stapel ein zweites Mal darüber gelegt. Denn mit der ersten Messung ist die oberste Kanalnummer wieder entfernt. Aber für den nächsten Schleifendurchgang ist sie noch einmal vorhanden und wird wieder ein zweites Mal auf den Stapel gelegt, usw. Wenn aber eine Taste gedrückt wurde, muss erstens der Tastencode entfernt werden, und dann die Kanalnummer. Deswegen DROP DROP.
Alle mit dem Doppelpunkt definierten Worte sind durch die Compilation Teile des Wortschatzes von AVISE geworden und stehen zur Verfügung, bis Sie sie löschen, oder bis der Prozessor seinen Geist aufgibt. Und einfacher geht's wirklich nicht!
Ansteuerung von Ports durch AVISE-FORTH (AVISE4.3)
Wir programmieren ein Lauflicht mit AVISE4.3
Wir erzeugen Rechteckssignale einer wählbaren Frequenz mit AVISE4.3
Wir arbeiten in AVISE4.3 mit Pulsweitenmodulatoren und Servomotoren
Wir programmieren die Ansteuerung eines Schrittmotors mit AVISE4.3
Wir kommunizieren mit einem seriellen EEPROM (z.B. 24C256) über den I2C-Bus
Schäden werden bei sachgemäßem Umgang nicht erwartet.
Dennoch wird keinerlei Haftung übernommen, z.B. bzgl. Gefährdung
der Prozessoren, der PCs und vor allem der mit dem System experimentierenden
Personen.
Ein Haftungsausschluss von Herrn Schemmert wird hier einkopiert:
|
(zuletzt aktualisiert 2013)