Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


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 NEMEA Daten mit ESCI_RS232 einlesen, bearbeiten u. wieder senden Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe - 16.12.2014 18:15)
Joe nutzt:  CC1-M-Unit V1.1, Open-Micro, Open-Macro
Hallo Forum - Freunde,

im Forum hier wurde vor langer Zeit einmal das Einlesen von GPS Daten kurz behandelt siehe (http://ccintern.dharlos.de/forum/lesen.php?eintrag=8925  Problem serielle Datenübertragung Kategorie: C-Control I V1.2/2.0 (von Stefan Süßmann - 28.11.2005 20:43)//Stefan Süßmann nutzt:  CC1-M-Unit V1.2/2.0, Micro)

Auf dieses Beispielprogramm konnte ich dann aufsetzen und es auf meine Anwendung anpassen. Für den Datentransfer über die Funkstrecke eines 2.4/5.6GHz A/V Sende-/Empfängers habe ich dazu ein HW-Modem für 9600bps entwickelt.
Das Programm Listing ist unten angehängt. Vielleicht hilft dieser update zum GPS Daten einlesen einigen Nutzern dieses Forums. In meiner Anwendung sendet das GPS Modul mit 38400bps im Zeitabstand von 0,1sec je ca. 270 Bytes innerhalb 0,03 sec an den ESCI_RS232 Eingang der OMACRO. Die OMACRO sendet dann über den Semiwire-RS232 nur noch ca. 30 Bytes/0,1sec (Längen-, Breitengrad und Höhe).
Im Programm habe ich noch erläutert, welche Probleme ich hatte, wenn ich das WIN 3.1 Programm terminal.exe benutzt hatte. Mit dem Hyperterminal Programm hatte es dann ohne Probleme funktioniert. Auch bei direkt empfangenen GPS Daten (alles auf der Terrasse im Freien aufgebaut) hat es auf anhieb funktioniert. Dabei war beeindruckend die hohe Verarbeitungsgeschwindigkeit der OMACRO.

Viel Spass am Programm wünscht

Joe

########## program listing ###########################
' 2_GPS_EI.BAS vom Mi 19.11.2014 Josef Fenk; Einlesen von $GPGGA NEMEA GPS Daten
' Umfang: 478 Basic Bytes; 0 Sys-Bytes; 26 RAM-Bytes=0:


' Hardware:
' Serielle Schnittstelle an Port 1;GPS-sortierte Datenausgabe mit PRINT an Audiomodem
' Hardwaremaessig implementierten 2_RS232 Schnittstelle (ESCI) zum
' GPS-Daten einlesen an RXD:Pin7/Port13; nicht benutzt ist TXD:Pin6/Port14
' Hinweis zur Benutzung der hardwaremaessig implementierten 2. Seriellen Schnittstelle (Esci)
' der Empfangsbuffer dieser 2. ser. Schnittstelle hat  8Byte
' nach 8 Byte erfolgt ueberlauf und Wert EsciErr =-1
' Aufbau: GPS_Modul==>ESCI_RS232==>Daten einlesen in O-MACRO mit 38400Baud==>
' ==>mit O-Macro GPS Daten reduzieren und ==>ueber Semiwire RS232 mit 9600bps==> senden an
' ==>Audio-Modem-Modulator==>dann Audio-modulierten Datenstream senden an ==>
' ==> Audioeingang von 2.4/5.6GHz Sender ==> 2.4/5.6GHz Funksignal senden an==>
' ==> Bodenstation ==> dort Demodulation des Tonsignals ==> daten in Daten einlesen in O-MACRO mit 9600bps
' ==> Daten verarbeiten und Antennentracking Servos Horizontal bzw. vertikel damit ansteuern
' ==> sowie weitere Daten wie z.B. RSSI und Akkuspannungen ausgeben auf LCD Display
' Software:
' GPS Dateneinlesen mit 38400 Baud von GPS Modem
' GPS-Datenauswertung daraus und reduzierte Daten senden ueber Semiwire RS232 mit 9600 Baud
' ESCI- Schnittstelle: hier 38400 Baud benutzt
' bez. Baudrate: 300, 600, 1200, 2400, 4800,9600,19200, 38400 verfuegbar
' bez. ESCI_Sch.: hat 8 Byte Empfangsbuffer; GET holt Zeichen vom Empfangsbuffer und nicht direkt vom Eingang ab
' mit n*mal GET wird GPS NMEA Zeichenketten eingelesen,
' solange man nicht zuviele zusaetzliche Befehle zwischen folgenden GET Befehlen einfuegt
'
' --- Betriebssystem konfigurieren ------------------------------------------
INCLUDE "OMAC.DEF"           'Include-Datei mit Definitionen vom April 2010

' --- Definitionen Variable fuer das Hauptprogramm
' ----Def. WORD Variable ------------------------------------------
DEFINE Bg_sek      WORD 'einerstelle bzw. endwert Breitengrad-sekunde Rechenwert 0 bis 999 moeglich
DEFINE Lg_sek      WORD 'Laengengrad Rechenwert 0 bis 999 moeglich
DEFINE GPS_hoe     WORD 'Rechenwert my standort 400 bis 9999 m moeglich  

' ----Def. Byte Variable ------------------------------------------
DEFINE Bggg_10er    BYTE    ' zehnerstelle
DEFINE Bggg         BYTE    ' einerstelle bzw. endwert 2-stellig;Breitengrad 0 bis 90 Grad
DEFINE Bg_mi10er    BYTE    
DEFINE Bg_mi        BYTE    'einerstelle bzw. endwert 2stellig 0 bis 60 Grad
DEFINE Bgse_1000er  BYTE    
DEFINE Bgse_100er   BYTE    
DEFINE Bgse_10er    BYTE

DEFINE Lg_100er     BYTE
DEFINE Lg_10er      BYTE
DEFINE Lggg         BYTE    'einerstelle bzw endwert 3-stellig; Laengengrad Hunderter 0 bis 180 Grad
DEFINE Lg_mi10er    BYTE   'zehner stelle  
DEFINE Lg_mi        BYTE   ' einerstelle bzw. endwert 2-stellig o bis 60  
DEFINE Lgse_1000er  BYTE    
DEFINE Lgse_100er   BYTE    
DEFINE Lgse_10er    BYTE    
   
DEFINE hoe1000er  BYTE    
DEFINE hoe100er   BYTE    
DEFINE hoe10er    BYTE

DEFINE Zeichen      BYTE    
DEFINE i_zae        BYTE    


'***Definition der Bit Variablen von Byte 01 u. 02; Bit 1 bis 8
'DEFINE Flag1    BIT[01]   ' Ausstieg bei Unter/Ueber Spannung bei Entl/Ladung
'***** Definition der Konstanten
'DEFINE Absch  158     ' Abschaltschwelle der Zellspannung  bei ca. 3,10V

'******** Definition der A/D Wandler Eingabe -Ports  ****
 
'***** Definition der Digitalen Ein- / Ausgabeports
'DEFINE RS232_1  PORT[01] ' Serielle Schnittstelle_1 fuer Onboard Programmierung und Datenausgabe
'BAUD R9600
'DEFINE Taste    PORT[04]       'Warte-Taste

'***** Portwiderstaende = 26kOhm s.S. 63 Manual; abschalten um ADC Fehler zu reduzieren
'***** Pullup Widerstaende werden abgeschaltet, damit AD Messung genauer ist
'PULLUPA = &b00001101   '* AD2, 5, 6   jeweils Pullup-R abgeschaltet; Eingangsport zusaetzlich mit 47nF abblocken
'PULLUPB = &b11000011   '* AD11, 12, 13, 14 jeweils Pullup-R abgeschaltet
'
'************************************
' hier wird nur 8Bit AD Wandlung genutzt
' Bits im ADC10 Clock Register (ADCLK):
' ADLPC ADIV1 ADIV0 ADICLK MODE1 MODE0 ADLSMP ACLKEN
'ADCLK=ADCLK AND &b11110011 OR &b0100 'MODE1 loeschen, MODE0 setzen
'ADCLK=&b00110110 ' aktiviert 10bit Wandlung max. Wert 1024=5000mV          

'--- Das Hauptprogramm -----------------------------------------------------
PRINT "Start_GPS"
#Start
  GOSUB GPS_Einl
 ' PRINT "Bggg_10er=";Bggg_10er,"Bggg=";Bggg,"Bg_mi10er=";Bg_mi10er,"Bg_mi=";Bg_mi,"Bgse_1000er=";Bgse_1000er,"Bgse_100er=";Bgse_100er,"Bgse_10er=";Bgse_10er,"Bg_sek=";Bg_sek
 PRINT Bggg,Bg_mi,Bg_sek,Lggg,Lg_mi,Lg_sek,GPS_hoe
'PUT Bggg
 ' PRINT "Lg_100er=";Lg_100er,"Lg_10er=";Lg_10er,"Lggg=";Lggg,"Lg_mi10er=";Lg_mi10er,"Lg_mi=";Lg_mi,"Lgse_1000er=";Lgse_1000er,"Lgse_100er=";Lgse_100er,"Lgse_10er=";Lgse_10er,"Lggg=";Lggg
' PRINT "Lggg=";Lggg,Lg_mi,Lg_sek
 ' PRINT "Hoe1000er=";Hoe1000er,"Hoeh100er=";Hoe100er,"Hoe10er=";Hoe10er,"GPS_hoe=";GPS_hoe
'  PRINT GPS_hoe
'PUT GPS_hoe
GOTO Start

END

'************** Subroutinen
' Subroutine  GetGPSData holen von GPS Modul
' wichtige Hinweise:
' Habe hier zum testen vom PC_2 eine Text Datei mit NMEA gesendet s. Anlage 1_CYCTE.TXT;
' diese enthaelt 5 NMEA Pakete zu je 186 Zeichen/Paket; im ersten Teil je Paket befindet sich
' die ausgewerteten GPGGA Daten fuer Breiten-, Laengen-Grad und Hoehe
' zwischen den Paketen war kein Abstand bei der gesendeten Textdatei; im realen GPS Modul werden die
' 186 zeichen mit Baud38400 innerhalb 0,32 msec gesendet, dann ist 0,68msec Pause
' anschliessend kommt das naechste Paket; dies entspricht 10 Hz Pakettransfer
' R38400: es koennen nur 3 reduzierte Pakete statt der 5 ausgewerteten Datenpakete gesendet werden
' im realen Fall sind aber 0,68msec Pause, sodass alle ankommenden Datenpakete
' ausgewertet werden sollten
' hier eine Auflistung der ausgewerteten Datenpakete, je nach Terminal-Software
' Sendeterminal   Hyperterminal     bzw. Win3_Terminal.exe
' R38400              3                  kann keine 38400
' R19400:             5                  5
' R9600:              5                  1
' R4800:              5                  1
' R2400:              5                  1
' R1200:              5                  1
' R600:         hat kein Baud600         1
' R300:              5                   1
' Die Auswertung der OMACRO ist abhaengig von der verwendeten Terminalsoftware
' Windows3 terminal.exe zeigt anderes Verhalten als Hyper Terminal
' GPS Daten dann direkt von GPS Modul eingelesen, funktioniert fehlerfrei

#GPS_Einl         ' GPS Daten einlesen
   UseESCI=ON     'schaltet ESCI ein
   BAUD R38400   'R300     'moeglich sind 300, 600, 1200,2400,4800,9600,19200,38400 Baud
'   die PRINT Befehle verbrauchen ebenfalls Zeit, sodass dadurch ev.
'   PRINT "RXD=";RXD 'RXD=-1 falls Zeichen im E-Buffer, ansonsten 0; Ausdruck RXD=0  erfolgt nur beim 1-ten Durchlauf
'   PRINT "EsEr=";EsciErr '=-1 falls Zeichen >8 = Groesse E_Buffer; ansonsten 0
'   PRINT "EsPt=";Esciptr '=319 zeigt immer diesen Zahlenwert
'   PRINT "Datei mit Zeichen von PC_2 senden"
'  IF EsciErr=-1 THEN
'     GET Zeichen
'     GOTO GPS_Einl
'     ELSE
'  ENDIF  
  #Zei_emp   'Schleife um Zeichen von gesendeter Datei zu empfangen
      IF RXD=0 THEN GOTO Zei_emp
    '   #LF_CR          ' pruefen auf Line feed bzw. carriage return
    '    GET Zeichen
    '    PUT Zeichen
    '    IF Zeichen <> 13 THEN GOTO LF_CR 'prueft auf Line Feed
    '    PUT Zeichen
        #GPGGA          'ab hier GPGGA Zeichenfolge abfragen u, dann erforderliche Daten einlesen
        GET Zeichen
   '     PUT Zeichen
   '     PRINT
        IF Zeichen <> 71 THEN GOTO GPGGA  ' G
        GET Zeichen
        IF Zeichen <> 80 THEN GOTO GPGGA  ' P
        GET Zeichen
        IF Zeichen <> 71 THEN GOTO GPGGA  ' G
        GET Zeichen
        IF Zeichen <> 71 THEN GOTO GPGGA  ' G
        GET Zeichen    
        IF Zeichen <> 65 THEN GOTO GPGGA  ' A         GPGGA empfangen
        FOR i_zae = 1 TO 12         ' ,hhmmss, =12 Zeichen entfernen
            GET Zeichen
        NEXT i_zae        
        GET Bggg_10er        ' nun bggg 10er stelle einlesen
        GET Bggg             ' einerstelle
        GET Bg_mi10er     ' bgmin 10er stelle
        GET Bg_mi  
        GET Zeichen                ' entfernen
        GET Bgse_1000er            ' bgsek
        GET Bgse_100er
        GET Bgse_10er
        GET Bg_sek
        FOR i_zae = 1 TO 3    ' ",N,"entfernen
            GET Zeichen
        NEXT i_zae
        GET Lg_100er
        GET Lg_10er
        GET Lggg    
        GET Lg_mi10er         ' lgmin
        GET Lg_mi
        GET zeichen               ' . entfernen
        GET Lgse_1000er                 ' lgsek
        GET Lgse_100er
        GET Lgse_10er
        GET Lg_sek
        FOR i_zae = 1 TO 12  '12 Zeichen entfernen
            GET Zeichen
        NEXT i_zae
        GET hoe1000er
        GET hoe100er
        GET hoe10er
        GET Zeichen
        IF zeichen <> 46 THEN
           GPS_Hoe=Zeichen  'falls Zeichen vor Punkt 4 stellig ist
        ELSE
        GPS_Hoe=hoe10er   ' falls Zeichen vor Punkt 3-stellig ist
        hoe10er=hoe100er
        hoe100er=hoe1000er
        hoe1000er=48      ' Null Eingabe
        END IF
  UseEsci=OFF  ' 2-te RS232 Schnittstelle de-aktiviert
           
' ab hier Berechnnung der Werte  
  Bggg   =(Bggg-48) +(10*(Bggg_10er-48))
  Bg_mi =(Bg_mi-48)+(10*(Bg_mi10er-48))    
  Bg_sek =(Bg_sek-48)+(1000*(Bgse_1000er-48))+(100*(Bgse_100er-48))+(10*(Bgse_10er-48))

  Lggg  = (Lggg-48)+(100*(Lg_100er-48))+(10*(Lg_10er-48))  
  Lg_mi = (Lg_mi-48)+(10*(Lg_mi10er-48))    
  Lg_sek = (Lg_sek-48)+(1000*(Lgse_1000er-48))+(100*(Lgse_100er-48))+(10*(Lgse_10er-48))
  GPS_Hoe= (GPS_Hoe-48)+(1000*(hoe1000er-48))+(100*(hoe100er-48))+(10*(hoe10er-48))
 
RETURN

 Antwort schreiben

Bisherige Antworten: