2.4 Software
2.4.1 Übersicht
Die Programme sind in der Sprache RPL geschrieben. Sie beinhaltet Stackoperationen und viele Elemente anderer Hochsprachen:
Bedingungsstrukturen: IF...THEN...END, CASE...END, IFT, IFTE,
Schleifen: FOR...NEXT, FOR...STEP, WHILE...REPEAT...END, DO...UNTIL...END, START..STEP,
Stackoperationen: ROT, ROLL, DUP, DROP.
Lokale Variablen werden je am Anfang eines Programms durch ihren Inhalt definiert. Eine explizite Typendeklaration entfällt bei RPL. Soll einer Variablen der Typ: Liste zugewiesen werden, wird einfach eine leere Liste in ihr abgelegt. Syntax, Beispiel: « { 4 }--> Li « "HALLO" 'Li' STO+ » »
Displayausschnitt |
« = Programmanfang, die Liste mit der Zahl 4 wird der Variable Li zugewiesen, « = Anfang des Unterprogramms, in dem Li gültig ist. Das Programm fügt zur Liste den Text "HALLO" am Anfang hinzu. Liste Li besteht nun aus: { "HALLO" 4 }. Die Speicherverwaltung der HP-48 ist ähnlich wie bei einem PC mit Directories organisiert. Das Directory PEIL liegt mit anderen Elementen im HOME-DIR, vergleichbar mit dem C:\ Laufwerk beim PC. Variablen, Programme und Directories liegen sichtbar auf den Softkeybalken am unteren Rand des Displays, wobei Directories mit einem aufgesetzten Balken gekennzeichnet sind. Vom Programm genutzte Globale Variablen oder Unterprogramme müssen entweder1: im selben DIR liegen oder 2: in einem höheren DIR oder 3: direkt mit Pfad angesprochen werden. Soll z.B. aus dem DIR: HOME\PEIL\DIS heraus die variable K gelesen werden: Hinweg: PEIL PARA K Rückweg: PEIL DIS. Ein voreingestellter PATH wie beim PC besteht nicht. Mehr Informationen dazu im HP48-Advanced User's Reference Manual.
Bild 51 :Übersicht der Directorys |
Bei den zum Peilgerät entwickelten Programmen handelt es sich nicht um nur ein Hauptprogramm, welches auf verschiedene Unterprogramme zugreift, sondern um verschiedene Programme mit Unterprogrammen, die entweder direkt oder über eine Benutzeroberfläche angesprochen werden. Die Programme, die sich einer bestimmten Aufgabe zuordnen lassen, sind in einem für diese Aufgabe bestimmten DIR abgelegt. Die verschiedenen Zugriffsanten erschweren eine strukturierte Beschreibung der Software. Im Folgenden werden die Programmgruppen in der Reihenfolge ihrer Position im DIR erklärt. Bedingt durch die Vielzahl der Programme sind an unwichtigen oder selbsterklärenden Programmstellen die Kommemtare kurz gefaßt. Am Anfang jedes Abschnittes steht die Übersicht über den Inhalt des Directorys.
RPL-Syntax:
1.Name des Directorys @ Kommentar
2. DIR @ Kommentar
3. Inhalt des Dir @ Kommentar
4. END @ Kommentar
Übersicht des PEIL-DIR:
PEIL @ Programm-DIR, enthält alle Programme für den Peilbetrieb.
DIR @ Anfang des DIR-PEIL
OFF. @ Programm zum Ausschalten des Peilers, siehe Abschnitt 2.4.6.1.
DIS @ DIR mit Programmen für die Benutzershell, siehe Abschnitt 2.4.2.
REM @ DIR mit Programmen für den Fernsteuerbetrieb, siehe Abschnitt 2.4.3.
TIM @ DIR mit Programmen für der Timerbetrieb, siehe Abschnitt 2.4.4.
FKT @ DIR mit Programmen für die Peilung, siehe Abschnitt 2.4.5.
ANZ @ DIR mit Programmen zur Anzeige verschiedener Meßwerte, siehe Abschnitt 2.4.6.2.
FUNK @ DIR mit Programmen zum Steuern des Funkgerätes, siehe Abschnitt 2.4.6.3.
IO @ DIR mit Programmen für Tests und Systemeinstellungen, siehe Abschnitt 2.4.6.
PARA @ DIR mit Globalen Variablen, siehe Abschnitt 2.4.6 .4.
RESET @ Programm zum Rücksetzen des Peilgerätes, siehe Abschnitt 2.4.6.5.
TX @ Programm zum Senden von Befehlen zur Hardware, siehe Abschnitt 2.4.6.6.
CHE @ Programm zum Setzen des Funk-Kanals, siehe Abschnitt 2.4.6.7.
S.TST @ Programm für den Selbsttest, testet Funktion der Einschübe, siehe Abschnitt 2.4.6.8.
LES.IO @ Programm zum Einlesen und Konvertieren der Systemantwort, siehe Abschnitt 2.4.6.9.
ERHAND @ Programm error-handler für I/O-Fehler, siehe Abschnitt 2.4.6.10.
CST @ Liste mit Elementen für den Anzeigefilter Taste:CST
IOPAR @ Liste mit Sendeparametern
END @ Ende des DIR-PEIL
Bild 53: VAR-Menu Seite 1 Bild 52: CST-Menu |
Die CST-Liste enthält {OFF. DIS REM TIM }. Befindet sich der Rechner im CST-Modus, können nur die in der Liste enthaltenen Tasten betätigt werden, die anderen Tasten sind verdeckt. Dies hat den Vorteil, daß dem neuen Benutzer nur die für ihn wichtigen Tasten zugänglich sind. Die Bedienung ist dadurch etwas einfacher.
Taste VAR läßt die weiteren Optionen erscheinen, der Filter ist ausgeschaltet. Auf eine Displayseite passen nur 6 Elemente, mit Taste NXT wird umlaufend die nächste Seite sichtbar.
Seite 1: OFF. DIS REM TIM FKT ANZ
Seite 2 : FUNK IO PARA RESET TX CHE
Seite 3 : S.TST LES.IO ERHAND CST IOPAR
HP-Zeichen, die nicht im ASCII-Zeichensatz des PC's enthalten sind, werden aus zwei Zeichen zusammengesetzt, zur Kennzeichnung eines zusammengesetzten Zeichens dient der "\" . Bei der Übertragung in den HP-48 werden mit dem Übersetzungscode 2 die entsprechenden HP-Zeichen erzeugt.
Im Listing werden folgende zusammengesetzte Zeichen verwendet:
\<= : KLEINER GLEICH, \>= : GROESSER GLEICH, \<) : WINKEL, \Gw : OMEGA KLEIN,\GW OHM,
\Ga : ALPHA, \GS : SUMMENZEICHEN, \-> : PFEIL ZUWEISUNG, \|^ : PFEIL NACH OBEN,
\|v : PFEIL NACH UNTEN
2.4.2 Benutzeroberfläche DIS-DIR
Das DIS Directory enthält folgende Elemente:
DIS
DIR
EXIT @ Programm zum Verlassen des DIS-DIR
SHELL @ Hauptprogramm: Benutzeroberfläche, siehe 2.4.2.1.
QSOSHELL @ Shell für ein Funkgespräch, siehe 2.4.2.2.
REPIC @ Bild 51x45 Bildpunkte
PWPIC @ Bild 51x45 Bildpunkte
SZPIC @Bild 51x45 Bildpunkte
FQPIC @ Bild 51x45 Bildpunkte
HELP @ Hilfstext mit Befehlstabelle
OPIC @ Bild 131x64 Bildpunkte
OPIC2 @ Bild 59x57 Bildpunkte
OPIC3 @ Bild 131x15 Bildpunkte
OPIC4 @ Bild 51x45 Bildpunkte
SPIC @ Bild 5x5 Bildpunkte
CST @ Liste mit CST-Tasten: {EXIT DIS}
PPAR @ Printparameter
END @ des DIS-DIR
Beschreibung der Programme aus DIS:
2.4.2.1 SHELL
Das Programm SHELL erzeugt die im Bild 50 gezeigte Benutzeroberfläche.
Bild 54: Benutzeroberfläche |
Tasten:
OFF = Gerät ausschalten
EXIT = Verlassen des Menüs
SPEC = Spektrumanzeige (beschrieben im Abschnitt 2.4.6.2 Hilfsprogramme: ANZ \ G.S)
STB = Stummschaltung
CH = Direkteingabe des Kanals
QSO = Aufrufen der QSO-Shell
Beim Aufrufen der Shell wird zunächst der Benutzer nach dem Empfangskanal gefragt, nach einer Warmlaufzeit von 10s für die Antennensteuerung werden mehrfach die Meßwerte für die Peilung eingelesen und daraus ein Mittelwert gebildet. Die Daten werden der Winkelbestimmung WBS im DIR FKT übergeben. Diese ermittelt den gesuchten Winkel. Danach werden zusätzliche Meßwerte eingelesen: Feldstärke, Temperatur, Betriebsspannung und Ablage des empfangenen Signals. Die Shell erzeugt aus Feldstärke und Winkel einen Zeiger variabler Länge.
Listing mit Erklärungen:
%%HP: T(2)A(D)F(.);
@ Ladeparameter für den Rechner beim Überspielen vom PC: Zeichensatz T = 2
@ Programm: SHELL ( Benutzeroberfläche )
«
@ Zuweisung der lokalen Variablen:
@ \-> = Wertezuweisung z.B. weiter=1, OPIC2=opic2
1 0 1 0 0 0 0 0 0 OPIC OPIC2 SPIC 0 0 0 (0,0) \->
weiter warm ch l fq s t u0 u opic opic2 spic d w key pos
@ Beginn der Variablenreservierung
«
@ Zuweisung der globalen Variablen:
{ (1,1) (131,64) X 0 (0,0) FUNCTION Y } 'PPAR' STO
ERASE RESET
{ # 0d # 0d } PVIEW @ Umschalten auf Graphik-Betrieb
@ Beginn der Hauptschleife
WHILE weiter REPEAT
@ 10 Sekunden Warmlaufzeit für Antennensteuerung, falls diese kalt
IF warm NOT THEN
CLLCD TEXT @ Text = Umschalten auf ASCII Bildschirm
"gib Kanal ein
danach ENTER"
{ ":CH:" { 1 5 } V} INPUT OBJ DTAG CHE
@ Zurückschalten auf Grafikbetrieb:
PICT { # 0d # 0d } opic REPL { # 0d # 0d } PVIEW
@ Grundeinstellung: STB aus, ATT aus, Takt ein.
18 TX DROP 20 TX DROP 23 TX DROP
10 0 FOR i
PICT { # 60d # 50d } "Warmlaufen: " i + "sek " + 1 \->GROB REPL
0.95 WAIT -1 STEP 1 'warm' STO
END
@ Werte den lokalen Variablen zuweisen, TX liest Meßwerte ein.
TIME 2 TRNC 'u' STO
DATE 2 TRNC 'd' STO
HOME PEIL FKT PEIL 'w' STO
@ Pfad HOME PEIL FKT, danach Programm PEIL aufrufen und dessen Ausgabe in w speichern.
PICT { # 60d # 50d } "ANDERE MESSUNGEN" 1 \->GROB REPL
HOME PEIL PARA K 'ch' STO HOME PEIL DIS
32 TX 10 / 'u0' STO
37 TX 's' STO
40 TX 0.4328 ^ 2.9417 * 't' STO
41 TX 127.5 - 'fq' STO
1 s 255 / - 24 * 2 + 'l' STO @ l = Länge des grafischen Zeigers
@ ****************Bildaufbau: Texte, Linien, Grafik.*************************
PICT { # 0d # 0d } opic2 REPL
@ (X,Y) Positionsberechnung
l w SIN * l w COS * R\->C (29,36) + 'pos' STO
@ Quadrat um Zeigerspitze und Zeigerlinie, "C->PX" wandelt komplexe Zahl in Displayposition.
PICT pos (-2,2) + C->PX spic REPL (29,36) pos LINE pos PIXOFF
@ Texte in verschieden Größen werden in die Grafik eingefügt.
PICT { # 63d # 2d } 1 FIX w " " + "\<) :" SWAP + 3 \->GROB REPL
PICT { # 63d # 14d } STD "S :" s + " u " + 3 \->GROB REPL
PICT { # 60d # 26d } 2 FIX "AM:" d + " UM:" + u + 1 \->GROB REPL
PICT { # 60d # 32d } 1 FIX "U-BAT: " u0 + "V" + 1 \->GROB REPL
PICT { # 60d # 38d } 1 FIX "TEMP: " t + " C" + 1 \->GROB REPL
PICT { # 60d # 44d } "FQ: " fq + "U" + STD " CH: " + ch + " " + 1 \->GROB REPL
@**********************Tastenabfrage:*******************************
0.01 WAIT
IF KEY THEN @ KEY = Schlüsselwort
{11 12 13 14 15 16} SWAP POS 'key' STO
@ Welcher Listeneintragung entspricht die Taste? 0 = keiner.
IF key THEN @ key = Variable
@ Programmliste für zugelassene Tasten 11..16 = "A".."F"; 16 = Zeile1, Taste 6.
{
« OFF. 0 'warm' STO »
« 0 'weiter' STO »
« HOME PEIL ANZ G.S HOME PEIL DIS OPIC PICT STO »
« PICT
IF 17 LES.IO 7 GET THEN 18 TX DROP " STB " 1 \->GROB NEG { # 67d # 58d }
ELSE 19 TX DROP "STB-" 1 \->GROB NEG { # 69d # 58d }
END SWAP REPL
»
« CLLCD
"gib Kanal ein
danach ENTER"
{ ":CH:" { 1 5 } V} INPUT OBJ DTAG CHE »
« QSOSHELL 0 'warm' STO »
}
@ Gewähltes Programm wird aus der Liste genommen und ausgeführt.
key GET EVAL { # 0d # 0d } PVIEW
END @ off if key
END @ off if KEY
END @ off while
» @ Ende der lokalen Variablenreservierung.
» @ Ende des Programms.
2.4.2.2 Programm DIS\QSOSHELL:
Die QSOSHELL animiert zwei Drehspulinstrumente und ermöglicht den Zugriff auf Funktionen des Sendeempfängers.
Tasten:
Bild 55: QSO-SHELL |
STB= Stummschaltung
ATT=Abschwächer
MIC=NF-Wahlschalter auf Mikrofon
DTMF=NF-Schalter auf Modem
->CH= Direkteingabe des Funkkanals
HARD= Direkteingabe von Hardwarebefehlen
EXIT=Verlassen des Menüs
TX=Senden
RX=Empfangen
UP=Kanal auf
DOWN=Kanal ab
A-FM= AMÛFM Umschaltung
Listing mit Erklärungen:
%%HP: T(2)A(D)F(.);
@ Programm: Shell für QSO (Funkgespräch).
«
0 1 0 0 1 0 1 1 1 0 REPIC PWPIC SZPIC FQPIC \->
tx weiter key w1 a1 w2 a2 neu ch am repic pwpic szpic fqpic
«
@ Grundeinstellungen
22 TX DROP 18 TX DROP UPDIR PARA K 'ch' STO UPDIR DIS 52 TX DROP
@ Umschalten auf Graphik-Betrieb
ERASE { # 0d # 0d } PVIEW
@ Bildaufbau:
PICT { # 0d # 49d } OPIC3 REPL
PICT { # 107d # 5d } "CH: " 1 \->GROB REPL
PICT { # 117d # 1d } ch STR 3 \->GROB REPL
PICT { # 108d # 15d } "FM" 3 \->GROB REPL
PICT { # 108d # 25d } "DTMF" 3 \->GROB REPL
PICT { # 108d # 15d }
IF ch 16 < ch 3 > AND am AND THEN "AM" ELSE "FM" END 3 \->GROB REPL
PICT { # 108d # 35d } "RX" 3 \->GROB REPL
@ Beginn der Hauptschleife
WHILE weiter REPEAT
IF tx THEN
@ Im Sendebetrieb werden Sendeleistung und REV+Leistung angezeigt.
38 TX 0.32941 * 42 - 'w1' STO
39 TX 0.32941 * 42 - 'w2' STO
@ Zeiger1:
IF w1 a1 - ABS 1 > neu OR THEN
PICT { # 1d # 1d } pwpic REPL
31 w1 SIN * 31 w1 COS * R\->C (27,24) + (27,24) LINE
w1 'a1' STO
END
@ Zeiger2:
IF w2 a2 - ABS 1 > neu OR THEN
PICT { # 54d # 1d } repic REPL
31 w2 SIN * 31 w2 COS * R\->C (80,24) + (80,24) LINE
w2 'a2' STO 0 'neu' STO
END
@ Im Empfangsbetrieb werden S-Wert und Mittenfrequenz angezeigt.
ELSE
37 TX 0.32941 * 42 - 'w1' STO
41 TX 0.32941 * 42 - 'w2' STO
@ Zeiger1
IF w1 a1 - ABS 1 > neu OR THEN
PICT { # 1d # 1d } szpic REPL
31 w1 SIN * 31 w1 COS * R\->C (27,24) + (27,24) LINE
w1 'a1' STO
END
@ Zeiger2
IF w2 a2 - ABS 1 > neu OR THEN
PICT { # 54d # 1d } fqpic REPL
31 w2 SIN * 31 w2 COS * R\->C (80,24) + (80,24) LINE
w2 'a2' STO 0 'neu' STO
END
END @off if tx
@ Tastenabfrage
0.01 WAIT
IF KEY THEN @ ist eine Taste betätigt?
{ 21 22 23 24 25 26 11 12 13 14 15 16 51
92 93 94 95 82 83 84 85 72 73 74 75 62 63 64 65 } SWAP POS 'key' STO
IF key THEN @ ist diese Taste auch gültig?
@ Programmliste für zugelassene Tasten A..F
{
@ EXIT aus der Hauptschleife
« 0 'weiter' STO »
@ Senden
« 28 TX DROP 1 'tx' STO 1 'neu' STO »
@ Empfangen
« 17 TX DROP 0 'tx' STO 1 'neu' STO »
@ ch UP
« UPDIR PARA K 1 + IF DUP 80 > THEN DROP 1 END DUP 'ch' STO CHE UPDIR DIS »
@ ch DOWN
« UPDIR PARA K 1 - IF DUP 1 < THEN DROP 80 END DUP 'ch' STO CHE UPDIR DIS »
@ AM-FM
« 25 TX DROP 17 TX DROP
PICT { # 108d # 15d } IF ch 16 < ch 3 > AND THEN am NOT 'am' STO
IF am THEN "AM" ELSE "FM" END ELSE "FM" END 3 \->GROB REPL »
@ STB ein, aus
« PICT IF 17 LES.IO 7 GET THEN 18 TX DROP " STB " 1 \->GROB NEG
{ # 1d # 50d } ELSE 19 TX DROP "STB-" 1 \->GROB NEG { # 4d # 50d } END
SWAP REPL »
@ Attenator ein, aus
« PICT IF 17 LES.IO 6 GET THEN 20 TX DROP " ATT " 1 GROB NEG
{ # 22d # 50d } ELSE 21 TX DROP "ATT-" 1 \->GROB NEG { # 25d # 50d } END
SWAP REPL »
@ MIC
« PICT { # 108d # 25d } "MIC " 3 \->GROB REPL 53 TX DROP »
@ DTMF
« PICT { # 108d # 25d } "DTMF" 3 \->GROB REPL 52 TX DROP »
@ Kanaldirekteingabe:
« CLLCD "gib Kanal ein
danach ENTER" { ":CH:" { 1 5 } V} INPUT OBJ DTAG DUP 'ch' STO CHE
{ # 0d # 0d } PVIEW PICT { # 117d # 1d } ch STR " " + 3 \->GROB REPL »
@ Hardwarebefehl
« CLLCD TEXT "Hardwareanweisung:" { ":TX:" { 1 5 } V} INPUT OBJ DTAG TX
CLLCD "ANTWORT:" SWAP + 3 DISP 2 WAIT 1 'neu' STO { # 0d # 0d } PVIEW »
@ Senden-Empfang-Senden
« IF tx THEN 17 TX DROP 0 'tx' STO ELSE 28 TX DROP 1 'tx' STO END
1 'neu' STO »
@ DTMF Tastenblock:
« 28 TX DROP .5 WAIT 64 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 76 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 77 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 78 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 65 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 66 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 67 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 79 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 68 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 69 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 70 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 74 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 71 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 72 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 73 TX DROP 17 TX DROP »
« 28 TX DROP .5 WAIT 75 TX DROP 17 TX DROP »
}
@ Gewähltes Programm wird aus der Liste genommen und ausgeführt.
key GET EVAL
@ RX-TX Anzeige
PICT { # 108d # 35d } IF tx THEN "TX" ELSE "RX" END 3 \->GROB REPL
@ Kanalanzeige
PICT { # 117d # 1d } ch STR " " + 3 \->GROB REPL
@ AM-FM Anzeige
PICT { # 108d # 15d }
IF ch 16 < ch 3 > AND am AND THEN "AM" ELSE "FM" END 3 \->GROB REPL
END @ von if gültige Taste
END @ von if Taste
END @ von while ( Hauptschleife )
» @ Ende der Variablenreservierung.
» @ Ende des Programms QSOSHELL.
2.4.3 Fernsteuerbetrieb
Das REM-DIR enthält folgende Elemente:
REM
DIR
EXIT @ Programm zum Verlassen des DIR
REM @ Programm zur Fernsteuerung, siehe 2.4.3.1
DTMF @ DIR mit DTMF-Funktionen, siehe 2.4.3.2
DIR
MONI @ DTMF-Monitor
LG @ Steuerfolge
D.TES @ Steuerfolge
D.TES2 @ Steuerfolge
CL.S @ Steuerfolge
MAST @ Steuerfolge
CST @ Liste
END @ des DTMF-DIR
P.R @ Peil Remote, siehe 2.4.3.3
CST @ Liste mit Tasten: { EXIT REM DTMF}
D.TX @ DTMF-Aussendung, siehe 2.4.3.4
TEIL @ Konvertiert Zahlenwerte in des D.TX-Format, siehe 2.4.3.5
SEL @ Sendet eine DTMF-Steuerfolge.*
QU @ Sendet eine Quittungsfolge aus. Listing: « { 0 1 0 }D.TX »
LES @ Liest DTMF-Zeichen aus dem FIFO wartet unbegrenzt, siehe 2.4.3.6.
LEST @ Liest DTMF-Zeichen aus dem FIFO wartet 1 sek, siehe 2.4.3.7.
PPAR @ Printparameter
TON @ Sendet einen Quittungston aus, siehe 2.4.3.8.
END @des REM-DIR
* Programm SEL sendet eine DTMF-Steuerfolge. Diese ist zum Steuern von Geräten, die nicht im Zusammenhang mit dem Thema der Diplomarbeit stehen.
Beschreibung der Programme aus REM-DIR:
2.4.3.1 Programm REM
REM ist das Hauptprogramm zur Fernsteuerung.
Das Programm fragt in angepaßten Intervallen den DTMF-Empfänger ab; wenn die Zeichenfolge # 1 empfangen wird, schaltet das Programm auf AKTIV. #1 bedeutet Ansprechen des Peiler Nr. 1, die anderen werden entsprechend mit #2 und #3 angesprochen. Mit dem darauffolgenden Zeichen wird das fernzusteuernde Programm gewählt. Nach Ablauf des Programms ist der Peiler wieder im Stand-by. Es können z.Zt. folgende Programme angesprochen werden:
Taste 7 = SEL @ Senden einer DTMF-Zeichenfolge.
Taste 9 = TON @ Senden eines TEST-TON des Rechnerlautsprechers.
Taste # = 11 = QU @ Abbruch
Taste A = 12 = P.R @ Ferngesteuerte Peilung auf Kanal ??
Listing mit Erklärungen:
@ Programm REM
%%HP: T(2)A(D)F(.);
« 1 \-> W @ Variablenzuweisung W=weiter
« CLLCD 1 @ mit CHE auf Kanal 1 schalten
CHE 50 TX DROP 256 @ Befehl 50 mit TX an Hardware, Befehl 50 = Löschen des externen FIFO
SRECV DROP2 @ 256 Zeichen lesen = Löschen des internen FIFO
WHILE W
REPEAT
"REMOTE-BETRIEB
STAND BY
" 2 DISP @ Anzeige Display ab Zeile2
LES LEST @ LES= DTMF-Zeichen Lesen mit unbegrenzter Wartezeit, danach mit begrenzter: LES-T
@ Dies bewirkt, daß nur zwei hintereinander gesendete Zeichen zusammengefaßt werden.
2 \->LIST @ Listen von zwei Zeichen.
IF { @ Abfrage wurde Peiler # 1 angesprochen ?
12 1 } ==
THEN
"AKTIV" 4 DISP @ wenn ja, überschreibt "AKTIV" die Zeile "STAND BY"
{ 1 0 } D.TX @ Quittungston wird gesendet (DTMF-Zeichen 1 und 0)
{ 0 1 2 3 4 5 6 SEL 8 TON 10 11 QU P.R 14 15 } @ Liste mit ausführbaren Programmen
LES @ unbegrenztes Warten auf DTMF-Zeichen
1 + GET @ + 1 weil Zeichen Programm 0 an pos 1 der Liste liegt, der auszuführende Programmname wird aus
@ der Liste genommen und dupliziert, für unbelegte Zeichen sind Zahlen als Platzhalter eingeführt.
DUP "PROGRAMM: " SWAP + 6 DISP @ Anzeige des Programms im Display
EVAL @ Ausführen des Programms
{ 0 1 }D.TX @ Quittungston wird gesendet (DTMF-Zeichen 1 und 0)
END @ von IF Peiler angesprochen
END @ von While (Hauptschleife)
» @ Ende der lokalen Variablenreservierung
» @ Ende des Programms REM
2.4.3.2 DIR DTMF
Bild 56: DTMF-Monitor |
DTMF @ DIR mit DTMF-Funktionen
DIR
MONI @ DTMF-Monitor (siehe Bild 52)
LG @ Steuerfolge
D.TES @ Steuerfolge
D.TES2 @ Steuerfolge
CL.S @ Steuerfolge
MAST @ Steuerfolge
CST @ Liste
END @ des DTMF-DIR
Die Steuerfolgen LG ,D.TES, D.TES2,CL.S, MAST sind ähnlich aufgebaut:
« { DTMF Zeichen mit Space getrennt} D.TX »
@ D.TX überträgt die Zeichen
Diese Steuerfolgen sind z.Zt. nur für Tests und zur Steuerung von Geräten, die nicht im Zusammenhang mit dem Thema der Diplomarbeit stehen.
Das Programm MONI ist ein Hilfsprogramm für Einstellungsarbeiten am Modem. Es zeigt empfangene DTMF-Zeichen auf dem Display in einem durchlaufenden String an. Sollte ein Peilgerät als Zentrale benutzt werden, kann mit MONI die Richtungsanwort des ferngesteuerten Peilers gelesen werden.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm MONI
« 1 "" 0 { "D" "1" "2" "3" "4" "5" "6" "7" "8" "9" "0" "*" "#" "A" "B" "C" } \-> @ Variablenzuweisung
W S s Z
«
CLLCD "DTMF-MONITOR:" 1 DISP @ Text anzeigen
256 SRECV DROP2 @ internes FIFO Löschen
WHILE W @ Hauptschleife, Abbruch nur mit Taste CANCEL
REPEAT LES Z SWAP 1 + GET @ LES liest das DTMF-Zeichen ein, das entsprechende Zeichen wird aus der
@ Liste genommen.(Alternativ: "Z LES 1 + GET" hat den Nachteil, daß Liste beim Abbruch auf dem Stack liegt).
S SWAP + DUP SIZE 's' STO 'S' STO
@ Das Zeichen wird dem String 'S' zugefügt, die Länge des Strings steht in 's'.
IF s 22 > @ Ist der String größer als die Bildschirmbreite?
THEN S s DUP 21 -SWAP SUB 'S' STO @ ja = entferne das erste Zeichen des Strings
END @ IF
S 3 DISP @ String anzeigen
END @ von While
»
»
2.4.3.3 Programm P.R = Peil Remote
Bild 57: Remote-Directory |
Dieses Programm fragt eine zweistellige Zahl für den zu peilenden Kanal ab und sendet das Peilergebnis mit einer Nachkommastelle auf dem Steuerkanal zurück.
Listing mit Erklärungen:
@ Programm P.R
%%HP: T(2)A(D)F(.);
« 1 0 0 \-> @ Variablenzuweisung
a Z E @ a=Abbruchbedingung, E=Einer, Z=Zehner
«
WHILE a @ Kanaleingabeschleife
REPEAT
"KANAL: ??" 6 DISP @ Text in Display Zeile 6
LEST 'Z' STO @ eingeleses DTMF-Zeichen wird Z (Zehner) zugewiesen
"KANAL: " Z + "?" + @ Zeichen wird mit Text verknüpft und angezeigt
6 DISP LEST 'E' @ nächstes Zeichen wird E (Einer) zugewiesen
STO "KANAL: " Z 10
* E + + 6 DISP @ Zehner und Einer werden angezeigt.
IF E 0 \>= Z 0 \>= AND Z 10* E + 80 \<= AND Z E+ 0 > AND @ Liegt der Kanal zwischen 1 und 80?
THEN 0 'a' STO @ ja = Kanaleingabeschleife verlassen
ELSE { 0 0 0 } D.TX @ Nein = Aufforderung zur Neueingabe
END @ von IF Kanal gültig
END @ von While Eingabe
Z 10 * E + QU UPDIR CHE @ Quittung, Steuerkanal wird verlassen, Peilkanal wird aufgesucht.
FKT PEIL @ Programm PEIL wird ausgeführt.
HOME PEIL @ gleichnamiges Directory PEIL wird aufgesucht
PARA K.S CHE @ Aus dem PARA-DIR wird der Steuerkanal K.S gelesen und aufgesucht.
CLLCD DUP " WINKEL: " SWAP + " " + 4 DISP @ Winkel wird angezeigt.
HOME PEIL REM 10 * TEIL D.TX
@ Der Winkel wird mit 10 multipliziert und dem Programm TEIL übergeben, es zerlegt die 4-stellige Zahl in 4
@ Ziffern in einer Liste: 355.4°-> 3554 -> { 3 5 5 4 }, dies ist das Zeichensendeformat für D.TX.
» @ Ende der lokalen Variablenreservierung
» @ Ende des Programms P.R
2.4.3.4 Programm D.TX
Dieses Programm sendet DTMF-Zeichen aus.
Syntax: { numerisches Zeichen 1..n getrennt durch Space} z.B.: { 11 12 0 1 2 3 15 } D.TX = *,#, D,1,0,3,C
Listing:
%%HP: T(2)A(D)F(.); @ Übersetzungscode PC->HP
@ Programm D.TX:
« \-> TXLST @ Die Liste vom STACK wird einer lokalen Variablen zugewiesen.
« 52 TX @ Hardware Befehl 52 schaltet den NF-Schalter auf DTMF.
DROP @ die von TX gelieferte Antwort der Hardware wird gelöscht.
28 TX DROP @ Hardware Befehl 28 schaltet das Funkgerät auf Sendung.
.5 WAIT @ Wartezeit für den Sender (Einschwingvorgang des PLL).
1 TXLST SIZE FOR n
@ von 1 bis Ende der Zeichenliste Schleife mit Durchlauf-Zähler n (Syntax: von bis FOR n)
TXLST n GET @ Aus der Liste wird das n'te Zeichen herausgenommen.
64 +
@ 'Zeichen + 64' : Zeichen 0..15dez ergeben 64..79dez = 40..4F hex. Dies sind die Sendebefehle für das Modem.
CHR XMIT DROP
@ Das numerische Zeichen wird zum Char gewandelt z.B.: 65->"A" und zur Hardware gesendet.
.08WAIT @ 0.08sek (+ Befehlsverarbeitungszeit) Pause zwischen den Zeichen
NEXT @ Ende der For-Schleife
.1 WAIT @ 100ms Pause, bevor der Sender ausgeschaltet wird
17 TX DROP @ Sendung beenden
53 TX DROP @ NF-Umschalter auf Mikrofon
256 SRECV DROP2 @ Löschen des internen FIFO
» @ Ende der Variablenreservierung
» @ Ende von D.TX
2.4.3.5 Programm TEIL
Das Programm konvertiert 4-stellige Zahlen in eine Liste.
z.B.: die Zahl 2456 in { 2 4 5 6 }
Listing:
%%HP: T(2)A(D)F(.);
@ Programm: TEIL
« { } \-> li @ Zuweisung der lokalen Variablen li vom Typ Liste
« 1 4 START @ Schleife von 1 bis 4
10 / DUP FP @ Zahl wird durch 10 geteilt und mit FP die Nachkommastelle abgefragt.
10 * 'li' STO+ @ Die Nachkommastelle wird am Anfang der Liste angefügt.
IP @ Die Ziffern vor dem Komma verbleiben auf dem Sack durch den nächsten Schleifendurchlauf.
NEXT @ Ende der Schleife
DROP li @ Am Ende des Programms liegt die Liste auf dem Stack.
» @ Ende der Variablenreservierung
» @ Ende von TEIL
2.4.3.6 Programm LES
Dieses Programm liest ein DTMF-Zeichen aus dem FIFO des Modems; ist das FIFO leer, wartet LES unbegrenzt auf ein empfangenes Zeichen.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm LES
«
WHILE 49 TX 16 - DUP 0 < @ 49 TX 16 - liefert das DTMF-Zeichen (0..15), bei leerem FIFO ist die Zahl negativ
REPEAT DROP .25 WAIT @ Zahl negativ: Zahl löschen und 0.25sek warten
END @ Zahl positiv: nicht warten, Zeichen liegt nach Ende des Programms auf dem Stack.
»
2.4.3.7 Programm LEST
Dieses Programm liest ein DTMF-Zeichen aus dem FIFO des Modems; ist das FIFO leer, wartet LES noch
ca. 2 sek auf ein empfangenes Zeichen.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm LEST
« 0 \-> n
«
WHILE 49 TX 16 - DUP 0 < @ gleiche Funktion wie bei LES, siehe oben
'n' INCR 20 < AND @ Das FIFO wird 20 mal abgefragt.
REPEAT DROP .01 WAIT @ kein Zeichen im FIFO: [0.01sek + Verarbeitungszeit] warten
END @ Ist das FIFO bis zum Ende von LES-T leer geblieben, hinterläßt LES-T eine negative Zahl auf dem Stack.
»
»
2.4.3.8 Programm TON
@ Sendet einen Quittungston aus
Listing:
%%HP: T(2)A(D)F(.);
@ Programm TON
« 54 TX DROP 28 TX DROP .3 WAIT 1400 .05 BEEP .09 WAIT 1400 .05 BEEP .05 WAIT 17 TX DROP »
@ 54 TX = NF-Schalter auf NF-Ausgang des Taschenrechners, 28 TX = Sendung, 17 TX Ende der Sendung
2.4.4 Timerbetrieb
Bild 58: Timer-Directory |
Das TIM-DIR enthält folgende Elemente:
TIM
DIR
EXIT @ Verlassen des DIR
AL15 @ Messung alle 15 Min
DEL.A @ Messungen beenden
NEU @ Meßprotokoll löschen
SEDA @ Meßprotokoll senden
CST @ Liste mit CST-Tasten:
@{ EXIT AL15 DEL.A NEU SEDA}
TABELLE.TXT @ Meßprotokoll: Exel lesbarer ASCII-Text *
T.P @ Timergesteuerte Peilung
END
* Auszug aus Tabelle.txt:
"Meßwerte:
Winkel Zeit Tag UB S-WERT Temp.
89.3° 13.00 5.05 13.3V 164 28.6°C
89.3° 20.57 5.07 13.3V 166 31.2°C
"
Beschreibung der Programme aus TIM-DIR:
2.4.4.1 Programm AL15
Zeitgesteuerte Peilung alle 15 Minuten.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm AL15
@ Syntax für Befehl STOALARM: { Datum Zeit 'Zu startendes Programm', alle_x_Minuten_*491520 }
« DATE TIME 3 TRNC .001 + @ erster Start 1 sek nach Aufrufen des Programms
'T.P' 15 491520 * @ Zu startendes Programm , alle 15 Minuten
4 \->LIST @ 4 Elemente einlisten
STOALARM OFF. @ Alarm speichern und ausschalten
»
2.4.4.2 DEL.A
Messungen beenden, der Alarm wird gelöscht
Listing:
%%HP: T(2)A(D)F(.);
@ Programm DEL.A
« 1 IFERR DELALARM @ Lösche Alarm Nr. 1; tritt dabei ein Fehler auf, gib Fehlermeldung aus.
THEN DROP "Der ALARM ist bereits gelöscht!"
DOERR
END
»
2.4.4.3 NEU
Das Programm NEU löscht das Meßprotokoll und schreibt eine neue Kopfzeile.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm NEU
« "Meßwerte:
Winkel Zeit Tag UB S-WERT Temp.
@ Einträge sind durch TAB getrennt, Exel kann dieses Format lesen.
"
'TABELLE.TXT' STO
»
2.4.4.4 SEDA
SEDA sendet das Meßprotokoll und Bootlog.txt mit Kermitprotokoll zum PC.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm SEDA
« -33 CF @ auf RS232-Schnittstelle schalten
'TABELLE.TXT' SEND @ SEND ist ein Befefehl des Rechners für die Kermitübertragung.
HOME PEIL PARA @ Pfad für Bootlog.txt
'BOOTLOG.TXT' SEND
HOME PEIL TIM -33 SF @ Zurückschalten auf Infrarot-Schnittstelle
»
2.4.4.5 T.P
Timergesteuerte Peilung.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm T.P
« 8 CHE 23 TX DROP CLLCD @ Kanal 8 , Befehl 23= Dopplertakt EIN
"WARMLAUFEN" 2 DISP @ Text in Zeile 2 anzeigen
@ Syntax für FOR-Schleife: [Startwert] [Endwert] FOR [Index ] [....Programm....] [Schrittweite] STEP
10 0 FOR a @ Herunterzählen der Sekunden in Zeile 4 anzeigen
"Zeit: " a + "sek" + 4 DISP 1 WAIT
-1 STEP @ Schrittweite = -1 sek
"" 4 DISP
256 SRECV DROP2 Löschen des internen FIFO
HOME PEIL @ PEIL-DIR
FKT PEIL @ PEIL-Programm
DUP 1 FIX 5 DISP @ Peilung in Zeile 5 anzeigen
"°" + STD @ Aufbau des Meßprotokoll-Textes, Trennung durch TAB
" " + 2 FIX TIME + STD
" " + DATE 2 TRNC +
" " + 32 TX 10 / + "V" + @ 32 = Betriebsspannung mit einer Nachkommarstelle
" " + 37 TX + @ 37= S-Wert 0..255
" " +
40 TX \-> X '2.9417*X^.4328' EVAL 1 FIX + STD @ Berechnen der Temperatur, Formel für TMP-Fühler
"°C" + " " + HOME PEIL TIM @ Zurück in des TIM-DIR
TABELLE.TXT SWAP + @ Text wird am Ende des Protokolls angefügt.
'TABELLE.TXT' STO
OFF. @ Der Peiler wird bis zum nächsten Alarm ausgeschaltet.
» @ Ende von T.P
2.4.5 Richtungsbestimmung
Das FKT-DIR besteht aus folgenden Elementen:
FKT
DIR
PEIL @ Peilprogramm, siehe 2.4.5.1
WBS @ Winkelbestimmung, siehe 2.4.5.2
MESS @ Einlesen der Meßwerte für die Peilung, siehe 2.4.5.3
END
Beschreibung der Programme aus dem FKT-DIR:
2.4.5.1 PEIL
Beschreibung: Das Programm ruft die Programme MESS (Peilwerte einlesen) und WBS (Winkelbestimmung) auf. Es aktualisiert das Display im Textmode als auch im Grafikmode. Dies ist notwendig, weil PEIL von Programmen aufgerufen wird, die in beiden Betriebsarten arbeiten.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm PEIL
« 23 TX DROP CLLCD @ Dopplertakt EIN
" PHASENMESSUNG:" 2 DISP @ Text in Display (Textmode)
PICT { # 60d # 50d }"PHASENMESSUNG: " 1 \->GROB REPL @ Text in Display (Grafikmode)
256 SRECV DROP2 @ Löschen des FIFO
{ 0 0 0 0 } @ Liste für die folgende Schleife
1 5 START @ Schleife zum Mitteln der Messungen (von 1 bis 5 ohne Schleifenindex)
MESS @ MESS liefert Y-Werte der Doppler Sin-Kurve z.B.:{ 1 0 -1 0 }
DUP 2 RND \->STR DUP SIZE 2 - 3 SWAP SUB 4 DISP @ Werte in Display (Textmode)
@ Liste wird gerundet, in eine Zeichenkette gewandelt und die Klammern werden entfernt.
NEG - @ Die Liste von MESS wird zu der Liste vom Stack addiert z.B.: {0 0 0 0} + {1 0 -1 0 }= { 1 0 -1 0 }
NEXT @ Nach Durchlaufen der Schleife liegt der 5-fache Mittelwert auf dem Stack.
5 / DUP 2 RND 3 DISP @ Der Mittelwert der Y-Liste wird in Zeile 3 angezeigt.
PICT { # 60d # 50d } "WINKELBESTIMMUNG:" 1 \->GROB REPL WBS @ Text vor Aufrufen von WBS
»
2.4.5.2 WBS Programm Winkelbestimmung
Beschreibung: Dieses Programm ermittelt durch suggestive Aproximation die Verschiebung der Sinuskurve für die vorliegende Liste mit Y-Werten :{ sin(0°+ß) sin(90°+ß) sin(180°+ß) sin(270°+ß) }. Gesucht ist der Winkel ß, die numerischen Winkel in der Liste entsprechen den Antennenpositionen in der Kreisgruppe, ausgehend von der Frontrichtung. Die Antennen liefern einen ihrer Position entsprechenden Dopplerhub, Antenne n liefert:
sin[(n-1)*90°+ß]. Der Maximalhub wird bereits beim Einlesen von dem Programm MESS auf 1 normiert.
Beispiele:{ 0 1 0 -1 } WBS -> ß = 0°, { 1 0 -1 0 } WBS-> ß = 90°, { .68 .73 -.68 -.73 } WBS -> ß = 42.9°
Zur Bestimmung von ß erzeugt WBS eine Prüfliste mit gleichem Aufbau, für a = ß ist die Differenz der Listenwerte gleich null. RPL Syntax: { A B C D } - { E F G H } = { A-E B-F C-G D-H } = Differenzliste
{ Liste mit Meßwerten} - { Liste mit Testwerten }
{ sin(0°+ß) sin(90°+ß) sin(180°+ß) sin(270°+ß) } - { sin(0°+a) sin(90°+a) sin(180°+a) sin(270°+a) }
Die Summe der Absolutwerte von den Elementen der Differenzliste wird als vertikale Abweichung 'abw' gespeichert. Beim Minimum von abw ist a gleich dem gesuchten Winkel ß. Dieses Verfahren eignet sich auch für stark verrauschte Dopplersignale.
Bild 59: Suggestive Approximation |
Vorgehensweise der Approximation: Der gesuchte Winkel sei ß = 42.89°
Variablen: |
a.i [°] |
a.o [°] |
abw.o |
a.u [°] |
abw.u |
a.m[°] |
Durchlauf 1: |
180 |
180 |
4.82 |
0 |
1.9 |
0 |
Durchlauf 2: |
90 |
90 |
2.1 |
-90 |
4.82 |
90 |
Durchlauf 3: |
45 |
135 |
2.93 |
45 |
0.1 |
45 |
- - - - - - - - - - |
- - - - - - - - - - |
- - - - - - - - - - |
- - - - - - - - - - |
- - - - - - - - - - |
- - - - - - - - - - |
- -- - - - - - - - |
Durchlauf 17 |
0.00275 |
42.898 |
0.00654 |
42.893 |
0.00652 |
42.893 |
Die zum Winkel a.o gehörige vertikale Abweichung liegt in abw.o, die von a.u in abw.u. Die Abweichungen abw.o und abw.u werden miteinander verglichen, der kleinere Wert bestimmt den neuen Winkel a.m.
Von diesem ausgehend, werden jeweils mit der Hälfte des vorhergehenden Suchbereiches a.i zwei neue Werte für a.u und a.o gebildet.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm WBS
« { 0 90 180 270 } 1 1 180 0 180 0 \-> @ Zuweisung der lokalen Variablen
Y.lst X.lst abw.o abw.d a.o a.u a.i a.m
@ Y.lst vom Stack, X,lst = Liste mit Antennenpositionen
« CLLCD " WINKELBESTIMMUNG" 4 DISP @ Text in Display
WHILE a.i .005 > @ Abbruchbedingung: Suchbereich a.i kleiner als 0.05°
REPEAT
a.o X.lst ADD SIN @ Erzeugen der Prüfliste für a.o
Y.lst - ABS \GSLIST 'abw.o' STO
@ Differenzliste, Summe der absoluten Abweichungen werden in abw.o abgelegt.
a.u X.lst ADD SIN @ Der gleiche Vorgang nun mit der Variablen a.u
Y.lst - ABS \GSLIST 'abw.d' STO
abw.o abw.d < a.o a.u IFTE 'a.m' STO
@ Vergleich der Abweichungen, der günstigere Winkel wird a.m zugewiesen.
a.i 2 / 'a.i' STO @ Der Suchbereich a.i wird für den nächsten Durchlauf halbiert.
a.m a.i + 'a.o' STO @ Erzeugen der neuen Winkel für den nächst kleineren Approximationsschritt
a.m a.i - 'a.u' STO
END @ von While
a.m 1 RND @ Winkel auf 1-Stelle gerundet
DUP IF 0 < THEN 360 + END @ Wandeln von negativen Winkeln
»
» @ Ende von WBS
2.4.5.3 Programm MESS
Beschreibung: Dieses Programm liest die 4 Dopplerspannungen ein, sie werden mit einem Korrekturfaktor versehen und normiert.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm MESS
« 1 4 FOR n 32 n + TX @ Hardwarebefehle 33..36 Dopplerspannungen 1..4 Einlesen
127 - 123 / @ grobe Normierung 0..255 -> -1..+1
IF DUP 0 < THEN 1.067 * END @ Anpassung an das ZF-Filter*
NEXT 4 \->LIST Meßwerte einlisten
DUP \GSLIST 4 / - @ Normierung 1: Summe aller Y-Werte der sin-Funktion = 0
DUP ABS \GSLIST / 2 * @ Normierung 2: Summe aller absoluten Y-Werte der sin-Funktion = 2
»
* Die Normierung ist notwendig, um Approximierungsfehler bei verrauschten Funktionswerten zu reduzieren.
Der Empfänger liefert bei einem Dopplersprung gleicher Größe in negativer Richtung eine geringere Amplitude der NF, nach Quelle1 sind Laufzeitunterschiede im ZF-Filter eine mögliche Ursache dafür.
2.4.6 Hilfsprogramme :
2.4.6.1 Programm OFF.
Beschreibung: Programm zum Ausschalten des Peilers, beim Einschalten ruft dieses Programm Reset und Selbsttest auf.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm OFF
« PATH \-> P @ Der Pfad, aus dem OFF. aufgerufen wurde, wird P zugewiesen.
« -33 SF BUFLEN DROP @ Bufflen liefert die Zahl der Zeichen im internen FIFO.
SRECV DROP2 @ Die Zeichen werden als zusammenhängende Zeichenkette ausgelesen und gelöscht.
HOME PEIL PARA 9 'K' STO @ Beim Einschalten steht das Funkgerät auf Kanal 9.
16 TX DROP 0 TX DROP @ 16 TX = Ausschaltbefehl für die Hardware, 0 TX =7-Segmentanzeigen auf 00
P EVAL OFF
@ Zurückverfolgen des Pfades, aus dem das Programm aufgerufen wurde, und Ausschalten des Rechners.
@ Das Programm bleibt im ausgeschalteten Zustand an dieser Stelle stehen.
RESET S.TST 1 MENU
@ Beim Einschalten werden Reset und Selbsttest ausgeführt, CST-Menu wird aufgerufen.
»
»
2.4.6.2 DIR ANZ
@ DIR mit Programmen zur Anzeige verschiedener Meßwerte:
Das ANZ-DIR enthält folgende Elemente:
ANZ
DIR
EXIT @ Programm zum Verlassen des DIR
G.S @ Programm zur graphischen Spektrumanzeige
MESS. @ Programm zum Anzeigen des Dopplerverlaufes A1..A4
MES2 @ Programm zur Anzeige von S, Ub, HF, REV, Temp, FQ
MES3 @ Programm zur graphischen Anzeige des Dopplerverlaufes
CST @ Liste
\GSPAR @ Parameter des Rechners zur graphischen Anzeige
\GSDAT @ Parameter des Rechners zur graphischen Anzeige
S.TAB @ Tabelle mit Signalstärken der 80 Kanäle
PPAR @ Printparameter
SPEC @ Programm zum Abfragen der Kanalbelegung
S.WER @ Programm zur Anzeige des S-Wertes
END
Beschreibung der Programme aus dem ANZ-DIR:
2.4.6.2 Programm G.S
Bild 60: Spektrumanzeige |
Programm: 'Grafische Spektrumanzeige' dient zum Auffinden eines Trägers.
Es durchläuft die Kanäle und stellt die Signalstärke mit einen Balken entsprechender Länge dar. Liegt der S-Wert über einer selbstregelnden Schaltschwelle, wird der numerische Kanal an den Peak geschrieben. Zur besseren Übersichtlichkeit sind die Kanäle zu 10er-Blöcken zusammengefaßt.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm: Spektrumanzeige G.S
« @ Zuweisung der lok. Variablen:
@ h Schwelle f r Peakanzeige (Kanal an den Peak, max. 3 Kanäle)
-1 0 0 { # 0d # 0d } -15 100 0 0 0 1 \->
z J s pl letzt sw durch x h weiter
«
1 CHE { # 0d # 0d } PVIEW ERASE @ 1 CHE = auf Kanal 1 schalten
WHILE weiter REPEAT @ Hauptschleife, Abbruch durch beliebige Taste
-15 'letzt' STO @ Variablen werden nach einem 80 Ch.-Durchlauf zurückgesetzt.
36 'x' STO @ x= horizontale Position des Balkens auf dem Schirm
0 'durch' STO
-1 'z' STO
@ Bildschirmausschnitt mit Balkendiagramm wird gesichert
PICT PICT { # 37d # 5d } { # 123d # 63d } SUB
ERASE { # 37d # 5d } SWAP REPL
{ # 29d # 0d } { # 29d # 63d } LINE
{ # 20d # 0d } { # 20d # 63d } LINE
@ 2 Skalen von 0..9+ werden gezeichnet
0 1 FOR o
1 9 FOR p
PICT { # 32d } o 94 * R\->B ADD 65 p 6 * - R\->B + p STR 1 \->GROB REPL
NEXT
PICT { # 32d # 5d } o 94 * R\->B { # 0d } + ADD "+" 1 \->GROB REPL
NEXT
@ Texte werden in die Grafik eingefügt
PICT x R\->B # 14d - 62 sw 4 / - R\->B 'h' STO h # 2d - 2 LIST "S " 1 \->GROB REPL
PICT { # 0d # 0d } "DATE:" 1 \->GROB REPL
PICT { # 0d # 6d } DATE 2 TRNC 2 FIX STR 1 \->GROB REPL
PICT { # 0d # 13d } "TIME:" 1 \->GROB REPL
PICT { # 0d # 19d } TIME 2 TRNC STR STD 1 \->GROB REPL
PICT { # 0d # 26d } "SWTC:" 1 \->GROB REPL
PICT { # 0d # 32d } sw STR 1 \->GROB REPL
@ 80-Kanalschleife,
@ Signalstärken der einzelnen Kanäle werden in Balken gewandelt.
1 80 FOR u
@ Texte:
PICT { # 0d # 39d } "CHAN:" 1 \->GROB REPL
PICT { # 0d # 45d } u STR 1 \->GROB REPL
PICT { # 0d # 52d } "S:" 1 \->GROB REPL
PICT { # 0d # 58d } s 1000 / 3 FIX STR STD TAIL TAIL 1 \->GROB REPL
@ Nach je 10 Kanälen wird eine Lücke eingefügt, um das Ablesen zu erleichtern.
IF 'z' INCR 10 ==
THEN 0 'z' STO
PICT 'x' INCR R\->B { # 5d } + # 1d # 59d BLANK REPL
END
@ Lesen der Signalstärke s
u CHE "%" XMIT SRECV DROP NUM 's' STO
@ Löschen des alten und Einfügen des neuen Balkens
PICT 'x' INCR R\->B { # 5d } + # 1d # 59d BLANK REPL
x R\->B 'J' STO J { # 63d } + DUP { # 0d } s 4 / R B + - DUP 'pl' STO LINE
@ Anzeige der Leseposition in Höhe des Schwellwertes für Peakanzeige
x R\->B # 1d + h 2 LIST PIXON
@ Ist die gelesene Stärke größer als die Schwelle, wird der Kanal an den Peak geschrieben.
IF s sw THEN 'durch' INCR DROP
@ Um das Überschreiben von Zahlen zu verhindern, werden Mindestabstände
@ von einer Zahlenbreite (= 7 Kanäle) festgelegt.
IF u letzt 7 + > THEN
PICT J { # 0d } + u "" + 1 \->GROB REPL
u 'letzt' STO
END
END
@ Abbruchbedingung:
IF KEY THEN 0 'weiter' STO 80 'u' STO END
NEXT
@ Nachstellen der Anzeigeschwelle:
@ Ziel ist es, im Durchschnitt die 3 stärksten Peaks mit
@ ihrer Frequenz (Kanal) anzuzeigen.
durch CASE DUP 3 < THEN 'sw' -10 STO+ END
3 > THEN 'sw' 10 STO+ END
END
END DROP2
»
» @ Ende des Programms G.S
Die Programme: MESS., MES2, MES3, S.TAB, SPEC, S.WER sind nur für Abgleich und Testzwecke, sie sind nicht direkt für den Peilbetrieb notwendig, darum ist die Beschreibung nur in Form des Listings enthalten, siehe Anhang 5.1.
2.4.6.3 DIR FUNK
DIR mit Programmen zum Steuern des Funkgerätes. Die Funktionen dieses DIR entsprechen denen der QSOSHELL, mit dem Unterschied, daß hier ohne Graphik gearbeitet wird. Die Programme sind dadurch kürzer und werden dementsprechend schneller ausgeführt.
Das FUNK-DIR besteht aus folgenden Elementen:
Syntax: Name «Programmbefehle» @ Kommentar
FUNK
DIR
EXIT « UPDIR »
SEND. « " " XMIT DROP "SENDEN" 1 DISP 1 FREEZE » @ schaltet Funkgerät auf Sendung
EMPF. « " " XMIT DROP » @ schaltet auf Empfang
UP « UPDIR PARA K 1 + IF DUP 80 > THEN 80 - END CHE UPDIR FUNK » @ Kanal auf
DOWN « UPDIR PARA K 1 - IF DUP 1< THEN 80 + END CHE UPDIR FUNK » @ Kanal ab
AFM « 25 TX DROP 17 TX DROP» @ schaltet AM-FM um
STB.1 « 19 TX DROP » @ Lautsprecher aus
STB.0 « 18 TX DROP » @ Lautsprecher ein
ATT.1 « 21 TX DROP » @ Abschwächer ein
ATT.0 « 20 TX DROP » @ Abschwächer aus
MIC « 53 TX DROP 22 TX DROP 18 TX DROP 20 TX DROP » @ NF-Schalter auf MIC
END @ des FUNK-DIR
2.4.6.4 IO
DIR mit Programmen für Tests und Systemeinstellungen.
Syntax: Name @ Kommentar
Das IO-DIR besteht aus folgenden Elementen:
IO
DIR
EXIT @ Verlassen des DIR
ZEICHEN @ Tabelle mit Sonderzeichen zur Kontrolle der Übersetzung HP48-> PC
HELP @ Helpfile mit Hardwarebefehlen, ruft den Editor auf
BACK @ sendet ein Backup des PEIL-DIR zum PC
P.DIS @ sendet für Dokumentationszwecke den Inhalt des Displays zum PC
ABGL @ sendet eine lange Nullfolge zur Hardware, wird zum Abgleich der Taktfrequenz des IO benötigt
C80U @ schaltet das Funkgerät 80 ch auf, TEST der maximalen Schaltgeschwindigkeit des Funkgerätes
C80D @ schaltet das Funkgerät 80 ch ab, TEST der maximalen Schaltgeschwindigkeit des Funkgerätes
IO.Z @ sendet Zeichenfolge 00..FF zur Hardware
RX @ löscht das interne FIFO
PPAR @ Printparameter
END @ vom IO-DIR
Programme des IO-DIR, Listing:
Syntax: Name «Programmbefehle» @ Kommentar
EXIT « UPDIR »
@ Für den Inhalt von ZEICHEN, HELP siehe Anhang 5.1
BACK « -33 CF HOME 'PEIL' SEND -33 SF » @ -33 = Flag zur Umschaltung der Schnittstelle
P.DIS « -33 CF -34 SF PICT RCL PR1 DROP » @ -34 = Flag Drucken auf RS232 ( zum PC )
ABGL « 1 500 FOR i 0 CHR XMIT DROP NEXT » @ sendet 500x Zeichen Null
C80D « 1 80 START " " XMIT DROP .015 WAIT NEXT 260 SRECV DROP2 »
@ wartet 0.015s auf Funkgerät
C80U « 1 80 START "-" XMIT DROP .015 WAIT NEXT 260 SRECV DROP2 »
@ wartet 0.015s auf Funkgerät
IO.Z « 1 255 FOR i i CHR XMIT DROP NEXT »
RX « 256 SRECV DROP » @ internes FIFO: Größe = 255 Zeichen
PPAR {(-6.5,-3.1) (6.5,3.2) X 0 (0,0) FUNCTION Y } @ entstehen beim Drucken des Displays
2.4.6.5 PARA
DIR mit Globalen Variablen und Text
PARA
DIR
K @ enthält Dezimalzahl 1..80; die dem augenblicklich eingestellten Funkkanal entspricht.
K.S @ enthält Dezimalzahl 1..80; die dem Steuerkanal zur Zentrale entspricht.
BOOTLOG.TXT @ ASCII-Text mit Fehlermeldungen des Selbsttestes beim Einschalten
END
Auszüge aus dem Bootlog.txt, Text1 enthält alle Fehler; die erkannt werden könnten; Text2: ohne Fehler:
*****SELBST-TEST******
FRI 05/31/96 05:01:49P
ERRORS:
+12V @ Versorgungsspannungen
+5V
-6V
STB ON @ Überprüfung der Schalter
STB OFF
ATT ON
ATT OFF
TKT ON
TKT OFF
TX-SW
AD-MAX @ Test des A/D-Wandlers mit 5V und 0V
AD-MIN
HF-DET @ Test des Meßverstärkers für HF-Power
REV-DET
HF-PWR @ Sendeleistung
SWR-ANT @ Reflexion der Antenne
DTMF IO @ Modem nicht adressierbar
*********END**********
*****SELBST-TEST******
WED 06/05/96 09:25:31A
ERRORS: NON
*********END**********
Mehr hierzu im Abschnitt 2.4.6.9 S.TST
2.4.6.6 Programm RESET
Beschreibung: Programm zum Rücksetzen des Peilgerätes
Listing:
%%HP: T(2)A(D)F(.);
@ Programm RESET
« 16 TX DROP PATH \-> P @ 16 TX=Hardware AUS, der Pfad wird P zugewiesen
« CLLCD TEXT @ Display Löschen, Grafikmode aus
HOME PEIL PARA @ PARA-DIR aufsuchen
" RESET " 4 DISP @ Textanzeige
3.5 WAIT @ 3.5 sek nach dem Ausschalten des Funkgerätes hat der Prozessor keine Spannung mehr, um den
@ eingestellten Kanal zu speichern, Defaultkanal beim Einschalten ist Kanal 9 AM.
9 'K' STO @ Kanal 9 wird in PARA gespeichert. Alle Programme, die den Kanal ändern, müssen K aktualisieren.
19 TX 17 TX DROP2 @ STB EIN
25 TX DROP 22 TX DROP @ FM-Mode, Dopplertakt AUS
50 TX DROP 53 TX DROP @ FIFO des Modems löschen, NF-Schalter auf Mikrofon
K.S CHE 0 TX @ Das Gerät wird auf den Steuerkanal zur Zentrale K.S geschaltet. 7-Segment auf 0
256 SRECV CLEAR @ Löschen des FIFO und des Stack
P EVAL @ zurück in das DIR, aus dem RESET aufgerufen wurde.
»
» @ Ende von RESET
2.4.6.7 Programm TX
Programm zum Senden von Befehlen zur Hardware.
Syntax beim Aufrufen:
1) Befehl dezimal + (16 * Adresse dezimal ) auf den Stack1
2) TX
3) dezimale Antwort der Hardware (0..255) liegt in Stack1
Listing:
%%HP: T(2)A(D)F(.);
@ Programm TX
« \-> x
« x CHR XMIT DROP @ Die zu sendende Zahl wird als Zeichen gewandelt und übertragen, z.B.: 65 -> "A"
1 SRECV @ ein Zeichen wird aus dem internen FIFO gelesen, ist es nach einer kurzen Wartezeit noch leer,
@ hinterläßt SRECV eine 0 in Stack:1 und einen leeren Text ("") in Stack:2.
@ Befand sich ein Zeichen im FIFO so steht im Stack:1 eine 1 und in Stack:2 das gelesene Zeichen, z.B.:"A".
IF THEN NUM @ Die fehlende Bedingung vor dem THEN wird von Stack:1 genommen, das empfangene
@ Zeichen wird mit NUM in eine Dezimalzahl gewandelt.
ELSE DROP x ERHAND
@ Wenn kein Zeichen empfangen wurde, wird das Problem x dem Errorhandler übergeben.
END @ zum ERHAND siehe Abschnitt 2.4.6.11
»
»
2.4.6.8 Programm CHE
Beschreibung: Programm CHE dient zum Schalten des Funk-Kanals. CHE nimmt den Zielkanal vom Stack. Durch die umlaufende Kanalschaltung ist es möglich, den Zielkanal durch Rauf - oder Runterschalten des Kanals zu erreichen. CHE wählt, ausgehend vom eingestellten Kanal, den kürzesten Weg zum Zielkanal.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm CHE
«
0 PATH \->
z k pa @ Variablenzuweisung z = Zielkanal vom Stack
« HOME PEIL PARA K 'k' STO @ k = Ist-Kanal
CLLCD " Kanal:" z + 4 DISP @ Textanzeige mit Zielkanal
IF z 80 > z 1 < OR THEN @ Kanal ungültig?
" Eingaben ch: 1..80!" 1 DISP 1000 .5 BEEP 1 WAIT
k 'z' STO @ alter Kanal bleibt eingestellt
END
@ Es folgt die Richtungsentscheidung.
CASE
z k < THEN
IF k z - 40 <
THEN 1 k z - START "" XMIT DROP .015 WAIT NEXT
ELSE 1 80 k - z + START "-" XMIT DROP .015 WAIT NEXT
END @ von IF
END @ von THEN (CASE)
z k >THEN
IF z k - 40 <
THEN 1 z k - START "-" XMIT DROP .015 WAIT NEXT
ELSE 1 80 z - k + START "" XMIT DROP .015 WAIT NEXT
END @ von IF
END @ von THEN (CASE)
END @ von CASE
BUFLEN DROP SRECV DROP2 @ FIFO löschen
z 'K' STO pa EVAL @ Neuer Kanal wird aktualisiert.
»
»
2.4.6.9 Programm S.TST
Programm zum Selbsttest des Peilgerätes
Listing:
%%HP: T(2)A(D)F(.);
@ Programm S.TST
«
@ Prozedur ANZEIGEN (anz) wird nicht ausgeführt, sondern einer lokalen Variablen 'anz' zugewiesen.
« \-> ja txt rol @ ja = Testergebnis (1 = OK) , txt = Name des Testobjektes, rol = Anzeige rollen
« 256 SRECV DROP2 @ FIFO löschen
IF ja THEN txt " : OK" + 5 .1
@ "Name des Testobjektes :OK" = Anzeigetext, 5 .1 = Frequenz in [Hz] und Dauer in [sek] des Signaltons
ELSE 1 SF txt " : FAILED!" + 1400 .2 @ "Name :FAILED!" = Anzeigetext, 1400 .2 = Parameter des Signaltons
@ Flag 1 steuert am Ende des Testes die "TEST: OK/FAILED" Anzeige (Gesamtauswertung).
BOOTLOG.TXT txt DUP "\CR" POS txt SIZE SUB + 'BOOTLOG.TXT' STO
@ Mit dem Befehl "\CR" POS wird der letzte Zeilenumbruch gesucht. Die letzte Zeile von txt (Name, bei dem
@ der Fehler auftrat) wird dem Bootlog.txt angefügt. (für \CR ist ein Zeilenumbruch einzusetzen).
END
BEEP + 'txt' STO @ BEEP nimmt die Parameter vom Stack. Die Namen der zuvor getesteten Elemente und der
@ neu anzufügende Text liegen auf dem Stack, sie werden addiert und txt zugewiesen.
@ Die Rolloption ist notwendig, weil der HP von sich aus nicht rollt. Von einem Text der Schriftgröße 2 werden
@ jeweils die ersten 7 Zeilen angezeigt.
IF rol @ Wenn Option Rollen gesetzt ist, wird die erste Zeile von txt entfernt.
THEN txt DUP "\CR" POS 1 + txt SIZE SUB
ELSE txt
END
DUP 1 DISP @ Kopie des Textes anzeigen, der Text verbleibt für den nächsten Durchlauf im Stack
»
» @ Ende der Prozedur anz
@ Prozedur test
« \-> sen info s « sen LES.IO info GET s == » »
@ sen = Adresse des Testobjektes, info = zu testendes Bit (1..8), s = Sollwert (1 oder 0)
@ Test schreibt 1 für OK und 0 für False auf den Stack.
@ Anfang des Hauptprogramms S-TEST:
"" PATH \-> @ Variablenzuweisung
anz test str path
«
CLLCD HOME PEIL PARA 1 CF @ Pfaht für Bootlogtext, Flag 1 Rücksetzen = kein Fehler aufgetreten
"SELBST-TEST:" DUP 1 DISP @ Kopie der Überschrift in Zeile 1 anzeigen
BOOTLOG.TXT " @ Textkopf mit Datum und Uhrzeit für den Bootgoltext erstellen:
*****SELBST-TEST******
" + DATE TIME TSTR + "
ERRORS: " + 'BOOTLOG.TXT' STO
17 8 1 test EVAL " @ 17,8,1 = Parameter für 'test' (siehe oben: 'test') , EVAL = Prozedur ausführen
+12V " 0 anz EVAL @ [ "\CR +12V" = Anzeigetext , 0 = nicht rollen ] Parameter für anz
@ Die folgenden 9 Programmteile haben den gleichen Aufbau,
17 3 1 test EVAL " @ die Aufgabe ist jeweils dem Anzeigetext zu entnehmen:
+5V " 0 anz EVAL
17 1 1 test EVAL"
-6V " 0 anz EVAL
18 7 0 test EVAL "
STB OFF" 0 anz EVAL
19 7 1 test EVAL "
STB ON " 0 anz EVAL
20 6 0 test EVAL "
ATT OFF" 0 anz EVAL
21 6 1 test EVAL "
ATT ON " 1 anz EVAL
20 TX DROP @ 20 = Abschwächer ausschalten
22 5 0 test EVAL "
TKT OFF" 1 anz EVAL
23 5 1 test EVAL "
TKT ON " 1 anz EVAL
28 4 1 test EVAL "
TX SW " 1 anz EVAL
@ Es folgen 7 Tests, die nicht durch die Prozedur 'test' ausgeführt werden:
17 TX DROP .5 WAIT 42 TX 255 == " @ AD-Max = 255 ?
A/D-MAX" 1 anz EVAL
45 TX 0 == " @ AD-Min = 0?
A/D-MIN" 1 anz EVAL
38 TX 3 < " @ HF bei Empfang < 3 ?
HF-DET " 1 anz EVAL
39 TX 3 < " @ REV bei Empfang < 3 ?
REV-DET" 1 anz EVAL
22 TX DROP 28 @ 22 = Dopplertackt aus, 28 = auf Sendung schalten
TX DROP .4 WAIT 38 @ Sendeleistung > 225 ?
TX 225 > "
HF-PWR " 1 anz EVAL
39 TX 120 < " @ REV im Sendebetrieb < 120 ?
SWR-ANT" 1 anz EVAL
50 TX DUP @ 50 = FIFO des Modems löschen (Antwort < 16 ?)
16 < SWAP 32 +
56 TX == AND " @ 56 = Test der Modem-Adressierung (alte Antwort+32 = neue Antwort ?)
DTMF-IO" 1 anz EVAL
17 TX DROP 2 WAIT DROP CLLCD @ Grundeinstellung, Display löschen
BOOTLOG.TXT @ auf den Stack
IF 1 FC? @ Gesamtergebnis des Testes anzeigen:
THEN " SYSTEM OK" 4 DISP "NON" + 1000 .05 BEEP 1500 .05 BEEP 1 WAIT
@ Errors: "NON" zum Bootlogtext hinzufügen
ELSE " TEST FALSE" 4 DISP 100 1 BEEP 2 WAIT
END
"
*********END**********
"
+ 'BOOTLOG.TXT' STO
1 CF path EVAL @ Flag zurücksetzen und zum DIR zurückkehren, aus dem S-TST aufgerufen wurde
»
» @ Ende von S-TST
2.4.6.10 Programm LES.IO
Programm zum Einlesen und Konvertieren der Systemantwort. Dieses Programm wird neben anderen von
S-TST aufgerufen. Syntax:
16*Sendeadresse+Befehl auf Stack1, LES.IO, Antwort der Hardware als 8x1 Array auf den Stack,
z.B.: 17 LES.IO --> Antwort: [ 1 0 0 1 1 0 1 1 ]
Listing:
%%HP: T(2)A(D)F(.);
@ Programm LES.IO
« [ 0 0 0 0 0 0 0 0 ] 9 0 \->
ST AR P z
« ST TX @ TX liefert Dezimale Systemantwort.
WHILE DUP REPEAT
@ Die Dezimalzahl wird solange geteilt, bis vor dem Komma 0 steht, die WHILE Schleife wertet alle positiven
@ Zahlen als gültige Schleifenbedingung.
2 / DUP FP CEIL
@ Die Dezimalzahl wird durch die Basis des gewünschten Ausgangsformates geteilt, in diesem Fall soll eine
@ Binärzahl ( Basis=2 ) erzeugt werden. FP liefert die Nachkommastelle, sie wird durch CEIL aufgerundet,
@ z.B.: 0.1 CEIL = 1, 0 CEIL = 0.
@ Die aufgerundete Zahl wird im ersten Durchlauf der Schleife dem achten Bit des Arrays dem LSB zugewiesen,
@ in den folgenden Durchläufen werden die Ziffern mit absteigender Reihenfolge den anderen Bits des Arrays
@ zugewiesen. AR = Array, P = Zuweisungsvariable
AR SWAP 'P' DECR SWAP PUT 'AR' STO
IP @ IP liefert für den nächsten Durchlauf die Zahl vor dem Komma.
END @ von While
DROP AR @ Das Array wird auf dem Stack hinterlassen.
»
» @ Ende von LES.IO
2.4.6.11 Programm ERHAND
Programm Error-Handler für I/O-Fehler.
Das Programm TX ruft ERRHAND bei fehlender Antwort der es I/O auf. TX übergibt dabei das Steuerbyte, mit dem das Problem aufgetreten ist.
Listing:
%%HP: T(2)A(D)F(.);
@ Programm ERHAND
« \-> x @ x = Problemadresse
« -33 SF .5 WAIT @ ERHAND setzt den Flag zur Umschaltung auf Infrarot-Schnittstelle.
@ Der Sendevorgang wird nach 0.5sek Wartezeit wiederholt, falls ein vorübergehender Synchronisationsfehler
@ des I/O vorlag.
x CHR XMIT DROP 1 SRECV
IF @ (IF -Bedingung vom Stack). Falls das I/O immer noch nicht antwortet, wird der Rechner ausgeschaltet.
THEN NUM
ELSE DROP CLLCD " IO antwortet nicht!" 4 DISP 100 1 BEEP @ akustische und optische Fehlermeldung
1 WAIT OFF x TX @ Beim Einschalten wird die Abfrage des I/O 'x' wiederholt.
END
»
» @ Ende von ERHAND