Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 5 gru 2024, o 04:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 7 sty 2013, o 22:25 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

Cześć. Odbieram dane z GPS i potrzebuje tylko jeden łańcuch: $GPRMC, (każdy łańcuch zakończony ENTERem)
Wszystkie łańcuchy w przerwaniu są ładowane do bufora, gdy łąńcuch jest kompletny (zakończony enterem) zwiększa się zmienna ascii_line Kod do odbioru danych z buforu cyklicznego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ze względu, ze potrzebuje tylko jeden łańcuch to chce zrobić coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Czy sprawdzanie czy jest $GPRMC zrobić w funkcji parsującej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 22:54 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

peikman napisał(a):
Czy sprawdzanie czy jest $GPRMC zrobić w funkcji parsującej?


Po to właśnie pokazałem taki rodzaj obsługi żeby było wygodnie. Toż w funkcji parsującej korzystasz z tych ciągów, które nadleciały i ciebie interesują, a inne ? jeśli cię nie interesują to lecą w kosmos - po co grzebać w czeluściach Zdarzenia TYLKO po to żeby wyławiać jeden interesujący ciebie ciąg. Owszem uzyskasz może i to samo tylko że zniszczysz sobie mechanizm fajnie zaprojektowany gdy później przyjdzie ci do głowy że np warto jeszcze coś wziąć pod uwagę.....

a korzystając z funkcji parsującej - robisz WSZYSTKO na zasadzie "róbta co chceta" - a mechanizm dalej działa jak brzytwa.


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 22:34 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

OK. Rozumiem. Jednak dzisiaj chciałem pójść dalej aby dane odebrane z GPS wyświetlić, zapisać w pamięci FLASH, wykonać obliczenia średniej prędkości itp... Czy to wszystko mogę zrobić w funkcji parsującej? Taki sposób pierwszy przyszedł do głowy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 23:16 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No pewnie że tak można - po to jest sobie taka funkcja parsująca - tak tylko z ciekawości zapytam - co to za pamięć zewnętrzna Flash ??? a nie przypadkiem EEPROM ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2013, o 16:34 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

Pamięć szeregowa, data flash: AT45DB

Urządzenie ma być czymś w stylu datalogera i wyświetlaniem aktualnych i ciekawych danych na LCD :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2013, o 16:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

peikman napisał(a):
Urządzenie ma być czymś w stylu datalogera i wyświetlaniem aktualnych i ciekawych danych na LCD :)


aaa ;) to ok

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sty 2013, o 23:51 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Nie mogę przebrnąć tego kawałka kodu. Podłączyłem GPS bezpośrednio do USB i HYPERTERMINAL pokazuje piękne ramki zaczynające się od $GPRMC.

Natomiast program nie chce przejść przez: if (buf && (strcmp(buf,"$GPRMC")==0))

Próbowałem wyświetlić na LCD co jest w buf ale wyświetlają same smieci. Czy ta komenda: lcd_str(buf); jest dobra do tego celu?

Może w przerwaniu coś źle robię.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2013, o 00:09 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a wiesz do czego jest ta funkcja ? że pytasz czy ona jest odpowiednia ? przepraszam, że o to pytam - ale twoje pytanie wskazuje na to jakbyś próbował jej użyć na zasadzie zgadywania - czy się uda czy się nie uda ? i jakbyś w ogóle nie wiedział jak ona działa w środku :( ... Gdyby to było prawdą - to ciężko ci będzie ogarnąć taki program :(

przede wszystkim (poczytaj w niebieskiej książce jak ona działa) a później zastanów się co masz w tym buforze ? ale też ile znaków w nim jest ????? bo to że w terminalu się ładnie wyświetla to co jest odbierane to zrozumiałe - ile masz znaków w wierszu w terminalu ? a ile masz znaków w wierszu wyświetlacza LCD ? Próbowałeś kiedyś na LCD wyświetlić string/łańcuch tekstowy zawierający np 80 znaków albo więcej taką funkcją jak mówisz ?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


??? jak myślisz co się stanie ? ... nawet jak nie wiesz to może warto popróbować ?

Więc nawet zakładając - że nie wiesz jak ta funkcja działa - to co za problem zamiast na LCD wyrzucić to samo sobie na terminal do komputera, przecież nóżkę RX procka możesz podłączyć do odbiornika który wysyła ci te ramki a nóżkę TX procka do terminala i od razu wysyłać na kompa to co odebrałeś - wtedy nie będziesz miał np problemu za małego wyświetlacza

chociaż i z wyświetlaczem da radę to pięknie testować - tylko wypadałoby sobie np skrócić łańcuch tekstowy w buforze ??? jeśli zapytasz mnie jak ???? to niedobrze - oznaczać to będzie że mocno jednak nie doczytałeś podstaw o tablicach i łańcuchach tekstowych w C i dlatego masz takie kłopoty .... w przeciwnym wypadku wystarczyłoby zrobić tak

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i proszę - wyświetli się tylko 15 pierwszych znaków z bufora. A jeśli będą krzaki jak mówisz to tak samo będą krzaki na terminalu - więc problem pewnie leży całkiem gdzie indziej i na pewno nie w tym przerwaniu z książki.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2013, o 21:11 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

Rozumiem, że funkcja lcd_str() wysyła znaki na LCD aż pojawi się NULL w łańcuchu. Wyszedłem z założenie, że funkcja strtok_r (buf,",",&reszta) zakończy token znakiem 0 (NULL) i więcej znaków się nie wyświetli... Skoro $GPRMC, ma 6 znaków do przecinka to wyświetli sie 6 znaków. Jednak nie przewidziałem sytuacji, że przecinka może nie być oraz innych ewentualności.

Proponujesz wstawienie w miejsce 15 bufora (który jest tablicą) wartości 0 która przerwie funkcje lcd_str().

Czy wporządku myślę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2013, o 23:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

no dokładnie ale jeszcze raz poczytaj o strtok_r() albo strtok() ... bo widzę że jakiś błąd robisz.... bo JEŚLI zadziałałoby prawidłowo to:

buf = strtok_r(pBuf,",",&reszta);

czyli po $GPRMC byłby ten przecinek to nie ma że boli - wyświetliłoby ci się dokładnie

$GPRMC

i wcale nie trzeba dawać 0 w 15-bajcie

ale skoro tak się nie dzieje - to coś wcześniej musisz źle robić z tą funkcją ....

------------------------ [ Dodano po: kilkunastu sekundach ]

dlatego proponuję ci wyświetlić sobie pBuf jeszcze przed zadziałaniem strtok_r()

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2013, o 17:05 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

Wstawiłem kod wyświetlający w przerwaniu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Próbowałem też bez _delay_ms() ale dalej same krzaczki się wyświetlają.

Zmieniłem rezonator wewnętrzny na zewnętrzny 8MHz ale nie tu problem...

Wnioskuje, że funkcja lcd_str() coś nie działa gdy podaje wskaźnik jako parametr. :roll:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2013, o 18:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

peikman napisał(a):
Wnioskuje, że funkcja lcd_str() coś nie działa gdy podaje wskaźnik jako parametr. :roll:


Tak tak to bardzo "dobry" wniosek ;) .... szczególnie gdy tak ją wykorzystujesz w przerwaniu ;)

w takim razie KLOPS .... nic nie da rady zrobić - trzeba pisać lcd_str() CAŁKIEM od nowa skoro źle działa ;) ....

ciekaw tylko jestem dlaczego u mnie działa w KAŻDEJ sytuacji i dodam jak coś - że u wszystkich czytelników też działa ;)

..... zatem przemyśl czy nie zrewidować przypadkiem swojego wniosku - bo ja na pewno się nie zabiorę za naprawę dobrze działającej funkcji - sorki :(

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2013, o 21:26 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

peikman napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dla pojedynczych znaków masz funkcję lcd_char. Kod powinien wyglądać następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Natomiast to co masz wyżej to po wyświetleniu 1 poprawnego znaku leci dalej wyświetlając znaki odpowiadające różnym liczbom niekoniecznie z zakresu drukowanych kodów ASCII, bo skoro to nie jest string to nie jest zakończony '/0'

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2013, o 23:28 
Offline
Użytkownik

Dołączył(a): 06 sty 2012
Posty: 25
Lokalizacja: Wejherowo
Pomógł: 0

Dzięki za odpowiedzi.
Drogi Mirku, miałem na myśli, że przypadkowo przy przepisywaniu czy kopiowaniu popełniłem jakiś błąd w funkcjach LCD ;) zresztą gdy po raz 20-sty analizowałem kod to naprawdę doszukiwałem się błędu we wszystkim...

Najważniejsze, że po wielu godzinach udało się rozwiązać problem. :)

Bit ckdiv8 był ustawiony a nie powinien :roll: i chyba nie muszę nic dodawać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO