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

Pobieranie danych z GPS? - [AVR][C]

lgema 25 Lis 2010 16:14 3288 5
REKLAMA
  • #1 8787985
    lgema
    Poziom 2  
    Witam, ponieważ jestem początkującym elektronikiem w dziedzinie programowania mikroprocesorów, a na tym forum znalazłem bardzo dużo informacji dlatego chciałbym pogłębić swoją wiedzę na ten temat i dlatego postanowiłem pytać.

    Otóż, trochę o programowaniu już wiem (niezawile, ale zawsze coś) dlatego postanowiłem skonstruować sobie lokalizator GPS wykorzystując atmega32 i chwalony przez członków forum modem GPS-FGPMMOPA6B .
    Znalazłem kilka postów na ten temat, ale w dużej większości z nich używa się języka Bascom, a nie jak w moim przypadku C do programowania.

    Problemy mam dwa:
    1 - jak poprawnie podłączyć moduł GPS do mikroprocesora (oczywiście mam na myśli linię transmisji danych)?
    Czy wystarczy jak podepnę bezpośrednio linę TX z modułu GPS do mikro-kontrolera, czy poprzez jakiś rezystor - jaki?

    2 - nie wiem jak ma wyglądać instrukcja pobierająca dane z GPS, a dokładniej z ramki $GPRMC bo tą wybrałem, prosiłbym o kawałek programu na którym mógłbym się czegoś nauczyć oczywiście w C.
    pozdr.
  • REKLAMA
  • #2 8788083
    bisz
    Poziom 18  
    Co prawda nie znam tego twojego GPS'a ale jeżeli piszesz symbol Tx to mniemam że jest to transmisja szeregowa z 'komputerowym' poziomem napięć, zatem na dzień dobry potrzebujesz układu max232 który dokonuje konwersji na poziom TTL
  • REKLAMA
  • Pomocny post
    #3 8788273
    M. S.
    Poziom 34  
    1. Tx gps podłącz do Rx uC (jeśli napięcia zasilania są takie same dla gps i uC).
    2. GPS powinien sypać danymi na okrągło (Enable = 1). Trzeba wyłowić potrzebnie dane. Pamiętać należy o szybkości transmisji.
  • REKLAMA
  • #4 8788310
    lgema
    Poziom 2  
    bisz napisał:
    Co prawda nie znam tego twojego GPS'a ale jeżeli piszesz symbol Tx to mniemam że jest to transmisja szeregowa z 'komputerowym' poziomem napięć, zatem na dzień dobry potrzebujesz układu max232 który dokonuje konwersji na poziom TTL


    Hmm, o ile dobrze interpretuje Datasheet ATmega32 i GPSu
    Datasheet -> Electrical Characteristics
    powinno działać bez konwersji zwłaszcza, że oba urządzenia zasilam napięciem 3.3V.

    M. S. napisał:
    1. Tx gps podłącz do Rx uC (jeśli napięcia zasilania są takie same dla gps i uC).


    Dzięki tak właśnie myślałem i tak zrobię.

    Dodano po 2 [minuty]:

    M. S. napisał:
    2. GPS powinien sypać danymi na okrągło (Enable = 1). Trzeba wyłowić potrzebnie dane. Pamiętać należy o szybkości transmisji.


    Teoretycznie wiem chyba jak to zrobić, ale nie potrafię tego praktycznie wykorzystać, tzn. ogólnie myślę by zrobić tak:
    bufor = '';
    duzybufor ='';
    lista_pobranych_komend = pusta
    dopóki (nie zabito wątku) rób
    {
        ustaw_timeout(100);
        czytaj_dostepne_znaki(bufor);
        duzybufor = duzybufor + bufor;
        dopóki (w buforze $) rób
        {
            jeśli (w buforze /r) rób
            {
                usuń z bufora wszystko przed $
                komenda = wytnij z bufora wszystko od $ do /r
                dodaj komenda do lista_pobranych_komend
            }
            w przeciwnym razie
                przerwij pętlę
        }
        jeśli (lista_pobranych_komend nie pusta) rób
        {
            synchronizuj lista_pobranych_komend z wątkiem głównym
            lista_pobranych_komend = pusta
        }
    }
  • REKLAMA
  • #5 8788794
    Piotrek_P
    Poziom 18  
    Proponuję przeanalizowć ten projekt:
    Link

    Znalazłem to jakiś czas temu szukając pomocy w obsłudze kart SD.

    Pozdrawiam
    Piotrek
  • #6 8792713
    namlooc
    Poziom 15  
    lgema napisał:

    Teoretycznie wiem chyba jak to zrobić, ale nie potrafię tego praktycznie wykorzystać


    Przedewszystkim odbieraj dane w przerwaniu
    
    ISR(USART1_RX_vect)  // przerwanie do odbioru znaku i zapisu do bufora 
    { 
    bufor[ilosc_znakow]=UDR1; ++ilosc_znakow; 
    }


    GPS bezprzerwy sra danymi, praktycznie tylko dobierasz od niego dane.
    Najprosciej zapisz pewna ilosc znakow do bufora, i np. sprawdzic czy jest tam GPGGA.Wada jest to odczytujesz co 2-3 pozycje, bo ilosc znakow jaka musisz zapelnic bufor jest duza, aby zapewnic tam 100% obecnosc GPGGA

    
    wynik=strstr("GPGGA",bufor)
    if(wynik==0)
    {//nieznaleziono GPGGA }
    else
    {//zmienna wynik zawiera wskaznik do pierwszego wystapienia GPGGA
    //odczytujesz od tego miejsca tyle znakow ile potrzebujesz  }
    


    Wersja ambitniejsza to bufor kołowy ze wskaznikiem odczytu i zapisu. Wskaznik zapisu generuje sie sam wraz z przyplywem znakow. Wskanzik odczytu sam przesuwasz po buforze odczytujac kolejne znaki, szukajac $. W tym przypadku masz 100% pewnosc ze nie pominiesz niczego.
REKLAMA