Witam.
Podłączyłem sobie GPSa do MEGA16 w celu czytania danych jak:
Wysokość, prędkość, kierunek, czas itp.
Z komunikacją nie ma żadnych problemów, problem pojawia sie jak chce odczytać tylko wybrane wartości.
Oto programa
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 4800
'-------------------------------------------------------------------------------------------
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
On Urxc Przerwanie_uart_rx
Enable Urxc
Enable Interrupts
'-------------------------------------------------------------------------------
Dim Licznik_pomoc As Byte
Dim Licznik_pomoc2 As Byte
Dim Gps As String * 6 , Speed As String * 4 , Czas As String * 6 , _date As String * 6
Dim Wysokosc_gps As String * 5
Dim Przecinek As Byte
Licznik_pomoc = 1
Led Alias Porta.0
Ddra.0 = 0
Do
Toggle Led
Locate 1 , 1
Lcd Speed
Locate 2 , 1
Lcd Czas
Locate 3 , 1
Lcd _date
Loop
End
Przerwanie_uart_rx:
If Gps = "$GPRMC" And Przecinek = 7 And Udr > "," Then
Incr Licznik_pomoc2
Mid(speed , Licznik_pomoc2) = Chr(udr)
End If
If Gps = "$GPRMC" And Przecinek = 1 And Udr > "," Then
Incr Licznik_pomoc2
Mid(czas , Licznik_pomoc2) = Chr(udr)
End If
If Gps = "$GPRMC" And Przecinek = 9 And Udr > "," Then
Incr Licznik_pomoc2
Mid(_date , Licznik_pomoc2) = Chr(udr)
End If
If Udr = "," Then
Incr Przecinek
Licznik_pomoc2 = 0
End If
If Udr = "$" Then 'sprawdza czy odpowiedni znak
Licznik_pomoc = 1
Gps = Chr(udr) 'resetuje napis i rozpoczyna znakiem "$"
Else
If Licznik_pomoc < 6 Then
Incr Licznik_pomoc
Mid(gps , Licznik_pomoc) = Chr(udr) 'wstawia znak z UDR na okreslonej pozycji
End If
End If
Return
Dane które przesyła GPS co 1s.
Dane które mnie interesują są pogróbione
$GPRMC,094132,A,5001.144,N,02159.237,E,054.0,260.4,210405,003.4,E*73
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,094132,5001.143,N,02159.232,E,1,09,2.0,205.4,M,39.2,M,,*41
$GPGSA,A,3,01,03,11,14,15,18,19,22,28,,,,6.3,2.0,3.0*3E
$GPGSV,3,1,09,01,09,165,33,03,57,185,47,11,22,281,40,14,34,131,43*7F
$GPGSV,3,2,09,15,37,086,44,18,28,053,41,19,71,259,48,22,58,065,47*7E
$GPGSV,3,3,09,28,07,334,31,,,,,,,,,,,,*4B
$PGRME,15.0,M,22.5,M,15.0,M*1B
$GPGLL,5001.142,N,02159.218,E,094133,A*21
$PGRMZ,674,f,3*1E
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
$GPRTE,1,1,c,0*07
Mój program sie zacina, i nie zawsze wylapuje dane, czasem trzeba czekac pare sek. nim sie wszystko wyswietli a czasem wyświetla niekompletne lub z przecinkami czy "*".
Jeśli ktoś ma jakieś fajne pomysły i ewentualnie widzi przyczyny błędów to prosze o porade
Dzieki za zainteresowanie
Piotr
Podłączyłem sobie GPSa do MEGA16 w celu czytania danych jak:
Wysokość, prędkość, kierunek, czas itp.
Z komunikacją nie ma żadnych problemów, problem pojawia sie jak chce odczytać tylko wybrane wartości.
Oto programa
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 4800
'-------------------------------------------------------------------------------------------
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
On Urxc Przerwanie_uart_rx
Enable Urxc
Enable Interrupts
'-------------------------------------------------------------------------------
Dim Licznik_pomoc As Byte
Dim Licznik_pomoc2 As Byte
Dim Gps As String * 6 , Speed As String * 4 , Czas As String * 6 , _date As String * 6
Dim Wysokosc_gps As String * 5
Dim Przecinek As Byte
Licznik_pomoc = 1
Led Alias Porta.0
Ddra.0 = 0
Do
Toggle Led
Locate 1 , 1
Lcd Speed
Locate 2 , 1
Lcd Czas
Locate 3 , 1
Lcd _date
Loop
End
Przerwanie_uart_rx:
If Gps = "$GPRMC" And Przecinek = 7 And Udr > "," Then
Incr Licznik_pomoc2
Mid(speed , Licznik_pomoc2) = Chr(udr)
End If
If Gps = "$GPRMC" And Przecinek = 1 And Udr > "," Then
Incr Licznik_pomoc2
Mid(czas , Licznik_pomoc2) = Chr(udr)
End If
If Gps = "$GPRMC" And Przecinek = 9 And Udr > "," Then
Incr Licznik_pomoc2
Mid(_date , Licznik_pomoc2) = Chr(udr)
End If
If Udr = "," Then
Incr Przecinek
Licznik_pomoc2 = 0
End If
If Udr = "$" Then 'sprawdza czy odpowiedni znak
Licznik_pomoc = 1
Gps = Chr(udr) 'resetuje napis i rozpoczyna znakiem "$"
Else
If Licznik_pomoc < 6 Then
Incr Licznik_pomoc
Mid(gps , Licznik_pomoc) = Chr(udr) 'wstawia znak z UDR na okreslonej pozycji
End If
End If
Return
Dane które przesyła GPS co 1s.
Dane które mnie interesują są pogróbione
$GPRMC,094132,A,5001.144,N,02159.237,E,054.0,260.4,210405,003.4,E*73
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,094132,5001.143,N,02159.232,E,1,09,2.0,205.4,M,39.2,M,,*41
$GPGSA,A,3,01,03,11,14,15,18,19,22,28,,,,6.3,2.0,3.0*3E
$GPGSV,3,1,09,01,09,165,33,03,57,185,47,11,22,281,40,14,34,131,43*7F
$GPGSV,3,2,09,15,37,086,44,18,28,053,41,19,71,259,48,22,58,065,47*7E
$GPGSV,3,3,09,28,07,334,31,,,,,,,,,,,,*4B
$PGRME,15.0,M,22.5,M,15.0,M*1B
$GPGLL,5001.142,N,02159.218,E,094133,A*21
$PGRMZ,674,f,3*1E
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
$GPRTE,1,1,c,0*07
Mój program sie zacina, i nie zawsze wylapuje dane, czasem trzeba czekac pare sek. nim sie wszystko wyswietli a czasem wyświetla niekompletne lub z przecinkami czy "*".
Jeśli ktoś ma jakieś fajne pomysły i ewentualnie widzi przyczyny błędów to prosze o porade
Dzieki za zainteresowanie
Piotr