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.
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
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