Inhaltsverzeichnis
<texit info> author=Bernd Paysan title=Gforth EC R8C </texit>
R8C-Forth
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).
Aufgabenverteilung
- Heinz Schnitter schreibt den Assembler <latex>\checkmark</latex>
- Bernd Paysan passt Gforth-EC an den R8C an <latex>\checkmark</latex>
Status 09jul2006
Das System ist fertig.
- Das Forth sagt OK über die UART, kann LEDs und LCD ansteuern, legt selbstdefinierte Programme per Default im (sehr knappen) RAM ab. Umschalten zwischen RAM und ROM mit den Wörtern
ram
undrom
. - Das Daten-Flash kann mit
flashc!
undflash!
programmiert werden. - Gforth ist so anpasst, dass Code Flash-gerecht abgelegt wird (also jedes Bit genau einmal gelöscht wird). Immediate- und Compile-only-Bit sind also zunächst gesetzt (bedeutet natürlich „nicht immediate“ und „nicht compile-only“), und werden bei Bedarf gelöscht. Ebenso ist
:dovar
an einer Adresse, die das Ändern auf andere Doer (mitDOES>
) ermöglicht ($C0FE
). - Gforth EC R8C erlaubt das Anlegen von bis zu 4k Forth-Programmen im Datenflash. Ein
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. Einempty
löscht das gespeicherte System wieder. - Der Assembler ist jetzt wirklich komplett.
- Der Rest des im ROM zur Verfügung stehenden Platzes ist mit benutzerfreundlichen Fehlermeldungen gefüllt
- Es gibt ein Terminal-Programm, das auch das Nachladen von Dateien über ein einfaches Handshake erlaubt (Xon/Xoff scheitert am Polling-Intervall des USB-Controllers, krude Abhilfe: 250ms Newline-Delay)
- Eine Adaption von
tt.fs
passt in die 4K ROM. - Millisekunden werden über Timer C realisiert.
- Nested
include
ist möglich (neu). - Alle bisher bekannten Bugs sind behoben.
Download von gforth
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.
Download von gforth-ec
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.
Installation und Handhabung des gforth
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.
ROM-Image für den R8C erzeugen
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).
Forth-Terminal von gforth aus
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.
Windows XP
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.
Linux
Hier wird /dev/ttyUSB0
verwendet und auch hier kann man entsprechend durch Editieren eine andere Schnittstelle festlegen.
Lauflicht im R8C
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
ADC Wandler im R8C
Eine Schleife, die vom ADC liest und auf dem LCD ausgibt:
: adcmeter BEGIN 6 adc@ 0 <# #s #> lcdpage lcdtype &200 ms key? UNTIL ;
Multitasker
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
Lauftext
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
Tipps und Tricks
Wenn man sich Ausgesperrt hat, hilft dieser Trick von Erich Wälde.
Links
- Peter Ouwehand beschreibt das HD44780 LCD. Und hier kann man das LCD-Modul 162b kaufen (hat auch ein Link auf das Datenblatt drin)
- Thomas Fischl hat einen Flasher für Linux und Mac OS X an den R8C angepasst.