logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega32][Bascom] GPS, przetwarzanie danych z UART

Elektronik_Kraków 24 Maj 2011 23:39 2270 2
REKLAMA
  • #1 9541329
    Elektronik_Kraków
    Poziom 13  
    Witam
    Wzorując się na jednym z przykładów chciałem wyświetlać dane z GPS.
    GPS działa poprawnie, wyświetla dane w oknie terminala.
    Podłączenie TX GPS z Rx AtMega nie powoduje żadnej reakcji

    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600                                                ' predkość transmisji
    $hwstack = 64                                               ' rozmiar stosu sprzętowego
    $swstack = 64                                               ' rozmiar stosu programowego
    $framesize = 64                                             ' rozmiar ramki
    
    '********************* Konfiguracja wyświetlacza
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.3
    Config Lcd = 24 * 2
    
    
    '********************* Deklaracje zmiennych
    Dim Rs As String * 82
    Dim Gps As Byte
    Dim A1 As String * 10
    Dim A2 As String * 10
    Dim A3 As String * 10
    Dim Ramka As Byte
    Dim Ramka1 As String * 80
    Dim Czas As String * 10
    
    '********************* Deklaracje Aliasów
    
    Lcd1 Alias Portd.3
    Lcd2 Alias Portd.7
    Lcd3 Alias Portb.3
    
    '********************* Wartości początkowe
    Lcd1 = 1
    A1 = "$GPGGA"
    A2 = "$GPGSV"
    A3 = "$GPRMC"
    
    Cursor Off
    Cls
    
    Do
    
    Cls
    Locate 2 , 1
    Lcd Rs
    
    Locate 1 , 1
    Lcd Czas
    
    Locate 1 , 13
    Lcd Ramka
    
    Locate 2 , 13
    Lcd Ramka1
    
    
    Do
    
        Gps = Inkey()
        If Gps = 13 Then Exit Do                                ' jeśli koniec linii
        Rs = Rs + Chr(gps)                                      ' utwórz ciąg
    
    Loop
    
    
    '***************************** szuka ramki
    Ramka =  Instr(rs , A1)                                      ' szukaj w zmiennej Rs ciągu A1
    Ramka1 = Mid(rs , Ramka , 6)                                ' zwraca fragment tekstu ze zmiennej Rs
    
    
    '***************************** szuka ramki  odczytuje z ramki
    
    If Ramka1 = "$GPGGA" Then                         ' jesli zmienna Ramka1 =  
                                                                  "$GPGGA" wtedy
    Czas = Mid(rs , 8 , 6)                                 ' zwróć wartość 6 kolejnych    
                                                                 pól  licząc od znaku 8-go z ciągu Rs
    
    End If
    
    Waitms 199
    Rs = ""
    Loop
    
    End
    


    Zacząłem od wyświetlania czasu, bo najłatwiejszy mi się wydawał.
    Jako, że nic się nie dzieje, wyświetlam wartość kilku zmiennych, żeby zobaczyć w czym problem. Jedynie wartość zmiennej Ramka jest 0, reszta zmiennych jest nie wyświetlana wcale. Nie wiem, czy dobrze użyłem instrukcji Inst.
  • REKLAMA
  • #2 9545095
    Elektronik_Kraków
    Poziom 13  
    Okazało się, że to FT232 w zestawie EVB4.3 robił złą robotę.

    Mam taki kod:
    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600                                                ' predkość transmisji
    
    '********************* Konfiguracja wyświetlacza
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.3
    Config Lcd = 24 * 2
    
    
    '********************* Deklaracje zmiennych
    Dim Rs1 As String * 82
    Dim Gps1 As Byte
    Dim Rs2 As String * 82
    Dim Gps2 As Byte
    Dim Rs3 As String * 82
    Dim Gps3 As Byte
    
    Dim A1 As String * 10
    Dim A2 As String * 10
    Dim A3 As String * 10
    Dim Ramka As Byte
    Dim Ramka1 As String * 80
    Dim Ramka2 As Byte
    Dim Ramka3 As String * 80
    Dim Ramka4 As Byte
    Dim Ramka5 As String * 80
    
    Dim Czas As String * 10
    Dim L_sat As String * 3
    Dim Sig_sat As String * 3
    Dim La As String * 8
    Dim Lo As String * 8
    
    '********************* Deklaracje podprogramów
    
    '********************* Deklaracje Aliasów
    
    Lcd1 Alias Portd.3
    Lcd2 Alias Portd.7
    Lcd3 Alias Portb.3
    
    '********************* Wartości początkowe
    Lcd1 = 1
    A1 = "$GPGGA"
    A2 = "$GPRMC"
    A3 = "$GPGSV"
    
    Cursor Off
    Cls
    
    Do
    
    Cls
    Locate 2 , 1
    Lcd "L. sat: " ; L_sat
    
    Locate 1 , 1
    Lcd Czas
    
    Locate 1 , 13
    Lcd La
    
    Locate 2 , 13
    Lcd Ramka1
    
    
    Do
    
        Gps1 = Inkey()
        If Gps1 = 13 Then Exit Do                               ' jeśli koniec linii
        Rs1 = Rs1 + Chr(gps1)                                   ' utwórz ciąg
    
    Loop
    
    Do
    
       Gps2 = Inkey()
       If Gps2 = 13 Then Exit Do                                ' jeśli koniec linii
        Rs2 = Rs2 + Chr(gps2)                                   ' utwórz ciąg
    
    Loop
    
    Do
    
        Gps3 = Inkey()
        If Gps3 = 13 Then Exit Do                               ' jeśli koniec linii
        Rs3 = Rs3 + Chr(gps3)                                   ' utwórz ciąg
    
    Loop
    
    
    '***************************** szuka ramki
    
    Ramka = Instr(rs1 , A1)                                     ' szukaj w zmiennej Rs ciągu A1
    Ramka1 = Mid(rs1 , Ramka , 6)                               ' zwraca fragment tekstu ze zmiennej Rs
    
    Ramka2 = Instr(rs2 , A2)                                    ' szukaj w zmiennej Rs ciągu A2
    Ramka3 = Mid(rs2 , Ramka2 , 6)                              ' zwraca fragment tekstu ze zmiennej Rs
    
    Ramka4 = Instr(rs3 , A3)                                    ' szukaj w zmiennej Rs ciągu A3
    Ramka5 = Mid(rs3 , Ramka4 , 6)                              ' zwraca fragment tekstu ze zmiennej Rs
    
    
    '***************************** szuka ramki  odczytuje z ramki
    
    
    If Ramka1 = "$GPGGA" Then                                   ' jesli zmienna Ramka1 =  "$GPGGA" wtedy
    Czas = Mid(rs1 , 11 , 6)                                    ' zwróć wartość 6 kolejnych pól licząc od znaku 8-go z ciągu Rs
    
    
    End If
    
    
    If Ramka3 = "$GPRMC" Then                                   ' jesli zmienna Ramka1 =  "$GPRMC" wtedy
    La = Mid(rs2 , 17 , 9)                                      ' zwróć wartość 6 kolejnych pól licząc od znaku 8-go z ciągu Rs
    
    End If
    
    If Ramka5 = "$GPGSV" Then                                   ' jesli zmienna Ramka1 =  "$GPGSV" wtedy
    L_sat = Mid(rs3 , 13 , 2)                                   ' zwróć wartość 6 kolejnych pól licząc od znaku 8-go z ciągu Rs
    
    End If
    
    
    Waitms 199
    Rs1 = ""
    Rs2 = ""
    Rs3 = ""
    
    Loop
    
    End
    


    Dane są takie:
    $GPGGA,224752,4959.80695,N,01956.37185,E,1,04,4.1,182.8,M,42.0,M,,*42
    $GPGSA,A,3,21,18,22,16,,,,,,,,,9.2,4.1,8.2*3B
    $GPRMC,224752,A,4959.80695,N,01956.37185,E,0.2,197.9,250511,,*1F
    $GPGSV,3,1,12,01,76,216,,21,64,068,38,16,60,257,38,06,55,292,*7C


    w tym momencie wyświetla tylko godzinę, nie wiem, jak pominąć
    $GPGSA,A,3,21,18,22,16,,,,,,,,,9.2,4.1,8.2*3B
    bo nie chcę korzystać z tych danych.

    OK. Poradziłem sobie - trochę na około.

    Teraz problem - jak wyliczyć prędkość z tego ciągu
    $GPRMC,230340,A,4959.79044,N,01956.37777,E,0.1,194.9,250511,,*1A
    Prędkość się zmienia, a więc ilość znaków także.
  • #3 9546473
    maximus22_kr
    Poziom 18  
    Może by zrobić tak
    $GPRMC,230340,A,4959.79044,N,01956.37777,E,0.1,194.9,250511,,*1A

    Wyciągnąć pięć pozycji ze stringu licząc od 44 miejsca
    Speed1 = Mid(Rs , 44 , 5 )


    Obliczyć w którym miejscu występuję przecinek
    
    Dim Znaczek as string*1
    Znaczek = ","
    Speed2 = Insrtr(Speed1 , Znaczek )
    


    Wycinać ze stringu odpowiednią ilość pól, w zależności od pozycji zmiennej Znaczek
    
    Speed3 = Mid( Speed1, Speed2 )
    


    Otrzymana prędkość jest w jednostkach Knot
    Niestety nie wiem jak przeliczyć, może trzeba rozbić na wartość przed "przecinkiem" i po przecinku, a później to "złożyć"
REKLAMA