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

%\newcommand{\code}[1]{\texttt{#1}}
%\newcommand{\ret}{\textsf{$<$ret$>$}\xspace}
\newcommand{\ret}{$\hookleftarrow$\xspace}

\renewcommand{\reftextbefore}{auf der vorherigen Seite}
\renewcommand{\reftextfacebefore}{auf der gegenüberliegenden Seite}
\renewcommand{\reftextafter}{auf der nächsten Seite}
\renewcommand{\reftextfaceafter}{auf der gegenüberliegenden Seite}
\renewcommand{\figurename}{Abbildung}

\begin{document}

\title{Halbduplex–Multidrop–Stromschleife $\!$und$\!$ amforth}
\ifx\shorttitle\undefined\else
%\shorttitle{Multidrop Half Duplex Current Loop System Configuration and amforth.}
\shorttitle{Halbduplex–Multidrop–Stromschleife}
\fi
\author{Michael Kalus}

\begin{document}
\maketitle

\begin{figure*}[b]
\begin{center}
\includegraphics[width=0.9\textwidth]{2010-0203/multidrop}
\end{center}
\caption{\label{halbduplex:Bild2}Schema der Stromschleife und ihrer Optokoppler}
\end{figure*}


Für eine Solarkollektoranlage [1] zur Warmwasserbereitung wurden neulich drei Steuerungseinheiten mit je einem atmega168 eingesetzt. In der Anlage waren 12 Temperaturen zu erfassen, 3 Pumpen und 8 Ventile zu schalten. Da preiswerte fertige Steuerungseinheiten zur Verfügung standen, die jeweils 4 Temperaturwerte erfasssen und über 4 Triacs 220V--Verbraucher schalten konnten, wurden drei davon in der Anlage verteilt. Damit konnte zum einen die Steuerungsaufgabe gelöst, und außerdem die verlegten Kabelmeter gering gehalten werden.

Die drei \emph{Dosen} genannten Steuerungen und ein Terminal [2] wurden über eine V24--20mA--Stromschleife miteinander verbunden und halbduplex betrieben. Die Speisung der Stromschleife erfolgte über eine kleine separate Konstantstromquelle. Die \emph{Dosen} und das Terminal wurden über Optokoppler [3] mit der Stromschleife verbunden. Die Verbindung vom USART des atmega in jeder \emph{Dose} hin zu den Optokopplern erfolgte also vollduplex. Erst die Optokoppler schalten das auf eine Leitung, wodurch die Halbduplex--Eigenschaft der Verbindung entsteht. An den Steuerungen mussten somit keine Hardwareänderungen vorgenommen werden. Es genügte eine Anpassung des amforth an den Halbduplex--Effekt.

\begin{multicols}{2}
\section{Vom Terminal aus gesehen: Fernes Forth Echo nicht erwünscht}

Gewöhnlich wird amforth in einer Vollduplex--Verbindung mit einem Terminal eingesetzt, also Punkt--zu--Punkt. Es gibt einen Hinkanal vom Terminal zum amforth, das die Zeichen mit dem Wort \texttt{KEY} empfängt. Und einen Rückkanal, über den amforth per \texttt{EMIT} Zeichen an das Terminal sendet. amforth wertet alle mit \texttt{KEY} empfangenen Zeichen im Wort \texttt{ACCEPT} aus, von dem aus dann der  Terminal Input Buffer \texttt{TIB} gefüllt und ein Echo jedes Zeichens an das Terminal zurückgegeben wird (remote echo). Da nun das Terminal selbst halbduplex an die Stromschleife angeschlossen ist, erscheint sofort auch das von ihm selbst gesendete Zeichen auf dem Schirm --- sein eigenes lokales Echo. So kommt es, dass bei jedem Tastendruck das Zeichen gleich zweimal auf dem Bildschirm erscheint. Und da das lokale Echo seitens des Terminalanschlusses bei dieser Schaltung nicht unterdrückt werden kann, muss das Echo im amforth entfernt werden. Die Stellen, an denen das \texttt{ACCEPT} dafür verändert werden muss, sind im Listing wiedergegeben.

\begin{figure*}
\begin{center}
\includegraphics[width=0.4\textwidth]{2010-0203/dose}
\end{center}
\caption{\label{halbduplex:Bild1}Eine \emph{Dose} auf dem Dachboden}
\end{figure*}


\section{Vom amforth aus gesehen: Eigenes lokales Echo wegwerfen}

Damit das, was amforth selbst sendet, nicht sogleich wieder in seinem eigenen \texttt{TIB} landet und interpretiert wird --- um also eine Rückkopplung der eigenen Ausgabe zu verhindern --- muss das unvermeidliche amforth--seitige lokale Echo vernichtet werden (echo cancellation). Unvermeidlich, weil man den USART der Einfachheit halber einfach weiter arbeiten lässt. So empfängt eine \emph{Dose} zwar sein soeben gesendetes Zeichens selbst, dieses wird aber sofort wieder verworfen. Das ist der einfachste Weg, das lokale Echo unschädlich zu machen. Außerdem kann man dabei auch schnell noch nachsehen, ob die Leitung frei war, das Zeichen also ungestört emittiert werden konnte. 

\begin{alltt}
: drop-echo-emit ( c -- )
   tx begin key? until key drop ; \ret\\
' drop-echo-emit is emit \ret
\end{alltt}
\vspace*{0.7cm}

\section{Prompt gestalten}

Da schon das Terminal mit seinem abschließenden CR und auto--LF den Cursor selbst in die nächste Zeile setzt, ist das zusätzliche CR des amforth, das mit seinem OK kommt, störend. Außerdem sollte jede \emph{Dose} ihr eigenes Zeilenprompt haben. So wurde unterschieden zwischen einem OK--Prompt, das gesendet wird, wenn der Interpreter mit der Verarbeitung seines letzten \texttt{TIB} fertig ist, und einem Zeilen--Prompt, das erscheint, wenn der Eingabestrom abgearbeitet wurde. Dieses Verhalten ist im Wort \texttt{QUIT} angesiedelt. Dem \texttt{QUIT} wurden nun zwei deferred words an die Stelle der eingebauten Ausgabe mitgegeben, \texttt{OK\_PROMPT} und \texttt{READY\_PROMPT}. Damit kann der Prompt umgestellt werden, je nach Zweck und \emph{Dose}. Mit diesen Anpassungen ließen sich die Steuerungen an der Stromschleife nun ordentlich einzeln ansprechen und halbduplex betreiben. Das Listing des \texttt{QUIT} zeigt die Stellen, an denen die Änderungen für Verhalten des Prompt eingefügt wurden. Außerdem ist gezeigt, wie vom Assemblerlisting aus ein deferred word \texttt{PROMPT} angelegt wird.

Das Protokoll, mit dem nun alle \emph{Dosen} im Ring kommunizieren können, wird in einem weiteren Beitrag beschrieben. 
\end{multicols}

\begin{figure*}[b]
\begin{center}
\includegraphics[width=0.45\textwidth]{2010-0203/konstantstromquelle}
\end{center}
\caption{\label{halbduplex:Bild3}Konstantstromquelle für die Stromschleife mit seriellem Anschluss des Terminals}
\end{figure*}

\section{Quellen}
\begin{tabular}{lp{0.9\textwidth}}
{}[1] & Vacuumtubes als Solarkollektoren, 3 Einheiten zu je 22 Röhren, die einen Sammler heizen. \newline \url{http://www.wattsolar.de/}\\
{}[2] & Das Terminal besteht lediglich aus einem USB--seriellen Wandler, auf den  ein Terminalprogramm auf einem Laptop wirkt (ZTerm auf MacOSX). \\
{}[3] & Optically Coupled 20 mA Current Loop Transmitter HCPL--4100,
and Optically Coupled 20 mA Current Loop Receiver HCPL--4200 von Hewlett Packard. In dem Dokument ist auch die Konstantstromquelle für die Stromschleife angegeben.
\end{tabular}


\section{Assemblerlisting des amforth--Files \texttt{accept.asm} mit den Modifikationen}

\begin{quote}
\listinginput[1]{1}{2010-0203/accept.asm}
\end{quote}




\section{Assemblerlisting des amforth--Files \texttt{quit.asm} mit den Modifikationen}

\begin{quote}
\listinginput[1]{1}{2010-0203/quit.asm}
\end{quote}

\vfill
\begin{center}
\includegraphics[height=6.3cm]{2010-0203/Vakuumroehrenkollektor}\\
Ein Vakuumröhrenkollektor, Quelle: wikimedia.org
\end{center}
\vfill

\end{document}