Benutzer-Werkzeuge

Webseiten-Werkzeuge


projects:r8c:r8c_forth

<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 und rom ;-).
  • Das Daten-Flash kann mit flashc! und flash! 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 (mit DOES>) 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. Ein empty 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.

Melden Sie sich an, um einen Kommentar zu erstellen.
projects/r8c/r8c_forth.txt · Zuletzt geändert: 2013-06-12 18:02 von bernd