<texit info> author=Bernd Paysan title=Gforth EC R8C </texit>
In der Dezember-Ausgabe der Elektor wurde ein Renesas-R8C-Board von Glyn verteilt. Die Software von Glyn beinhaltet einen C-Compiler, aber interessanter ist es natürlich, ein Forth auf der CPU laufen zu lassen.
Hier auf der Seite wird kurz beschrieben, wie das Gforth-ec in den R8C kommt und benutzt werden kann.
Wer sich mit Unix etwas auskennt, wird sich leicht zurecht finden. Wer so rein gar nichts mit Unix zu tun hatte in seinem Leben, wird aber auch nicht im Stich gelassen. Denn es gibt auch noch die Schritt für Schritt bebilderten Anleitungen um mit Gforth erste Versuche auf dem R8C machen zu können - für Windows XP - für Linux - (und leider bisher nur ein Error log Mac OS X).
Das System ist fertig.
ram
und rom
.flashc!
und flash!
programmiert werden.:dovar
an einer Adresse, die das Ändern auf andere Doer (mit DOES>
) ermöglicht ($C0FE
).savesystem
speichert eine Kopie des RAMs in dieses Flash; damit sind auch Turnkey-Applikationen möglich. Das Datenflash kann öfter neu programmiert werden als das Programmflash, damit ist auch mehr Platz für Experimente. Ein empty
löscht das gespeicherte System wieder.tt.fs
passt in die 4K ROM.include
ist möglich (neu).
Die aktuelle Entwicklerversion von Gforth kann über pserver-CVS geladen werden. Mit älteren Versionen des Gforth kann manches der weiter unten aufgeführten Beispiele nicht ausgeführt werden, so war früher z.B. noch kein Gforth–Terminal für den r8c dabei. Wer die Doku von Gforth nicht auf der Gforth-Seite suchen will, findet sie hier. Da Gforth–EC nur ein Subset der Wörter im normalen Gforth hat, hilft ein WORDS
, um alle im R8C verfügbaren Wörter aufzulisten.
Für Windows-Nutzer, die keine Lust haben, Cygwin zu installieren, gibt's einen Snapshot in Form einer setup.exe
der aktuellen Entwicklerversion.
Das Gforth-R8C selbst ist als S-Record-Datei abgelegt und wird in dieser Form in das Flash-Memory des R8C geladen. Im Prinzip geht das mit dem FDT, wir verwenden aber Thomas Fischls m16c-flash unter Linux.
Installiert man zunächst Cygwin und dann Gforth aus den Sourcen, sollte man vor dem ./configure && make
noch die libffi installieren.
Installiert man obige setup.exe
, werden alle benötigten Libraries mitinstalliert.
Hinweis: setup.exe
installiert in Windows-XP eine Gruppe von Programmen. Dies sind: Bash, Gforth, Gforth Manual, Gforth Manual (PDF) und noch einige. Gehe zu dieser Programmgruppe und starte die Bash
(Start –
> Alle Programme --> Gforth --> Bash) ''Bash'' ist eine Shell (die "Bourne Again SHell"). Diese meldet sich im Bash-Fenster nun als ''sh:-3.00$'' oder ähnlich. Auf dieser Komandozeile werden alle Anweisungen, die nun folgen, eingegeben.
Alle folgenden Anweisungen gehen also von einer frisch geöffneten Shell aus (für Cygwin-Nutzer: Im Gforth-Verzeichnis). Innerhalb der shell
muss tatsächlich /
benutzt werden (der slash und nicht wie in Windows sonst üblich \
der backslash) – also zeichengenau so abtippen wie es hier im Folgenden nun geschrieben steht.
Mit
sh ./build-ec r8c
erzeugt man eine Datei rom-r8c.mot
(sie sollte der gforth-r8c.mot
von oben entsprechen). Es wird auch noch ein data-r8c.mot
erzeugt, mit dem man ein zerschossenes Daten-Flash wieder in Ordnung bringen kann. Das rom-r8c.mot
lädt man in's Flash. Danach kann man ein Terminal mit 38400 Baud 8N1 anschließen (etwa das Hyperterm, das in Windows eingebaut ist — Verbindung auf „COMx“ setzen), und interaktiv mit dem Forth im R8C arbeiten. Die Kommunikation findet über dieselbe serielle Schnittstelle statt, mit der man das Flash programmiert — kein Umstöpseln nötig. Das Nachladen von Dateien geht mit einem normalen Terminalprogramm nur, wenn man ca. 250ms als Newline-Verzögerung einstellt, da Xon/Xoff zu langsam reagieren.
Spielen Sie ein wenig mit dem Forth das nun im R8C ist, etwa
1 2 + . lcdpage s" Hello World" lcdtype adc@ .
Alle erlaubten Wörter werden mit
words
gelistet (zuletzt definierte zuerst).
Mit
./gforth arch/r8c/terminal.fs
startet man das in Gforth eingebaute Terminal. Das Terminal hat kein eigenes Fenster, sondern läuft nun innerhalb der shell. Wenn die Verbindung zum r8c steht, gibt es ein ok
sobald man <return> gedrückt hat.
Mit diesem Terminal kann man nun auch
include arch/r8c/tt.fs
eingeben, und das adaptierte Tetris-for-Terminals von Dirk Zoller laden (dauert etwas — der R8C compiliert den Code schließlich selbst). Starten mit
tt
Es folgen einige Hinweise für die verschiedenen Betriebssysteme.
Das Terminal nimmt per Default die Verbindung über COM2 auf — wenn nötig, die Datei terminal.fs
editieren: Ganz gegen Ende der Datei wird das grad angelegte Terminal aufgerufen, die Schnittstelle ausgewählt und das Skript verlassen terminal COM2 bye
. Hier kann man statt dessen COM1
eintragen; stimmt der Port nicht, reagiert das Terminal nicht!
Weiterer Hinweis: Auf dem Application-Board für den R8C/13 von Elektor ist der USB-serial-Wandler PL2303X von Prolific schon mit drauf. Der braucht einen passenden Treiber. Dieser trägt sich im System als COMx ein, wobei x für den nächsten freien COM-Port steht – bei mir war es COM5. Diesen Portnamen in der Datei terminal.fs wie beschrieben eintragen und das Gforth-Terminal arbeitet über USB mit dem Gforth im r8c.
Oder — bei Verwendung eines USB-Adapters — die Schnittstelle über den Gerätemanager auf COM2 festlegen.
Hier wird /dev/ttyUSB0
verwendet und auch hier kann man entsprechend durch Editieren eine andere Schnittstelle festlegen.
Ein einfaches Lauflicht, das nach dem Reset gleich losläuft, bis man über's Terminal eine Taste drückt:
rom : licht! led! &100 ms ; : lauf 1 licht! 2 licht! 4 licht! 8 licht! 4 licht! 2 licht! ; : dauerlauf BEGIN lauf key? UNTIL ; ' dauerlauf is bootmessage ram savesystem
Eine Schleife, die vom ADC liest und auf dem LCD ausgibt:
: adcmeter BEGIN 6 adc@ 0 <# #s #> lcdpage lcdtype &200 ms key? UNTIL ;
Und hier gibt's einen ganz einfachen Multitasker, der genau einen Hintergrundtask erlaubt:
rom Variable bgtask ram $20 cells allot rom :noname bgtask @ 0= ?EXIT rp@ bgtask @ sp@ cell+ bgtask ! sp! rp! ; IS pause : task r> bgtask $20 cells + ! bgtask $20 cells + bgtask $10 cells + ! bgtask $10 cells + bgtask ! ; :noname echo @ IF BEGIN pause key? UNTIL THEN (key) ; is key ram
Als Beispiel eine adaptierte Version des Lauflichts von oben:
rom : licht! led! &100 ms ; : lauf 1 licht! 2 licht! 4 licht! 8 licht! 4 licht! 2 licht! ; : dauerlauf task BEGIN lauf AGAIN ; ram
Analog zum Lauflicht kann man auch einen Lauftext erzeugen — und über das Poti die Textgeschwindigkeit einstellen:
rom Create text ," GNU Forth EC R8C -- Mikroprozessor -- " Create ledtable 1 c, 2 c, 4 c, 8 c, 4 c, 2 c, Variable /text : lauftext task BEGIN text count /text @ over mod /string 16 min dup >r lcdpage lcdtype r@ 16 < IF text 1+ 16 r@ - lcdtype THEN rdrop 1 /text +! /text @ 6 mod ledtable + c@ led! 6 adc@ 2/ ms AGAIN ; ram
Wenn man sich Ausgesperrt hat, hilft dieser Trick von Erich Wälde.