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

[Bascom] [Bascom][Atmega328] Uart niepoprawnie odbiera dane GPS - jak to naprawić?

pier 09 Wrz 2012 16:43 2679 10
REKLAMA
  • #1 11294313
    pier
    Poziom 24  
    Witam.
    W moim urządzeniu atmega328 odbiera poprzez sprzętowy Uart ramki danych z odbiornika gps. Problem w tym że robi to jak chce.
    Dobrze odebrana ramka powinna wyglądać tak:
    $GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E

    A mi procesor odbiera różnie te ramki. Poniżej przykład:
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*"
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*"
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E
    $GPGGA,"
    $GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E
    $GPGGA,*33
    $GPVTG,,T,,M,,N,,K*"
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E
    $GPGGA,"
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E
    $GPGGA,*32
    $GPVTG,,T,,M,,N,,K*"
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E
    $GPGGA,"
    "$GPGGA,235948.000,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*3A
    $GPVTG,,T,,M,,N,,K*4E
    $GPGGA,*3A
    $GPVTG,,T,,M,,N,,K*"


    Odbiornik podłączony do hyper terminala wysyła idealne ramki cały czas więc z tej strony nie ma problemu.
    Problemem jest pewnie program:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program ma tak działać by po odebraniu ramki danych zapisać ją na kartę SD.

    Program tak jakby w nieodpowiednim miejscu wychodzi z warunkowej pętli ale przecież znak "*" jest zawsze w końcówce ramki i dopiero tam powinno zakończyć się odbieranie z Uartu.
    Uart pracuje z prędkością 4800 bodów a mega pracuje z kwarcem 7,3728MHz co powinno wyeliminować wszelkie błędy w transmisji.
  • REKLAMA
  • #2 11294434
    bobeer
    Poziom 28  
    Mnie to wygląda po prostu na gubienie danych które znajdują się po "*" a nadchodzą w momencie wykonywana 'Zaspis_na_sd".
  • REKLAMA
  • #3 11294508
    mickpr
    Poziom 39  
    Jak kolega bobeer zauważył - twoja procedura zapisu na SD trwa tyle, ze przerywa ci odczyt pozostałych ramek. Wysyłaj ramki wolniej, zwiększ prędkość zapisu na SD, albo zmień sposób odczytu ramek - niech się odczytują np. w przerwaniu.

    Poza tym czy oczekiwanie na '*' to jest to czego chcesz?.. Ramka źródłowa ma w sobie dwa takie znaki.
    Nie powinieneś oczekiwać na '$' ?
  • #4 11294596
    pier
    Poziom 24  
    W takim razie jak inaczej wykryć koniec ramki skoro na końcu zawsze jest co innego?

    A procedurę zapisu na kartę jak mam szybciej wykonać? Nadajnik wysyła ramki co sekundę i nie mam na to wpływu.

    A jak wykryć koniec ramki po znaku CR?


    Zrobiłem jak piszesz i dałem oczekiwanie na znak "$".
    Jest trochę lepiej ale i tak są błędne ramki.
  • #5 11294606
    mickpr
    Poziom 39  
    pier napisał:
    W takim razie jak inaczej wykryć koniec ramki skoro na końcu zawsze jest co innego?

    Wykrywaj początek.
    pier napisał:
    A procedurę zapisu na kartę jak mam szybciej wykonać? Nadajnik wysyła ramki co sekundę i nie mam na to wpływu.
    Sekunda to dużo czasu.
    Po drugie musisz za każdym razem otwierać plik zapisywać, robić flush i zamykać?
    Nie wystarczy otworzyć raz, zapisywać do otwartego pliku i w momencie żądania zakończenia przechwytywania (zapisywania na SD) ramek zrobić Flush i zamknąć plik?
    Ewentualnie flush po każdej zapisanej ramce (bez tego zamykania pliku)?
    pier napisał:
    A jak wykryć koniec ramki po znaku CR?

    Można i tak, nie znam formatu ramki.
    pier napisał:
    Najlepiej by było aby procek zapisał mi na kartę całą ramkę jaką wysyła co sekundę.
    Taką ramkę:

    Ramka ma stałą długość? Nie znam formatu ramki.
  • REKLAMA
  • #6 11294633
    Mundi1970
    Poziom 24  
    No jak ma niegubić danych jak przy każdym wywołaniu procedury Zaspis_na_sd jest wykonywana inicjalizacja karty, a proces ten jest dość czasochłonny (może nawet trwać 1 sekundę). Inicjalizacje karty, inicjalizacje systemu pliku i otwarcie pliku wykonaj raz przed rozpoczęciem odczytu danych z GPS'u. A procedurze Zaspis_na_sd powinno zostać:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Po Flush'u można jeszcze sprawdzić czy nie wystąpił błąd, jak zakończysz zapis wtedy zamknij plik.


    EDIT: Ups spóźniłem się :)

    Jeżeli wykorzystujesz hardwarowe SPI, to ustaw SPI na maksymalną prędkość i po Spiinit dopisz:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 11294880
    pier
    Poziom 24  
    Już prawie opanowałem ten odczyt. Nie jest to wina zbyt długiego zapisu na kartę.

    Zrobiłem to tak że stringa "dane" dzielę za pomocą funkcji split a później jeśli pierwszy człon stringa dane jest "$GPGGA" to następuje zapis na kartę.
    I taki sposób działa ale tylko raz. Raz zapisze poprawnie ramkę i tyle nie ma więcej zapisów.

    Oto nowy kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #8 11350200
    miszczunio84
    Poziom 2  
    Pier bądź ktoś kto ma sprawdzoną działającą bibliotekę "config_mmc.bas" mam pytanko. Czy możecie mi przekopiować treść skonfigurowanej pod atmega328p bibliotekę :
    $include "Config_MMC.bas" 'Konfiguracja karty SD

    bo jak sobie załaduję config_mmc.bas do programu to mi procek nie wykonuję tego co mu zadałem. Wcześniej już używałem tej biblioteki do atmegi32 i tam wszystko działało a teraz poprzestawiałem porty pod atmege328p ale chyba gdzieś popełniam błąd bo nie działa.

    Please HELP bo potrzebuję to na pilnie!!!
  • #9 11350698
    pier
    Poziom 24  
    W załączniku biblioteka mmc.bas skonfigurowana pod standardowe porty SPI Atmegi328
  • #10 11355778
    miszczunio84
    Poziom 2  
    Dzięki serdecznie Pier. Teraz już wiem co przeoczyłem. Po użyciu tej od Ciebie już jest ok. A takie pytanko jeszcze mam bo będę robił zapis do karty micro_sd. Czy masz sprawdzony algorytm na zapis do karty micro_sd. Bo ja napisałem swój ale czasem mi się wiesza karta i się zastanawiam w czym robię błąd. Jeśli mógłbyś mi go też wystawić do przeanalizowania to był bym bardzo dzwięczny. Pozdrawiam.



    Piere, sorki że tak męczę ale jednak nie jest ok. Znaczy po użyciu skonfigurowanej przez Ciebie biblioteki mmc procesor po wgraniu programu zachowuje się prawidłowo (to znaczy nie wiesza mi się bo jak wcześniej ją sobie sam konfigurowałem to się wieszał) ale nie mogę nic zapisać ani na kartę sd ani na kartę micro_sd. Walczę już drugi dzień i nic. Jeśli chodzi o kod to wykorzystałem algorytm który działa mi na atmega32. Podłączenia sprawdziłem kilka razy. Szukając przyczyny zrobiłem już małe "śledztwo" mianowicie podłączyłem analizator stanów logicznych do działającej atmegi32 i podejrzałem co leci po spi gdy działa prawidłowo i zapisuje mi do pliku a następnie to samo zrobiłem dla niezapisującej atmegi328p i tu przebiegi jak przypuszczam inicjujące transmisję znacznie różnią się od tych z atmegi32. Przypuszczam że jest to przyczyną tego że nie zapisuje ale nie znam powodu bo w obu przypadkach działam na spi-hard wiec mój udział w konfiguracji jest minimalny.

    Dlatego mam pytanie czy masz w 100% działający program w którym atmega328p zapisuje coś na kartę sd lub micro_sd. Chodzi o banalny programik w którym udział bierze tylko procesor i karta pamięci (tylko napisz jaki typ karty). Jeśli tak, proszę żebyś go wystawił bo mi za chwilę czacha pęknie od myślenia dlaczego to nie działa. Wtedy po prostu wgram go sobie i jeśli będzie działał to bede mógł poszukać błędu. I jak byś dorzucił przy okazji do tego bibliotekę avr_dos (nie wiem czy tam się coś konfiguruje bo ja tam nic nie zmieniam) i jeszcze raz tą mmc żeby już nie było żadnych wątpliwości. Bardzo proszę o pomoc i w miarę możliwości szybką odpowiedź. Pzdr


    A no i zapomniałem zapytać czy kartę sd lub micro_sd do atmega328p podłączamy bezpośrednio z procka czy konieczne jest używanie jakiegoś układu dopasowującego??
  • #11 11356567
    dondu
    Moderator na urlopie...
    miszczunio84 napisał:
    A no i zapomniałem zapytać czy kartę sd lub micro_sd do atmega328p podłączamy bezpośrednio z procka czy konieczne jest używanie jakiegoś układu dopasowującego??

    To zależy, czy występuje różnica napięć zasilania karty i uC: http://mikrokontrolery.blogspot.com/2011/03/podlaczenie-karty-pamieci-sd.html
REKLAMA