GPS einlesen

apfelwolle

Neues Mitglied
13. Sep. 2009
54
0
0
Rheinhessen
Sprachen
Hallo, ich wusste nicht so recht wohin mit der Frage da es aber um Serielle Daten geht schreibe ich meine Frage hier hin. Wenn Ihr der Meinung seit das sie besser in ein anderes Thema passt dann bitte dahin verschieben.

Ich möchte einen GPS Empfänger Navilock NL501 ETTL mit einem ATMega32 aus zu lesen. Der Empfänger hat einen Port Rx und einen Tx beide mit TTL Pegel. Diese habe ich direkt an die Pins 14 Rx und 15Tx angeschlossen. Jeweils Rx auf Tx und Tx auf Rx.

Der Controller wird extern mit einem 16Mhz Quarz getaktet.

Dann habe ich diesen Code auf mein LCD angepasst und auf den ATMega geschrieben.

Code:
'------------- GPS_MONI---------------------
'
'   geliefertes Format:
'
'-> $GPGGA,072344.187,5141.6192,N,00752.0280,E,1,06,1.6,119.9,M,47.4,M,0.0,0000*7B
'   $GPGLL,5141.6192,N,00752.0280,E,072344.187,A*3B
'   $GPGSA,A,3,13,23,11,17,04,20,,,,,,,2.6,1.6,2.1*31
'   $GPGSV,3,1,10,23,78,167,47,20,55,091,36,13,50,213,45,04,41,300,32*7D
'   $GPGSV,3,2,10,17,22,237,44,31,21,042,00,11,14,157,46,01,10,049,00*77
'   $GPGSV,3,3,10,25,09,173,00,02,08,314,00*7F
'   $GPRMC,072344.187,A,5141.6192,N,00752.0280,E,0.04,342.98,070707,,*0B
'-> $GPVTG,342.98,T,,M,0.04,N,0.1,K*61
'   $GPMSS,0,0,0.000000,200,*5A
'
'-> : nur diese Zeilen werden benötigt
'
'
'
'$prog &HFF , &HEF , &HD9 , &H00                            ' Fuse-Bits

$regfile = "m32def.dat"
$crystal = 16000000

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.0 , Rs = Porta.1

'--------------für RS232--------------------

$baud = 4800

On Urxc Onrxd                                               'Interrupt-Routine setzen
Enable Urxc

Dim Ser_buf(2) As String * 82                               'max 2 x 82 Zeichen bei GPS
Dim S11 As String * 11
Dim Zeile1 As Byte
Dim Zeile2 As Byte
Dim I As Integer
Dim Arr(13) As String * 11

Sreg.7 = 1                                                  'Interrupts freigeben



'--------------Main--------------------------


Ddrb.1 = 1                                                  'LED zum Blinken

Wait 30

Cls
Cursor Off Noblink

Lcd "Warten auf GPS-Maus.";
Locate 3 , 1
Lcd "(c) DiLi-Soft";
Locate 4 , 1
Lcd "10.07.2007";
Wait 30                                                     'Maus-Init abwarten

Print "$PSRF103,00,00,01,00*24"                             'GGA einschalten ohne Checksum
Print "$PSRF103,05,00,01,00*21"                             'VTG einschalten ohne Checksum
Print "$PSRF103,01,00,00,01*25"                             'GLL abschalten
Print "$PSRF103,02,00,00,01*26"                             'GSA abschalten
Print "$PSRF103,03,00,00,01*27"                             'GSV abschalten
Print "$PSRF103,04,00,00,01*20"                             'RMC abschalten
Print "$PSRF103,06,00,00,01*22"                             'MSS abschalten


Do
   S11 = Left(ser_buf(1) , 5)
Loop Until S11 = "GPGGA" Or S11 = "GPVTG"
Locate 2 , 1
Lcd "GPS-Maus gefunden!";
Wait 1

If S11 = "GPGGA" Then
   Zeile1 = 1
   Zeile2 = 2
Else
   Zeile1 = 2
   Zeile2 = 1
End If

Cls
Do
   Portb.1 = 1                                              'LED ein

'  Format: GPGGA,072344.187,5141.6192,N,00752.0280,E,1,06,1.6,119.9,M,47.4,M,0.0,0000

   Do
      I = Split(ser_buf(zeile1) , Arr(1) , ",")
   Loop Until I > 12                                        ' 12 + 1 sind nötig, damit der 12. !voll! gefüllt ist

   Arr(2) = Left(arr(2) , 6)                                ' Zeit UTC
   S11 = Left(arr(2) , 2) + ":" + Mid(arr(2) , 3 , 2) + ":" + Mid(arr(2) , 5 , 2)
   Lcd S11 ; "    Sats: " ; Arr(8);

   If Arr(7) = "1" Then                                     ' valide Daten?
      Locate 2 , 1
      S11 = Arr(3)                                          ' Breitengrad
      While Len(s11) < 10
         Arr(3) = " " + S11                                 ' "s11 = " " + s11" geht nicht !!
         S11 = Arr(3)
      Wend
      S11 = Left(arr(3) , 3) + " " + Right(arr(3) , 7)      ' Grad von Minuten separieren
      Arr(3) = S11
      Lcd Arr(4) ; " " ; Arr(3) ; " " ; Arr(10) ; " ";

      Locate 3 , 1
      S11 = Arr(5)                                          ' Längengrad
      I = 1
      While Mid(s11 , I , 1) = "0"                          ' führende Nullen kappen
         Mid(s11 , I , 1) = " "
         Incr I
      Wend
      Arr(5) = Left(s11 , 3) + " " + Right(s11 , 7)
      Lcd Arr(6) ; " " ; Arr(5) ; "  " ; Arr(12) ; " ";
   Else
      Locate 2 , 1
      Lcd String(20 , " ");
      Locate 3 , 1
      Lcd String(20 , " ");
   End If


'  Format: GPVTG,342.98,T,,M,0.04,N,0.1,K

   Do
      I = Split(ser_buf(zeile2) , Arr(1) , ",")
   Loop Until I > 8
   I = Val(arr(8));                                         ' Geschwindigkeit

   If I > 1 Then                                            ' unter 2 Km/h nix ausgeben
      Locate 4 , 1

      I = Instr(arr(8) , ".")
      I = I - 1
      S11 = Mid(arr(8) , 1 , I)                             ' nur ganzzahlige Km/h
      Lcd S11 ; " Km/h";

      I = Instr(arr(2) , ".")
      I = I - 1
      S11 = Mid(arr(2) , 1 , I)                             ' nur ganzzahlige Grade
      Lcd "   Kurs: " ; S11 ; " ";
   Else
      Locate 4 , 1
      Lcd String(20 , " ");
   End If

   Waitms 500
   Portb.1 = 0                                              'LED aus
   Waitms 500
Loop

End

'--------------RS232-INT---------------------


Dim Udr_buf As Byte
Dim Ser_col As Byte
Ser_col = 1                                                 'Index auf ser_buf()

Onrxd:
   Udr_buf = Udr                                            'Byte aus UART lesen
   Select Case Udr_buf
   Case 13 :
   Case 10 : Incr Ser_col
              If Ser_col = 3 Then
                 Ser_col = 1
              End If
   Case "$" : Ser_buf(ser_col) = ""
   Case Else
      If Len(ser_buf(ser_col)) < 82 Then
         Ser_buf(ser_col) = Ser_buf(ser_col) + Chr(udr_buf)
      End If
   End Select
Return

Der GPS empfänger blinkt nach dem Einschalten einige Sekunden schnell und dann im Sekundentakt. Das bedeutet laut Datenblatt das er Empfang hat.

Im Display bleibt aber nur der Text "Warte auf...." stehen.

Ich habe extra am Anfang zwei mal 30 Sekunden eingebaut damit der Empfänger genung Zeit hat sich zu finden.

Wenn ich an Pin 14 und 15 Die Pegel messe dann sehe ich die Initialisierungssequenz auf Tx und bei Rx alle Sekunde ein Datenpaket.

Was mache ich falsch oder besser wie müsste ein Code aussehen der einfach nur die Datenpakte auf das Display ausgibt die auf Rx ankommen?

Vielen Dank
Wolfgang
 
Hallo Wolfgang,

es sieht für mich danach aus, dass der Interrupt nicht läuft. Du solltest nach "Enable Urxc" mit "Enable Interrupts" global überhaupt das Setzen von Interrupts zulassen. Solange Du das nicht machst bleiben alle Interrupts gesperrt. Also:

Code:
Enable Interrupts
Enable Urxc

Hast Du eine Chance die IRS zu überprüfen? Kannst Du auf einer RS232 Daten an ein Terminanprogramm senden oder eine LED blinken lassen oder zum test in der ISr Daten auf dem Display ausgeben.

Irgendwie würde ich nach einer Möglichkeit suchen zu überprüfen, ob die ISR überhaupt läuft und ob sie das macht, was Du willst.

Zunächst würde ich aber das Thema Enable Interrupts angehen :D

Grüße,
Markus
 
Hallo Markus und danke für die schnelle Antwort.

Du schreibst:

s sieht für mich danach aus, dass der Interrupt nicht läuft. Du solltest nach "Enable Urxc" mit "Enable Interrupts" global überhaupt das Setzen von Interrupts zulassen. Solange Du das nicht machst bleiben alle Interrupts gesperrt.

Im Code setzt Du aber "Enable Interrupts" aber erst.

Ich glaube ich muss erst einmal den Code richtig verstehen.

Dazu müsste ich wie Du schon sagst einfach das was an Rx rein kommt 1:1 auf das Display schreiben. Geht das? und wie?

Vor UART habe ich mich bis jetzt gedrückt jetzt werde ich wohl mal das Thema angehen. Mein Rechner hat keinen seriellen Port und ich muss erst einmal lesen wie ich meinen Programmer (von MyAVR) als USB/Seriell Umsetzer verwende
 
Hallo Wolfgang,

hast du dein Navilog NL 501TTL auch auf 4800 Baud gesetzt, denn Standart ist 9600 Baud!

Mit dem Programm Sirf Demo kann man die Baudrate umstellen, allerdings nur über RS232. Dann stell doch einfach in deinem Programm $baud auf 9600

Gruß

Jürgen
 
:adore: :adore: :adore: :adore:
Das Wars!:adore:
Die Baudrate wars!:adore:

Was lernen wir daraus?:confused:
Datenblätter lesen auch wenn es noch so schwehr fällt!:rolleyes:

Vielen Dank Markus und Jürgen für die Sonntägliche Hilfe!

Als nächstes teste ich mal den Einfluss von "Enable Interrupts".

Jetzt gilt es den Code zu verstehen um Ihn meinen Bedürfnissen anpassen zu können.

Interesant ist, das mein Garmin im Huas 3 Sateliten sieht und der Navilock NL501 ETTL 8!
 
Hallo Wolfgang,

falls du mal mit dem Programm Sirf Demo arbeitest, sei vorsichtig!

ich habe mir mal ein Navilock 501 TTL mit dem Programm "geschossen"

Da gibt es einen "schönen " Menüpunkt: User-Mode!!! Niemals anwählen!!

Danach kannst du dein GPS nur noch als LED-Blinker verwenden.

Gruß

Jürgen
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)