% Content-encoding: UTF-8
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage{multicol,babel}
\setcounter{secnumdepth}{0}
\setcounter{tocdepth}{0}

\renewcommand{\reftextbefore}{auf der vor\-herigen Seite}
\renewcommand{\reftextfacebefore}{auf der gegen\-über\-lie\-genden Seite}
\renewcommand{\reftextafter}{auf der näch\-sten Seite}
\renewcommand{\reftextfaceafter}{auf der gegen\-über\-lie\-genden Seite}
\renewcommand{\reftextfaraway}[1]{auf Seite~\pageref{#1}}

\begin{document}
% \renewcommand{\figurename}{Tabelle}

\title{Das FlashForth von Mikael Nordman}
\ifx\shorttitle\undefined\else
\shorttitle{FlashForth}
\fi
\author{Karsten Roederer}
\maketitle

Nach einigen Projekten mit den PICs von Microchip, bevorzugt damals die 16F(C)XXX Serie, keimte schon bald der Wunsch nach einem interaktiven Forth auf. Dieses macht aber nur Sinn in der 18FXXXX Serie, da bei diesen Typen das \emph{Pagen} der Speicherbereiche ein Fremdwort ist. Die PICs sind die zur Zeit verbreitetsten Prozessoren im Automotive--Bereich. Auf der letzten Forth-Tagung in Neuenkirchen entblößte ich mich mit dem Wunsch nach einem solchem Forth, was von Adolf brummig sogleich mit einem: „gibt’s doch schon alles“ kommentiert wurde. Bei den jetzt anstehenden Recherchen stieß ich zunächst  auf  das Pic18Forth (leider nicht interaktiv) und dann auf das FlashForth von Mikael Nordman aus Finnland.  Das ist meines Erachtens sehr kompetent entwickelt worden.

\begin{multicols}{2}
\section*{Feature}
Das FlashForth schien all das eingebaut zu haben, was mein Herz begehrt. Die Worte sind im Großen und Ganzen ANS’94--Standard. Der PICeigene Stack wird als Returnstack verwendet. Der Compiler schreibt entweder ins flash, eeprom oder ram, je nachdem, was man im Source geschaltet hat. Das betrifft die Worte: create allot variable , c, value und defer. Casesensitive.  Die Interruptroutinen können irgendwo stehen und unterscheiden sich vom restlichen Code durch ein schlichtes ;i am Ende der Definition. Interpretiert und kompiliert wird über die serielle Schnittstelle. Leider, und jetzt kommt der Wermutstropfen, gesteuert über XON und XOFF. Nun weiß aber ein jeder etwas über den FIFO in seinem Rechner zu berichten. So ein Handshake verträgt sich nicht mit einem solchen doch wünschenswerten Puffer in der „Timesharingwelt“. Wenn man diesen disabled, würde die Kommunikation zwar klappen mit einem kleinen Restrisiko. Ich habe mir erlaubt, XON/XOFF durch einen 
RTS--CTS--Handshake zu ersetzen. Was im Assembler auf der PIC--Seite noch gut zu machen war, gestaltete sich mit Win32Forth leider erst einmal mangelhaft. Es funktionierte nur, wenn ich vorher ein anderes Programm gestartet hatte, welches ein solches Feature richtig umgesetzt hatte. Dank Ullis Hilfe klappt das jetzt auch mit den Win32Forth--eigenen Windowcalls. Ein weiteres Problem machte dann meine UART-Hardware auf  meinem Rechner. Wenn der PIC mit CTS wackelte, stoppte der PC zwar die Übertragung beim nächsten Byte; ließ aber, nachdem CTS wieder clear war, das folgende Byte fallen – nach Recherchen ein wohlbekannter National bug im FIFO. Die mir zur Verfügung stehenden USB-RS232-Adapter haben dieses \emph{Feature} zum Glück nicht eingebaut und so arbeite ich jetzt, auch wenn der Rechner eine serielle Schnittstelle besitzt, mit solchen Adaptern.

\section*{FlashForth Backmischung}
Das Übersetzen des Assemblerprogramms funktionierte bei mir mit dem MPASM--Standardassembler nicht. Mit gputils eingebunden in Microchips MPASM funktionierte dann build mit success. 

Die Programmierung des PIC übernimmt der upgegradete PICStart+. Er kann auch über einen Adapter das ICSP (in circiut serial programming) ausführen. Auf der Microchipseite ist die Programmierung spezifiziert. Es gibt da aber auch andere Low--Cost--Lösungen. TAIT über die parallele Schnittstelle oder warum nicht auch mal eine Lösung in Forth über die serielle Schnittstelle unter der Verwendung der Handshakeleitungen. Für die verschiedenen Baudraten bei den verschiedenen Clocks, mit denen der Prozessor betrieben werden soll, haben mir die Macros für das Einstellen der zugehörigen Register nicht sehr geholfen. Es führt nichts drum herum, das Datenblatt zu diesem Thema zu wälzen und dem Macro den besten krummen Baudwert zum Fraß vorzuwerfen, der zu einem Standard--Baudwert mit dem geringsten Fehler führt. Das ist gerade bei z.B. 115200 Baud mühselig auszuprobieren. Ein gutes Beispiel dafür, dass Macros kontraproduktiv sind in neuen Designs. Gilt es doch einzukreisen, ob etwas mit der Hard- oder Software des Prozessors oder zwischen den Ohren nicht stimmt, wenn das gerade Programmierte nicht nach Wunsch ausgeführt wird.

\section*{Arbeiten mit dem PIC}
Nachdem das Produkt mit dem Emulator seinen Feinschliff bekommen hatte, konnte ich denselbigen in die Ecke stellen und die Programmentwicklung direkt auf dem PIC weiter betreiben. Schmerzlich vermissen tue ich jetzt nur noch einen Singlestepper. Sehr bewährt hat sich, vor der Programmausführung schon mal ein paar Werte auf den Stack zu legen und nachher nachzuschauen, ob noch alle Elemente da sind. Stackunderflow wird prompt durch einen reset des Watchdogs quittiert. Mit cold holt man sich den letzten \emph{gültigen} Zustand der Maschine zurück und alles frisch Programmierte ist vergessen.

Die I/O-Pins RB6, RB7 und MCLR werden für die ICSP verwendet. Deshalb habe ich nach einigem Hin und Her RB6 als RTS und RB7 als CTS ausgeguckt. In meinen Schaltungsdesigns berücksichtige ich durch eine spezielle Beschaltung ein einigermaßen  entkoppeltes Dasein beider Features. Also gleichzeitig die ICSP und die Nutzung als Handshakeleitungen.
Verschiedene Beispielprogramme können auch hier downgeloaded werden. Sie sind eine sehr gute Grundlage, um sich mit der speziellen 
PIC--Programmierung (inlining von Code etc.) anzufreunden. 

Als Terminalprogramm stelle ich gern eine Win32Forth--Version zur Verfügung. Hier wird mit F12 ein Fenster zur Verfügung gestellt, wo eine Source zum uploaden ausgesucht werden kann. Das, was der PIC bekommt, wird nach einiger Zeit geechoed im Terminalfenster dargestellt, wenn Windows den FIFO des UART von seinem Inhalt befreit. Hier sollte man dann noch mal schauen, ob der Compiler nicht gemeckert hat, was er nur durch ein schlichtes Fragezeichen im Code zu tun pflegt.
\end{multicols}
\section*{Literatur}
\begin{tabular}{lp{16cm}}
{}[1] &TP016    (91016b.pdf) auf \url{http://www.Mircochip.com}\\
{}[2] &Elektor  (welche Ausgabe ist leider auf der Kopie nicht mehr zu erkennen) PIC18Flash Entwicklungssystem von Peter Moreton\\
{}[3] &FF can be downloaded from \url{http://www.sourceforge.net/projects/flashforth}
\end{tabular}
 
\section*{Wortschatz des FlashForth}
\begin{footnotesize}
\begin{multicols}{2}
\setlength{\columnseprule}{0.5pt}
\begin{quote}
\setlength{\baselineskip}{10pt}
\setlength{\parskip}{15pt}
\verbatimtabinput{2010-01/flashforth-words.txt}
\end{quote}
\end{multicols}
\end{footnotesize}
\end{document}


