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.

                LES­T @ 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 LES­T @ 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

  LES­T 'Z' STO  @ eingeleses DTMF-Zeichen wird Z (Zehner) zugewiesen

  "KANAL: " Z + "?" + @ Zeichen wird mit Text verknüpft und angezeigt

  6 DISP LES­T '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 LES­T

 

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   LES­T

« 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

      A­FM  « 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