Witam. Chcę wyłuskiwać tylko godzinę z tego co leci $GPGGA. Na LCD nie ma problemu, bo " Lcd Chr(gpsin) ; " załatwia resztę za nas. Ale... , jak teraz dokonać konwersji aby można było to ( godzinę ) wyświetlić Może ktoś się z tym bawił ? Oczywiście procesor nie koniecznie ATtiny2313. Popatrzcie na kod : $regfile = "attiny2313.dat" $crystal = 11059200 $baud = 9600 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6 Config Lcd = 16 * 2 Dim Gpsin As Byte , X As Byte , Count As Byte Cls Cursor Off Wait 1 Lcd "GPS Clock" Wait 4 Cls Cursor Off Start: Gpsin = Waitkey() If Gpsin <> "$" Then Goto Start Gpsin = Waitkey() If Gpsin <> "G" Then Goto Start Gpsin = Waitkey() If Gpsin <> "P" Then Goto Start Gpsin = Waitkey() If Gpsin <> "G" Then Goto Start Gpsin = Waitkey() If Gpsin <> "G" Then Goto Start Gpsin = Waitkey() If Gpsin <> "A" Then Goto Start Gpsin = Waitkey() If Gpsin <> "," Then Goto Start Count = 0 Locate 1 , 5 For X = 1 To 4 'jeżeli chcemy sekundy to wpisujemy 6 zamiast 4 Gpsin = Waitkey() While Gpsin = "," Gpsin = Waitkey() Count = Count + 1 If Count = 3 Then Goto Start 'jeżeli chcemy sekundy to wpisujemy 5 Wend Lcd Chr(gpsin) ; If X = 2 Then Lcd ":"; ' dwukropek między 'godz i min 'If X = 4 Then Lcd ":"; ' dwukropek między min i sek Next X Goto Start: Pozdrawiam, Wiesław.
|
|||
Re. GPS
Przyjrzałem się temu i wyglada nieskomplikowanie. Rozumiem że chodzi o wyświetlanie czterech cyfr z dwukropkiem posrodku. Gdybyś chociaż opisał jaki masz moduł a jeszcze lepiej jaki jest sposób transmisji (co tam leci) to pomogłoby i Tobie i innym. Nie do końca wiadomo jakie dane konwertować, czy dzielić dwucyfrowe na pojedyncze wyświetlacze..itd.
BARTek
Moja strona
Dane
Dane typowe dla transmisji GPS.
Masz tu przykładową ramkę
$GPGGA,183730,3907.356,N,12102.482,W,1,05,1.6,646.4,M,-24.1,M,,*75
System NMEA 0183.
183730 oznacza godzinę 18:37:30.
Jest to ASCII , czyli na terminalu windowsowym lub Linuksowym
ramka wygląda tak jak wyżej.
**************************************************************
Jak zamienić liczbę ASCII 183730 na wartość decymalną aby po podzieleniu
wyświetlić na 7seg.disp. ?
Moduły
Modułów mam kilka, każdy inny i wszystkie działają tak samo.
Tu nie ma filozofii.
Problem tkwi tylko w konwersji ciągu ASCII do postaci Decymalnej.
Poczytaj o NMEA 0183, dowiesz się więcej.
Tak, interesuje mnie tylko HH:MM - cztery cyfry ( może później sześć ).
Oczywiście dwukropek sobie zrobię innym sposobem.
Re Moduły, Dane,GPS
Nie wiem czy wolicie napisac to sami i tylko potrzebujecie wskazówki :D
Po przeprowadzonym rozeznaniu widac że te ASCII przesyła cyfry jako 30+cyfra, czyli 2 to 32 po prostu.
Droga jest jednak prostsza.
W deklaracji zmiennych dodałbym np.
Cztery znaki ASCII odbieracie za pomocą zmiennej X
Zamiast wyświetlacza w pętli For Next wstawiacie
Co da Wam tabelę czterech już zdekodowanych i nawet zindeksowanych wartości do przedstawienia na wyświetlaczach
Y(1)= 1
Y(2)= 8
Y(3)= 3
Y(4)= 7 (to godzina z przykładu)
Chcąc zaoszczędzić na nogach procesora bo macie 4 wyświetlacze do multipleksowania zamienić można te wartości na kod BCD dodajac układzik dekodera i czterocyfrowy wyswietlacz śmiga na osmiu nóżkach.
BARTek
Moja strona
odp
hejka !
Czyli myślisz o czymś takim ?
Tu procek M16, mam ich około 140 sztuk i nie zależy mi na oszczędnościach :)
Ale wracając do tematu, czy ten kod ma prawo działać ?
A co z czasem UTC i "naszym" lokalnym.
Co z czasem zimowym i letnim u "nas" ?
Aaaaa, no i najważniejsze -- dzięki za zainteresowanie i podpowiedź.
Powiedz czym się bawisz w temacie ( "w temacie" - to nie po polsku, prawidłowo jest "na temat" ) programowania ?
Mam zasoby, którymi mogę się podzielić.
Takie jak :
ULN 2803
74HC164
MEGA16
MEGA164 - TO SAMO CO M16
MEGA8
DIODY LED 10MM, 5MM
WYŚWIETLACZE LED
Nowy kod
Hej "EDC" zaciekawiłeś mnie tym dekoderem BCD-7seg.
Tak z czystej ciekawości coś nabazgrałem ale nie wiem czy to będzie działać.
Bascom kompiluje bez problemu , sprawdzanie syntax też nie zgłasza problemów.
Jednak zanim zrobię kolejną płytkę chciałbym aby ktoś zerknął na kod i powiedział czy jest dobrze napisany.
Mam obiekcje co do portu, na którym ma się pokazywać wartość w BCD.
Zerknijcie :
Za wszelką pomoc dziękuję.
Re. Nowy kod
Na początku myślałem że przedstawiony pierwszy kod to spreparowany wycinek jakiegoś większego projektu i tylko pomysłu na konwersję danych potrzebujesz..
Po pierwsze, mimo iż w wojsku nie byłem, to lubie porządek w moich programach. Łatwiej je zrozumieć i błędy wyłapywać(wyjątkiem jest mój warsztat i biurko) :D
Każdy program musi najpierw zadziałać w głowie i jak tak popatrzysz to w tym Twoim kodzie:
Jeśli procesor nie odbierze prawidłowej sekwencji danych to ciągle wraca na poczatek. O ile w LCD to co na niego wyślesz sie tam wyświetla dopóki nie wyślesz czegoś nowego to przy 7segLED musisz ciągle "pracować" nad multipleksowaniem i w oczekiwaniu na nowa wartość czasu "odświeżać" wyświetlanie z pamięci. Tutaj nie dość,ze jak będzie brak danych z GPS to program stanie to jeszcze nie wiem czy tak szybko odświeża żeby "to " obróciło :D
Co do kodu BCD. Jak budujesz płytkę pod swój program to możesz skorzystać z tej komendy Makebcd, ale nawet jeśli miałbys piny rozrzucone po procku to da się to przeskoczyć. Przykładem jest te rozwiązanie które dostałem już zrobione do naprawy -> Projekt wyświetlacza kościelnego gdzie tablica załatwiła sprawe a to, że na tym porcie była jeszcze obsługa RS485 nie było problemem.
Uważam, że nie wyważa się otwartych drzwi i powinno się najpierw poszukac podobnego projektu z synchronizacją czasu ale radiową i tam zaimplementować dopiero GPS. Lub przynajmniej najpierw uruchomić zegarek, najlepiej na dużym procku, a dopiero potem dopisać czas z GPS.Jak zadziała to wtedy można myśleć nad optymalizacją kodu i wciśniecie tego do małego Tinny.
Program od podstaw musi uwzględniać takie rzeczy jak różnice czasowe (może być proste +1 i switch zima/lato na pinie procesora)
Chciałbym poznać koncepcje tego zegarka Przecież musi działać dalej po zaniku sygnału GPS.
Taki zegarek miałby sens gdyby np. nie miał żadnego guzika! Po włączeniu wyświetlałby cztery zera, a gdyby złapał sygnał GPS to ustawiłby sie sam..korekcja czasu w miarę dostępności GPS. Brak obsługi klawiszy i jakichś RTC daje szanse na upchnięcie tego do Tinny. Napisz jak to widzisz bo narazie to gdybanie.
BARTek
Moja strona
jednak
kod działa dobrze na LCD.
Z podpowiedzi konwersji asc-dec chcę użyć tego do 7seg.
Nie zakładam zaniku sygnału GPS, a jezeli nawet to nic się nie stanie .
Mam jeszcze zegarek w telefonie itp.
Chodzi o zabawę.
Jednak cofnę się do poprzedniego kodu na M16, to powinno zadziałać.
Po zaniku zasilania zegar gaśnie , po pojawieniu się napięcia łapie sygnał GPS
i pokazuje czas.
Czas letni/zimowy to już inna bajka.
GPS pomysł ..
Posznupałem..powęszyłem :D
Wiadomo, że żeby działało na wyświetlaczach LED musi być multipleksowanie i do tego petla potrzebna.
Można spróbowac tak, że program który będzie przetwarzał i wyświetlał dane działał w pętli, a odczyt danych z GPS będzie obsługiwane w przerwaniu wywołanym bezpośrednio z UART. Zamiast "On Innterrupt" albo
"On Timer" wpisujemy
ON Urxc
i program do którego ma skoczyć gdy odbiera jakieś dane. Przykład niżej:Spróbuj przepisać tak program żeby wyświetlanie danych (na razie na LCD)było w pętli
Do Loop
z odświeżaniem co 1s np. a czytanie danych w przerwaniu. Jak to zacznie wyświetlać poprawnie na LCD (w postaci Y1= 1 itd..) to jesteś w domu bo zamiast LCD dasz multipleksowanie i gitara :D
BARTek
Moja strona
?
Wszystko mnie się zagmatwało i powstał mętlik w głowie.
Tylko po co bawić się z lcd ? Od razu robić finalny na LED.
Ale i tak w tym momencie zabrakło pomysłów .
Re. ?
Jak to "po co?" Teraz wyświetla Ci na LCD czas ale jako Char i masz to zbudowane... To możesz bez budowania jakiejkolwiek płytki przetestowac sposób konwersji tych danych na takie które można wyświetlać na LED. Każ wyświetlić na LCD cztery zmienne które sa potrzebne na LED..coś takiego:
Będzie można zobaczyć zdekodowane zmienne czyli potwierdzić poprawność konwersji. Po prostu program dekodujący zmienne musi mieć swój rytm i jedynie nasłuchiwać nadawania z modułu GPS.
BARTek
Moja strona
re ?
nic z tego, wynik jest :
__________________
Y1=0 y2=0
Y3=0 Y4=0Y1=0 Y2
__________________
Oto kod :
GPS
No tu efekt akurat spodziewany.. Trzeba to sprowadzić do takiej formy żeby działało..
Wyświetlacz odświeżać w pętli na przykład co sekundę na początek z instrukcją
Cls
(żeby go nie zapełniać kolejnymi odczytami) a na dane czekać i odbierać w osobnym podprogramie. Wstaw samoCls
przed Lcd, ale chyba za szybko to będzie śmigać.
Do tego chyba nie do końca rozumiesz
Dim Y(4) As Byte
- to już rezerwuje miejsce dla czterech zmiennych (dla jednej tylko w czterech przypadkach) i niepotrzebne są te Y1 do Y4. W Twoim listingu nic nie przypisuje wartości tym zmiennym. Wartość mogą zyskać tylko Y(1), Y(2), Y(3) i Y(4) i o te wartości powinieneś pytac na wyświetlaczu (wyswietlać). Może wprowadziłem Cię w błąd poprzednią wypowiedzią , ale powtórzyłem tamten zapis po Tobie.Na dodatek napisałeś to jakby bez zrozumienia (albo nie zauważyłeś)bo warunek "If X = 2 Then Lcd.." jest tu nie na miejscu bo ma wyświetlac cztery zmienne... Myśl i pisz a ja postaram się coś na kształt ramy napisac.
EDYTOWANO
Jak ten Twój kod działa to ten też powinien..
Kwarc bym wymienił sobie później, ale program napisałem pod Twoje hardware :D
Przerwanie z minimalnym błędem wyliczone na 4ms zlicza zmienną Dzieln by odliczyć sekundę żeby wyświetlacz nie migał za często, a w żadne "Locate" sie nie bawiłem bo docelowo od razu w obsłudze przerwania da się
Incr Mux
i kolejne wyświetlacze ze zmiennymi Y(x)To taki mój pierwszy pomysł..nie jestem, ani alfą, ani omega więc każdy może dodać swoje 3 grosze.
To ma na celu wyświetlić rozdzieloną na cyfry godzinę i trzeba (gdyby nie działało) to dopieścić :D
O dziwo kompiluje się to bez błędów i tylko 50% Tinny zajmuje...z obsługą wyświetlacza.
BARTek
Moja strona
odp
na wyświetlaczu mam 10:01:52
Taka jest obecnie godzina + 1.
W listingu widzę, że masz y1... y2 itd.
LCD wyglądą tak :
01:03:15
next GPS
W ogóle nie rozumiem Twojej poprzedniej wypowiedzi więc prosiłbym na przyszłość pisac jaśniej lub mniej skrótowo.
Ja za to mam drugi wniosek racjonalizatorski. To jest tablica znaków ASCII przeze mnie skrócona.
Z tego, że po komendzie
Lcd Chr (Gpsin)
wyświetla Ci poprawny znak można śmiało wywnioskować że jest w Gpsin zakodowany i dekodowanie go przezAsc
nie ma sensu..wychodzi na to, że żeby uzyskać "czysta" cyfrę trzeba od Gpsin odjąć 48 i powinno wyjść to co chcemy zobaczyć.Więc zamiast
Y(x) = Asc(gpsin)
będzieY(x) = Gpsin - 48
Wchwili zatwierdzania tego postu u mnie 03:56
BARTek
Moja strona
Re: next GPS
Na początek przepraszam za moja paplaninę, miałem gości i rozrywałem się między kompem a nimi.
Teraz patrzę, że mam jakiś feler z programatorem.
OK, wziąłem drugi programator.
Wgrałem ten kod:
Na LCD mam:
Y1=1 Y2=6
Y3=2 Y4=3
Czyli 16:23.
Jest OK.
Jesteś wielki i....... cierpliwy.
A ja znowu czegoś się nauczyłem.
Re GPS
Hahah Victory ! :D Mnie też to bardzo cieszy. Ja już gdzieś napisałem że sam się uczę pomagając innym. Mi się to może przydac jak każde doświadczenie.
No to śmiało teraz z tym na wyświetlacze. Multipleksowanie bezpośrednio w przerwaniu a z dzielnika bym sobie połowę zostawił na migający dwukropek co 500ms. Życzę miłego użytkowania :D Pozdrawiam.
BARTek
Moja strona
Victory
Naprawiłem stary programator ( mogę ISP) bo drugi to kupiony w Progstar.
Wgrałem soft bez " Y(x) = Gpsin - 48" i wyświetla dane jakich można się spodziewać.
No tak, teraz dwie opcje :
1. BCD - dekoder - LED
2. większy proc i bezpośredni multiplex
Myślę, że popróbowałbym BCD, ale musiśz mnie nakierować/podpowiedzieć.
( Oczywiście nie musisz, możesz. Ale byłoby mi miło )
Aaa, Ty się uczysz, a ja zaczynam się uczyć.
Dodałem coś -- tak doświadczalnie :)
Niestety, radość zbyt szybka.
Zamiast godziny 20:06
jest
y1=1
y2=10
y3=0
y4=6
odp. Victory
Najprościej chyba tak:
W deklaracjach zmiennych dodajesz sobie pomocniczą, jeszcze jedną zmienną. W programach Mirleya często takie nazywaja się Hbyte (help byte).
W Twoim rozwiązaniu ciągle podbijasz wartość swojej zmiennej przy każdym przejściu przez pętle. Proponowane rozwiązanie bierze za każdym razem tę samą wartość Y(2) i dodaje do niej 1..no chyba bardziej tłumaczyć nie trzeba. No i dlatego zamiast Y(2) na wyświetlaczu wyswietla Z jako Y(2).
Co do dekodera BCD to nic skomplikowanego. Kombinacją 4 wejśc sterujących można uzyskać różne kombinacje 7 wyjść. Sciągasz sobie pdf SN74247 np. z Elenota i tam w nim jest "tabela prawdy" czyli jakie stany mają być na poszczególnych wejściach żeby wyświetlane było to co widać w tabeli. Podłączasz cztery porty procesora i tak nimi sterujesz poprzez zapisanie do całego portu wartości żeby uzyskać to co chcesz. W którymś z postów linkowałem do mojego programu "sterownika wyświetlacza kościelnego". Tam w programie jest wszystko wyjaśnione. Żeby się nie gryzło (dla ułatwienia sobie życia bo można to zrobić) to ustawianie BCD daj na porcie na którym jest RXT i TXT a sterowanie anodami kolejnych wyswietlaczy na drugim. W tamtym projekcie jest kostka UCY7447 ale ona jest starsza od węgla i nie wyświetla "ogonka" pod cyfrą 9 i "daszka" nad szóstką, więc od razu polecam Ci tego SN74247 albo co tam dostaniesz.
BARTek
Moja strona
7447
chodzi mi o konfigurację portów
Musiałem zrobić tak, aby była godzina 20:49
Incr Y(1)
If Y(1) > 2 Then Y(1) = 0
Cls
[/qb]
Ale to jeszcze nie załatwia sprawy bo możliwa jest godzina 25:00
No i zamiast godziny 21:02 mam 01:04
===================================================
Cofnąłem di takiej postaci
odp.7447
Chyba masz błąd w zapisie bo
Incr Y(1)
teraz wykonuje się zawsze. Prawidłowo chyba tak:...ale ja poszedłbym na całość :D
W deklaracjach np.
haha i tym sposobem montując mały wyłacznik i zwierajac pin do masy nie dodajesz godziny :D
BARTek
Moja strona
nie działa
nie działa.
Ale tez myslałem o guziku.
To dobry pomysł.
Działa.
wygląda to tak :
GPS - coś takiego
Chyba trzeba do tego podejśc wcześniej, i sprowadzić dwie cyfry w logiczną jedność
czyli Z = Y(1) * 10 'tu mamy np 20
Z = Z + Y(2) 'tu np 23
Z = Z + Lato
If Z = 24 Then
Z = 0
Y(1) = 0 'żeby znikneła 2
coś na ten wzór..może sie zamotałem..jeszcze myślę
BARTek
Moja strona
dla czego
Zrobiłem tak :
Wyświetla 22 : Y3=1 Y4=3
Jest dobrze, jak narazie.
Tłumaczę
Przygotowywanie zmiennej:
Z = Y(1)*10 bo Y(1) to dziesiętne godziny czyli bedzie już dziesiąta albo dwudziesta
potem 20 + 3 + Lato = 24 bo zegar rozumiem 24godzinny jest ..ale jeszcze myślę co z dziesiątą ..to tylko trop.. to już pewnie gdzieś rozwiązane jest ale warto makówkę poćwiczyć Ja to już nawet gdzieś widziałem chyba :D
BARTek
Moja strona
tak
Juz wykumałem o co chodzi
Sytuacja odwrotna do przeliczania termometru DS18B20
***************************************************
Ustawiłem czas letni, za pół godziny będzie 24:00
zobaczymy co się stanie.
Zadziała albo nie :)
Jeszcze to..
Myślę że przed samym podaniem na wyświetlacz zmienna Y(1) powinna przyjąć wartość z podzielenia przez dziesięć zmiennej Z (zamiast tego Y(1)=0) czyli z 20 do 23 będzie 2, z 10 do 19 będzie 1 bo jak dodasz 2h do np 9 rano to ma być 1 na Y(1) i analogicznie z 19tą
BARTek
Moja strona
zobaczymy
jeszcze tylko 15 minut i wyjaśni sie sprawa godziny 24:00
No i jest.
0 : Y3=0 Y4=1
odp. zobaczymy
To jak wygląda teraz te "Wyświetlanie:" ?
Zmieniłeś to, że Y(1) = Z / 10 bo jak nie to o godzinie 10 będzie też 0, a o 20 będzie 10
BARTek
Moja strona
re
Tak to wygląda
==============================================================
==============================================================
Zrobiłem tak
I mam czas
23:49
A jak przełączę na czas letni to mam
00:49
P.S.
To >>Lcd ; "A=" ; Y(1) ; ; " B=" ; Y(2) ; " C=" ; Y(3) ; " D=" ; Y(4)<<
jest po to aby zmieściło się w jednej linii LCD
No i niestety jest godzina 25:03
GPS ->
Skasuj to
Y(1) = 0
Teraz nic się nie dzieje bo w następnej linijce ta zmienna dostaje nowa wartość, ale to niepotrzebna instrukcja w kodzie. Nad resztą trzeba się zadumać. Nie przewidziałem Twojego przesuniecia o dwa zamiast o jeden i nic dziwnego że przyjmując wartość 25 nic już z nią nie robi.BARTek
Moja strona
a
przesunięcie o 2 to czas letni
Idę spać, jutro dalsza część męczarni.
Do jutra.
GPS - test it! :D
BARTek
Moja strona
RE:GPS - test it! :)
Testuję, w tej chwili jest OK.
Dzisiaj przerobiłem na 7 seg.
Działa dobrze, tabela2 to cyfry z kropką. Ona nie mruga a tylko oddziela godziny od minut.
Pozdrawiam.