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

Jak odczytać wybrane dane z GPS na AVR MEGA16 w Bascom?

PiotrLotnik 30 Maj 2005 20:06 10913 13
REKLAMA
  • #1 1536834
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    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
  • REKLAMA
  • Pomocny post
    #2 1537175
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Może by tak:
    
    $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
    '-------------------------------------------------------------------------------
    '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
    Dim Run As Byte , Gprmc As Byte , Cntr As Byte , Tudr As Byte , Ok As Bit
    Run = 1 : Reset Ok
    Enable Urxc
    Enable Interrupts
    'Licznik_pomoc = 1
    Led Alias Porta.0
    Ddra.0 = 0
    Do
       While Ok = 0 : Wend       'czekaj na wczytanie danych
       Reset Ok
       Toggle Led
       Locate 1 , 1
       Lcd Speed
       Locate 2 , 1
       Lcd Czas
       Locate 3 , 1
       Lcd _date
    Loop
    End
    
    Przerwanie_uart_rx:
    If Run <> 0 Then
       Run = Udr Xor 36       'jeśli w udr jest asc("$"), to run=0
       If Run = 0 Then
          Cntr = 0       'licznik=0 po wczytaniu "$"
          Czas = ""
          Speed = ""
          _date = ""
       End If
    Else
       Select Case Cntr
          Case 0 To 4
             Tudr = Lookup(cntr , Gg)
             Run = Udr Xor Tudr       'odczytujemy kolejno znaki G,P,R,M,C , w przeciwnym
                                       'razie zmienna Run<>0 do nadejścia kolejnego znaku "$"
          Case 6 To 11       'znaki od 5 do 10 , wczytać do "czas"(poniżej podobnie)
             Czas = Czas + Chr(udr)
          Case 38 To 42
             Speed = Speed + Chr(udr)
          Case 50 To 55
             _date = _date + Chr(udr)
          Case 56
             Set Ok : Run = 1       'odebrano dane,czekaj na kolejny znak "$"
          Case Else
             Tudr=Udr
       End Select
       Incr Cntr
    End If
    
    Return
    Gg:
    Data 71 , 80 , 82 , 77 , 67       '"GPRMC"
    


    Piotrek

    PSD
    Pozycję znaków dla CASE policz sam , bo mi się .... :wink:
  • REKLAMA
  • #3 1537338
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Program bardzo ciekawy :)
    Przetestowałem go na GPSie i tak.
    Prędkość wyświetla dobrz tak samo date, niestety nie wyswietla czasu, czyli drugiej linijki.

    Jednak progrramik jest obiecujacy,choć wydaje sie troszke zagmatwany.

    Dzieki.

    Piotr
  • #4 1537390
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    PiotrLotnik napisał:

    ... choć wydaje się troszke zagmatwany.


    He he.A mnie Twój wydaje sie zagmatwany :wink:

    PS
    Czas nic nie pokazuje , czy jakies krzaki :?:
  • #5 1537455
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    odnośnie czsu to pusta linijka.

    Powoli już wczytuje się twoją koncepcje :) nie jest zagmatwana :)

    Jedna sprawka jeszcze mnie martwi a mianowicie co sie będzie działo jak bedzie sie zmieniać ilość znaków bo chyba po to są przecinki zeby skracać transmisje.
    Mam nadzieje ze tak nie bedzie (jak narazie nie wygląda)
  • #6 1538576
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Udało mi się poprawić mój program

    Jednym z większych błędów jest fakt że przetwanie jest zbyt długie i często nim całość podprogramu zostanie wykonana wartość w UDR jest juz inna. Dlatego na początek wprowadziłem zmienną w której przechowywana jest pierwsza wartość wpisana do UDR.

    Co tu będe ściemniać :) Oto podprogram

    '-------------------------------------------------------------------------------
    Przerwanie_uart_rx:
    W = Udr

    If Ok2 = 1 And Przecinek = 1 And W <> "," Then
    Incr Licznik_pomoc2
    Mid(czas , Licznik_pomoc2) = Chr(w)
    End If

    If Ok2 = 1 And Przecinek = 7 And W <> "," Then
    Incr Licznik_pomoc2
    Mid(speed , Licznik_pomoc2) = Chr(w)
    End If

    If Ok2 = 1 And Przecinek = 9 And w <> "," Then
    Incr Licznik_pomoc2
    Mid(_date , Licznik_pomoc2) = Chr(w)
    End If

    If Przecinek = 11 Then
    Ok = 1
    End If

    If w = "," Then
    Incr Przecinek
    Licznik_pomoc2 = 0
    End If

    If w = "$" Then 'sprawdza czy odpowiedni znak
    Licznik_pomoc = 1
    Gps = Chr(w) 'resetuje napis i rozpoczyna znakiem "$"
    Przecinek = 0
    Else
    If Licznik_pomoc < 6 Then
    Incr Licznik_pomoc
    Mid(gps , Licznik_pomoc) = Chr(w) 'wstawia znak z w na okreslonej pozycji
    If Gps = "$GPRMC" Then
    Ok2 = 1
    Else
    Ok2 = 0
    End If
    End If
    End If

    Return

    Zostałem przy swoim programi dlatego, że wystarczy dostawić kolejny warunek i można odczytać kolejne dane.

    Pozdrawiam
    Piotr
  • REKLAMA
  • #7 1539597
    august_a
    Poziom 21  
    Posty: 572
    Pomógł: 32
    Ocena: 4
    A jakiego GPSa wykorzystujesz? Chodzi mi o typ i producenta. Może jakaś strona www albo coś?
  • #8 1548162
    keysim
    Poziom 2  
    Posty: 3
    Witam,
    Ja tez walcze z GPSem, wprowadzilem do programow powyzej inne dane do odczytu, wszystkie dane nie mieszcza mi sie na LCD 2x16, jak nalalezy zrobic menu przelaczne przelacznikiem. Jeszcze nie wiem jak zrobic aby wartosci, ktore sa pogrobione odczytac, bo zniemia sie ich polozenie oraz dlugosc danych.

    $GPVTG,248.58,T,,M,3.88,N,7.2,K*65
    $GPVTG,5.70,T,,M,0.12,N,0.2,K*63
    $GPVTG,,T,,M,,N,predkosc,K*4E
    jak nie ma danych to wyglada to nastepujaco
    $GPVTG,,T,,M,,N,,K*4E

    tak samo z tymi wartosciami; co nalezy zrobic, aby wyswietlic na LCD

    $GPRMC,171009.150,A,5339.4040,N,01431.5857,E,29.19,8.12,280505,,*37
    $GPRMC,102038.442,A,5317.4469,N,01413.5648,E,0.00,,280505,,*1B
    $GPRMC,235950.000,V,0000.0000,N,00000.0000,E,,,091102,,*17

    $GPGGA,171010.150,5311.4123,N,01411.5877,E,1,05,2.1,91.7,M,41.8,M,0.0,0000*4E
    $GPGGA,102039.442,5317.4478,N,01413.5647,E,1,03,27.1,0.0,M,41.8,M,0.0,0000*4A

    oto pierwszy etap programu

    $regfile = "M16def.dat"
    $crystal = 11059200
    $baud = 4800
    On Urxc Przerwanie_uart_rx
    
    '-------------------------------------------------------------------------------
    
    Dim Dlugosc As String * 11 , Szerokosc As String * 11 , Satelity As String * 2
    Dim Godziny As String * 2 , Minuty As String * 2 , Sekundy As String * 2
    Dim Predkosc As String * 5 , Wysokosc As String * 6 , Data0 As String * 6
    
    Dim Przecinek As Byte
    Dim Run As Byte , Gprmc As Byte , Cntr As Byte , Tudr As Byte , Ok As Bit
    Run = 1 : Reset Ok
    Enable Urxc
    Enable Interrupts
    
    Cls
    
    Do
      While Ok = 0 : Wend                                       'czekaj na wczytanie danych
      Reset Ok
    '-- 1
      Locate 1 , 1
      Lcd Szerokosc
      Locate 2 , 1
      Lcd Dlugosc
      Locate 2 , 15
      Lcd Satelity
      Locate 1 , 14 : Lcd "Sat"
        Cursor Off
    '-- 2
    '  CLS
    '  Lcd Satelity
    '  Locate 1 , 14 : Lcd "Sat"
    '  Locate 1 , 1
    '  Lcd "UTC:" : Lcd Godziny : Lcd ":" : Lcd Minuty : Lcd ":" : Lcd Sekundy
    '  locate 2, 1
    '  lcd data0
    '  Cursor Off
    '-- 3
    '  CLS
    '  Lcd Satelity
    '  Locate 1 , 14 : Lcd "Sat"
    '  Locate 1 , 1
    '  Lcd predkowsc
    '  locate 2, 1
    '  lcd wysokosc
    '  Cursor Off
    Loop
    End
    
    
    Przerwanie_uart_rx:
    If Run <> 0 Then
       Run = Udr Xor 36                                         'jeśli w udr jest asc("$"), to run=0
       If Run = 0 Then
          Cntr = 0                                              'licznik=0 po wczytaniu "$"
          Szerokosc = ""
          Dlugosc = ""
          Satelity = ""
     '2
          Godziny = ""
          Minuty = ""
          Sekundy = ""
          Data0 = ""
     '3
          Predkosc = ""
          Wysokosc = ""
    
       End If
    
       Else
       Select Case Cntr
          Case 0 To 4
             Tudr = Lookup(cntr , Gga)                          'odczyt GGA
             Run = Udr Xor Tudr                                 'powrot do znaku $
          Case 6 To 7                                           'znaki selekcja
             Godziny = Godziny + Chr(udr)
          Case 8 To 9                                           'znaki selekcja
                Minuty = Minuty + Chr(udr)
          Case 10 To 11                                         'znaki selekcja
             Sekundy = Sekundy + Chr(udr)
          Case 17 To 27                                         'znaki selekcja
             Szerokosc = Szerokosc + Chr(udr)
          Case 30 To 40                                         'znaki selekcja
                Dlugosc = Dlugosc + Chr(udr)
          Case 44 To 45                                         'znaki selekcja
             Satelity = Satelity + Chr(udr)
          Case 46
            Set Ok : Run = 1                                    'odebrano dane,czekaj na kolejny znak "$"
          Case Else
             Tudr = Udr
       End Select
       Incr Cntr
    End If
       Return
    
    ' Dane NMEA
    Gga:
    Data 71 , 80 , 71 , 71 , 65                                 'GPGGA
    Vtg:
    Data 71 , 80 , 86 , 84 , 71                                 'GPVTG
    Rmc:
    Data 71 , 80 , 82 , 77 , 67                                 'GPRMC
    
    
    
  • #9 1554779
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Przetestowałem ten programik i u mnie nie działa poprawnie, czyli na M16 z 16MHz i GPS "GARMIN 12XL"
    Wyświetlane są przesunięte znaki.
    Moim zdaniem to wina tego, że udr zmienia sie niem zostaną wykonan wszystkie procedury w przerwaniu.

    Pozdrawiam Piotr

    PS Podobnie miałem ze swoim programem ale naprawiłem to po trzez skopiowanie udr do zmiennej na samym początku.
    Dane są wyświetlane dobrze tylko, że co 2s (a powinny być do 1s)
  • #10 1593025
    tremorpl
    Poziom 12  
    Posty: 27
    Ocena: 9
    Witam.

    Czy mozna rozwinac temat ???

    Jakiego odbiornika użyc i czy moze to byc dowlny na PS2 lub jak duze problemy beda z odb na USB.

    Pozdrawiam
    Robert
  • REKLAMA
  • #11 1621115
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    tremorpl napisał:
    Jakiego odbiornika użyc i czy moze to byc dowlny na PS2 lub jak duze problemy beda z odb na USB.
    USB do taniego procka nie podłączysz, za mało mocy obliczeniowej i za bardzo się układ rozbuduje. A PS2 to nie wiem, powinieneś się zainteresować odbiornikami ze złączem RS232 albo modułami GPS one z reguły maja transmisje asynchroniczną o jakieś okrągłej prędkosci (takiej jak rs232) tyle że sygnał w logice TTL (prościej podłączać do uP).
  • #12 1621298
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Najlepiej taki co ma RS232 i interfejs NMEA
    Ja mam GARMINA 12XL i działa bez problemowo
    Pozdrawiam
  • #13 1621357
    keysim
    Poziom 2  
    Posty: 3
    Mozna zastosowac dowolny odbiornik tylko trzeba wyprowadzic dane NMEA bezposrednio z proca. Ja tak zrobilem na dwoch odbiornikach, jeden tylko z USB, a drugi USB+RS232. Do polaczenia z mikrokontrolerem mozna zastosowac inwenterek z serii 74HC....
    Załączniki:
    • Jak odczytać wybrane dane z GPS na AVR MEGA16 w Bascom? GPS 033.JPG (46.41 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Jak odczytać wybrane dane z GPS na AVR MEGA16 w Bascom? GPS 014a.jpg (83.13 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #14 1976326
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Temat zakończony.
    Problem rozwiązany :)
    Doświadczenie zdobyte :)
    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy odczytu wybranych danych z modułu GPS podłączonego do mikrokontrolera AVR MEGA16 programowanego w Bascom. Głównym problemem jest selektywne wyodrębnianie wartości takich jak prędkość, czas, data i wysokość z ciągów NMEA, przy jednoczesnym zachowaniu poprawnej synchronizacji danych w przerwaniu UART. Zaproponowano rozwiązanie polegające na kopiowaniu pierwszej odebranej wartości z rejestru UDR do zmiennej, aby uniknąć nadpisywania danych podczas długiego przetwarzania przerwania. Omówiono także kwestie wyświetlania danych na LCD 20x4 oraz problemy z przesunięciami znaków i zmienną długością danych wynikającą z obecności przecinków w protokole NMEA. Wskazano, że do poprawnej pracy najlepiej używać odbiorników GPS z interfejsem RS232 i protokołem NMEA, co ułatwia integrację z mikrokontrolerem. Poruszono również temat ograniczeń mikrokontrolera MEGA16 w kontekście podłączenia GPS przez USB oraz konieczności stosowania konwerterów poziomów logicznych. W dyskusji wymieniono konkretne modele odbiorników GPS, które sprawdzają się w takich zastosowaniach.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA