Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 GPS Displayanzeige Kategorie: Programmierung Basic (von Paul - 11.08.2004 9:26)


Hallo,
bisher habe ich meine selbstgebaute Junbo Anzeige mit einem
GPS Gerät APN 8 Gerät betrieben, die NMEA Daten wurden von
einem CControl/Prozessor von Conrad verarbeitet.
Ich brauche nun ein neues GPS Gerät,  probiert habe ich Furuno 32
 und Garmin 126, leider ohne Erfolg.
Beide Geräte habe ich auf 4800 Baud stehen, der CController findet
aber nicht die $ Zeichen, ob die NMEA Daten anders gesendet
werden, vielleicht  im  Block oder  schneller?
Wenn ich die Daten zum PC sende werden sie einwandfrei angezeigt.
Können kann mir jemand einen Tip geben?
Nachstehend das CC Basic Programm im Quellcode.
MfG
Paul Honkomp



' OPEN "COM2:4800,N,8,1,CD0,CS0,DS0,OP0,RS,TB2048,RB2048" FOR RANDOM AS #1
' OPEN "Com1:9600,N,8,1,BIN,RS" FOR RANDOM AS #2

' In diesem Programm sind folgende Unterroutinen definiert:
'
' #lese_rmc: Warte auf eine GPRMB-Zeile und merke die Daten.
'   Benutzte Variablen:
'     zeichen wird ver„ndert.
'     wert1 bis wert13 werden ver„ndert.
'
' #lese_rmb: entsprechend lese_rmc
'
' #lese_ztg: entsprechend lese_rmc
'
' #schreibe_rmc: Warte auf eine GPRMB-Zeile und merke die Daten.
'   Benutzte Variablen:
'     h wird ver„ndert.
'     wert1 bis wert16.
'
' #schreibe_rmb: entsprechend schreibe_rmc
'
' #schreibe_ztg: entsprechend schreibe_rmc
'
' #deselect_all: Alle Displays deselektieren.
'
' #display1: Display 1 selektieren.
'   Benutzte Variablen:
'     display: wird 1.
'
' #display2: Display 2 selektieren.
'   Benutzte Variablen:
'     display: wird 2.
'
' #select_display: Display selektieren.
'   Benutzte Variablen:
'     display: Das zu selektierende Display (1 oder 2).
'

' Ich verwende hier nur Bytes, da diese nur jeweils eine der
' spärlichen 24 Speicheradressen verbrauchen.

' Das letzte gelesene zeichen:
 DEFINE zeichen BYTE

' Pro zeile sind bis zu 13 zeichen fuer irgendwelche Werte vorgesehen:
 DEFINE wert1 BYTE
 DEFINE wert2 BYTE
 DEFINE wert3 BYTE
 DEFINE wert4 BYTE
 DEFINE wert5 BYTE
 DEFINE wert6 BYTE
 DEFINE wert7 BYTE
 DEFINE wert8 BYTE
 DEFINE wert9 BYTE
 DEFINE wert10 BYTE
 DEFINE wert11 BYTE
 DEFINE wert12 BYTE
 DEFINE wert13 BYTE
 DEFINE wert14 BYTE
 DEFINE wert15 BYTE
 DEFINE wert16 BYTE
 DEFINE wert17 BYTE
 DEFINE wert18 BYTE
 DEFINE wert19 BYTE
 DEFINE wert20 BYTE
 DEFINE wert21 BYTE

' Schleifenvariable
 DEFINE h BYTE

' Aktuelles Display
 DEFINE display BYTE

' Damit sind 24 der 24 Bytes benutzt.

'*** ASCII-Codes ***
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A

' Kleinbuchstaben:
define A_KLEIN &H61
define B_KLEIN &H62
define C_KLEIN &H63
define D_KLEIN &H64
define E_KLEIN &H65
define F_KLEIN &H66
define G_KLEIN &H67
define H_KLEIN &H68
define I_KLEIN &H69
define J_KLEIN &H6A
define K_KLEIN &H6B
define L_KLEIN &H6C
define M_KLEIN &H6D
define N_KLEIN &H6E
define O_KLEIN &H6F
define P_KLEIN &H70
define Q_KLEIN &H71
define R_KLEIN &H72
define S_KLEIN &H73
define T_KLEIN &H74
define U_KLEIN &H75
define V_KLEIN &H76
define W_KLEIN &H77
define X_KLEIN &H78
define Y_KLEIN &H79
define Z_KLEIN &H7A

define LEERZ &H20
define MINUS &H2D
define NULL &H30
define EINS &H31
define ZWEI &H32
define DREI &H33
define VIER &H34
define FUENF &H35
define SECHS &H36
define SIEBEN &H37
define ACHT &H38
define NEUN &H39

define GLEICH &H3D
define DOT &H2E
define DOPPELPUNKT &H3A
define KOMMA &H2C
define DOLLAR &H24
define ESC 27
define LF 10
define CR 13
define CLEAR_DISPLAY 12
define GRAD 227

'============================================================================================
'============================================================================================


#start
' BAUD R4800
' Senden mit 9600 Baud, empfangen mit 4800 Baud:
  BAUD &B11000001

' Eine kleine Animation
' Wenn diese korrekt zu sehen ist, ist die Verbindung zum Display in Ordnung!
  wert2 = 128
  FOR h = 1 TO 2
    FOR wert1 = 0 TO 5
      wert2 = wert2 XOR (1 shl wert1)

      PUT CLEAR_DISPLAY

      PUT wert2
      PUT wert2
      PUT wert2
      PUT wert2

      PAUSE 50 / 1
    NEXT
  NEXT
'===========================================================================================
          #weiter_rma

          'weil wenig Speicher wird dieses vorweg abgearbeitet
          GOSUB lese_neben_ziel_linie

          'Falls kein Segelplan eingegeben wurde
          If wert1 = LEERZ THEN GOTO ohne_plan 'von da weiter_rma
          GOSUB schreibe_neben_ziel_linie

 '=============================================================
          GOSUB lese_rmb

          'Falls kein Segelplan eingegeben wurde
          If wert1 = LEERZ THEN GOTO ohne_plan 'von da weiter_rma

          GOSUB lese_zeit_ziel

          GOSUB lese_rmc

          'die Schreibfolge erfolgt so, damit die Anzeige Kurs-Ziel + Kurs über Grund
          'gleichzeitig angezeigt wird.
          GOSUB schreibe_speed
          GOSUB schreibe_kurs_ziel
          GOSUB schreibe_kurs_grund
          GOSUB schreibe_meilen_ziel
          GOTO schreibe_zeit_ziel

          GOTO weiter_rma
'===========================================================================================

' Die interessanten Zeichen der $GPRMB(a)-Zeile lesen
' Alle Werte auf 0 setzen
#lese_neben_ziel_linie
  wert1 = LEERZ
  wert2 = LEERZ
  wert3 = LEERZ
  wert4 = LEERZ
  wert5 = LEERZ
  wert6 = LEERZ
  wert7 = LEERZ
  wert8 = LEERZ
  wert9 = LEERZ
  wert10 = LEERZ
  wert11 = LEERZ
  wert12 = LEERZ
  wert13 = LEERZ
  wert14 = LEERZ
  wert15 = LEERZ
  wert16 = LEERZ
  wert17 = LEERZ
  wert18 = LEERZ
  wert19 = LEERZ
  wert20 = LEERZ

  h = 0
' Abbruch nach 4 mal DOLLAR G_ P_ R_ M_ aber ohne B_:(a)Zeile
#lese_rma00
  h = h + 1
  IF h = 3 THEN RETURN

#lese_rma0
  GET zeichen
  IF zeichen <> DOLLAR THEN GOTO lese_rma0
  GET zeichen
  IF zeichen <> G_ THEN GOTO lese_rma0
  GET zeichen
  IF zeichen <> P_ THEN GOTO lese_rma0
  GET zeichen
  IF zeichen <> R_ THEN GOTO lese_rma0
  GET zeichen
  IF zeichen <> M_ THEN GOTO lese_rma0
  GET zeichen
  IF zeichen <> B_ THEN GOTO lese_rma00

    ' drei Zeichen weiter
    GET zeichen
    GET zeichen
    GET zeichen

   ' lese Abweichung von der Ziellinie
  GET wert1
  GET wert2
  GET wert3
  GET wert4

  ' ein Zeichen weiter
  GET zeichen

' lese rechts oder links von der Ziellinie
  GET wert5

  RETURN

'=====================================
#schreibe_neben_ziel_linie
'schreibe Abweichnung von der Ziellinie
   GOSUB deselect_all
   GOSUB display1
   PUT CLEAR_DISPLAY

   IF wert5 = R_ THEN PUT 210
   IF wert5 = L_ THEN PUT 228

  PUT wert1
  PUT wert2
  PUT wert3
  PUT wert4

  RETURN

'===========================================
' Die interessanten Zeichen der $GPRMB-Zeile lesen
#lese_rmb
'Werte auf 0 setzen
   wert1 = LEERZ
  wert2 = LEERZ
  wert3 = LEERZ
  wert4 = LEERZ
  wert5 = LEERZ
  wert6 = LEERZ
  wert7 = LEERZ
  wert8 = LEERZ
  wert9 = LEERZ
  wert10 = LEERZ
  wert11 = LEERZ
  wert12 = LEERZ
  wert13 = LEERZ
  wert14 = LEERZ
  wert15 = LEERZ
  wert16 = LEERZ
  wert17 = LEERZ
  wert18 = LEERZ
  wert19 = LEERZ
  wert20 = LEERZ

   h = 0
' Abbruch nach 3 mal DOLLAR G_ P_ R_ M_ aber ohne B_:dann nach #ohne_plan
#lese_rmb00
  h = h + 1
  IF h = 3 THEN RETURN

#lese_rmb0
  GET zeichen
  IF zeichen <> DOLLAR THEN GOTO lese_rmb0
  GET zeichen
  IF zeichen <> G_ THEN GOTO lese_rmb0
  GET zeichen
  IF zeichen <> P_ THEN GOTO lese_rmb0
  GET zeichen
  IF zeichen <> R_ THEN GOTO lese_rmb0
  GET zeichen
  IF zeichen <> M_ THEN GOTO lese_rmb0
  GET zeichen
  IF zeichen <> B_ THEN GOTO lese_rmb00

'39 x Get zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
    GET zeichen
'==================================
'lese Entfernung zum Ziel
GET wert1
GET wert2
GET wert3
GET wert4
GET wert5

'ein zeichen weiter
GET zeichen

'=================================
'lese Kurs zum Ziel,
GET wert6
GET wert7
GET wert8

RETURN
'=====================================
   'lese Zeit zum Ziel

  #lese_zeit_ziel

   wert16 = LEERZ
   wert17 = LEERZ
   wert18 = LEERZ
   wert19 = LEERZ
   wert20 = LEERZ

  ' Abbruch nach 14 mal DOLLAR G_ P_ Z_ T_ aber ohne G_:
  h = 0
  #lese_ztg00
  h = h + 1
  IF h = 14 THEN RETURN

  #lese_ztg0
  GET zeichen
  IF zeichen <> DOLLAR THEN GOTO lese_ztg0
  GET zeichen
  IF zeichen <> G_ THEN GOTO lese_ztg0
  GET zeichen
  IF zeichen <> P_ THEN GOTO lese_ztg0
  GET zeichen
  IF zeichen <> Z_ THEN GOTO lese_ztg00
  GET zeichen
  IF zeichen <> T_ THEN GOTO lese_ztg00
  GET zeichen
  IF zeichen <> G_ THEN GOTO lese_ztg00

  GET zeichen

  'für Kommaüberprüfung
  GET wert16

  GET zeichen
  GET zeichen
  GET zeichen
  GET zeichen
  GET zeichen
  GET zeichen

  'lese Zeit zum Ziel

  GET wert17
  GET wert18
  GET wert19
  GET wert20

  RETURN
'==================================================
' Die interessanten Zeichen der $GPRMC-Zeile lesen
  #lese_rmc
'Werte auf 0 setzen
  wert9 = LEERZ
  wert10 = LEERZ
  wert11 = LEERZ
  wert12 = LEERZ
  wert13 = LEERZ
  wert14 = LEERZ
  wert15 = LEERZ

  #lese_rmc0
  GET zeichen
  IF zeichen <> DOLLAR THEN GOTO lese_rmc0
  GET zeichen
  IF zeichen <> G_ THEN GOTO lese_rmc0
  GET zeichen
  IF zeichen <> P_ THEN GOTO lese_rmc0
  GET zeichen
  IF zeichen <> R_ THEN GOTO lese_rmc0
  GET zeichen
  IF zeichen <> M_ THEN GOTO lese_rmc0
  GET zeichen
  IF zeichen <> C_ THEN GOTO lese_rmc0

       '32 x GET zeichen für Komma zählen

       GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen
GET zeichen

'=====================
'lese Speed über Grund
  GET wert9
  GET wert10
  GET wert11
  GET wert12

  'ein zeichen weiter
  GET zeichen

'=====================
' lese Kurs über Grund
  GET wert13
  GET wert14
  GET wert15

  Return

'==================================================================================
' Ausgabe der Daten

  'Speed über Grund SOG
  #schreibe_speed

  GOSUB deselect_all
  GOSUB display2
  PUT CLEAR_DISPLAY

  PUT H_             ' 246 = H für Speed
  PUT wert9
  PUT wert10
  PUT wert11
  PUT wert12

  RETURN
'================================================================================================
  'Kurs zum Ziel (Bearing)
  #schreibe_kurs_ziel

  GOSUB deselect_all
  GOSUB display3
  PUT CLEAR_DISPLAY

  PUT GRAD
  PUT wert6
  PUT wert7
  PUT wert8

 RETURN
'=================================
'Kurs über GRUND: COG
#schreibe_kurs_grund

  GOSUB deselect_all
  GOSUB display4
  PUT CLEAR_DISPLAY

  PUT wert13
  PUT wert14
  PUT wert15
  PUT GRAD
  PAUSE 50 * 5

  RETURN
'==============================================================================================
  'Entfernung zum Ziel (Distanze)aus rmb
   #schreibe_meilen_ziel

  GOSUB deselect_all
  GOSUB display3
  PUT CLEAR_DISPLAY

  PUT wert1
  PUT wert2
  PUT wert3
  PUT wert4
  PUT wert5

  RETURN
'===============================
' Schreibe die Daten der $GPZTG-Zeile:
 #schreibe_zeit_ziel

 IF wert16 = KOMMA THEN GOTO schreibe_ztg1

  GOSUB deselect_all
  GOSUB display4
  PUT CLEAR_DISPLAY

  PUT wert17
  PUT wert18
  PUT DOPPELPUNKT
  PUT wert19
  PUT wert20

  GOTO weiter_rma
  '===========================================

' Schreibe 00:00 auf Display, wenn Zeit unbekannt
#schreibe_ztg1

  GOSUB deselect_all
  GOSUB display4
  PUT CLEAR_DISPLAY

  PUT MINUS
  PUT MINUS
  PUT DOPPELPUNKT
  PUT MINUS
  PUT MINUS

 GOTO weiter_rma
'==========================================================================================
'ohne Segelplan

      #ohne_plan
GOSUB deselect_all
GOSUB display1
PUT CLEAR_DISPLAY
PUT MINUS
PUT MINUS
PUT MINUS
PUT MINUS
'=========================
GOSUB deselect_all
GOSUB display3
PUT CLEAR_DISPLAY
PUT MINUS
PUT MINUS
PUT MINUS
PUT MINUS

'=====================
GOSUB lese_rmc
'=====================
GOSUB schreibe_speed
'=====================
GOSUB schreibe_kurs_grund
'=====================
        GOTO weiter_rma

'==================================================================================================
' Alle Displays deselektieren
#deselect_all
  PUT ESC
  PUT D_
  PUT &hff
  RETURN

#display_hex
  IF (zeichen SHR 4) < 10 THEN PUT (zeichen SHR 4) + NULL ELSE PUT (zeichen SHR 4) + A_KLEIN - 10
  PUT DOT
  IF (zeichen AND 15) < 10 THEN PUT (zeichen AND 15) + NULL ELSE PUT (zeichen AND 15) + A_KLEIN - 10
  RETURN

' Display h auswaehlen
#display1
  display = 1
  GOTO select_display

#display2
  display = 2
  GOTO select_display

#display3
  display = 3
  GOTO select_display

#display4
  display = 4
  GOTO select_display

#select_display
  PUT ESC
  PUT S_
  PUT display
  RETURN


 Antwort schreiben

Bisherige Antworten:

Re: GPS Displayanzeige (von Topmail - 12.08.2004 18:05)