GPS


Witam.
Może ktoś pomoże.
Zacząłem bawić się z modułem GPS.
Przy pomocy kolegi Simona z Nowej Zelandii (ZL1SWW) poczyniłem program, który działa.

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ć
na 7seg. LED ?

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.




Portret użytkownika EDC

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

Portret użytkownika gosc

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. ?

Portret użytkownika Wieslaw.S

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.

Portret użytkownika EDC

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.

Dim Y(4) As Byte

Cztery znaki ASCII odbieracie za pomocą zmiennej X
Zamiast wyświetlacza w pętli For Next wstawiacie
  Y(X)=Asc(Gpsin)


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

Portret użytkownika Wieslaw.S

odp

hejka !

Czyli myślisz o czymś takim ?

'------ Konfiguracja -
 
 
$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600
' rx pin 14 pd.0
' tx pin 15 pd.1
Config Portc = Output
Config Porta = Output
 
'---------------------------------- Zmienne ------------------------------------
 
Dim Y1 As Byte
Dim Y2 As Byte
Dim Y3 As Byte
Dim Y4 As Byte
Dim Mux As Byte
Dim Gpsin As Byte
Dim X As Byte
Dim Count As Byte
Dim Y(4) As Byte
 
 
'------------------------------------
Do
 
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
 
For X = 1 To 4
 
Gpsin = Waitkey()
 
While Gpsin = ","
 
Gpsin = Waitkey()
 
Count = Count + 1
 
If Count = 3 Then Goto Start
 
Wend
 
Y(x) = Asc(gpsin)
 
Next X
 
'==========================================================================
 
Y1 = Lookup(y1 , Tabela)
Y2 = Lookup(y2 , Tabela)
Y3 = Lookup(y3 , Tabela)
Y4 = Lookup(y4 , Tabela)
 
 
If Y4 = 192 Then Y4 = 255   ' wygaszanie zera wiodącego
 
 
   Incr Mux
  If Mux = 4 Then Mux = 0
 
 
  Select Case Mux
 
    Case 0:
 
     Set Porta.0
      Portc = Y1
     Reset Porta.3
 
    Case 1:
 
     Set Porta.3
      Portc = Y2
     Reset Porta.2
 
    Case 2:
 
     Set Porta.2
     Portc = Y3
     Reset Porta.1
 
       Case 3:
 
     Set Porta.1
      Portc = Y4
     Reset Porta.0
 
 
  End Select
 
     Loop
      End
 
Return
 
 
'**********************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty

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

Portret użytkownika Wieslaw.S

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 :

$regfile = "attiny2313.dat"
$crystal = 11059200
$baud = 9600                                                ' PD.0 = RX  ,  PD.1 = TX
 
Config Portb = Output                                       'wyjście kodu BCD do dekodera 74LS47
Config Pind.2 = Output                                      'anoda cyfry 1
Config Pind.3 = Output                                      'anoda cyfry 2
Config Pind.4 = Output                                      'anoda cyfry 3
Config Pind.5 = Output                                      'anoda cyfry 4
 
 
Dim Gpsin As Byte
Dim X As Byte
Dim Count As Byte
Dim Y(4) As Byte
Dim B1 As Byte
Dim B2 As Byte
Dim B3 As Byte
Dim B4 As Byte
 
Dim Mux As Byte
 
 
Do
 
 
 
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
 
For X = 1 To 4
 
Gpsin = Waitkey()
 
While Gpsin = ","
 
Gpsin = Waitkey()
 
Count = Count + 1
 
If Count = 3 Then Goto Start
 
Wend
 
Y(x) = Asc(gpsin)
 
Next X
 
 
 
'=============================================================================
'
'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)
'
'zaoszczędzić na nogach procesora bo macie 4 wyświetlacze do multipleksowania
'zamienić można te wartości na kod BCD dodając układzik dekodera i 'czterocyfrowy wyświetlacz śmiga na ośmiu nóżkach.
'
'===============================================================================
'
 
B1 = Makebcd(y(1))
B2 = Makebcd(y(2))
B3 = Makebcd(y(3))
B4 = Makebcd(y(4))
 
 
 
   Incr Mux
  If Mux = 4 Then Mux = 0
 
 
  Select Case Mux
 
    Case 0:
 
     Set Portd.2
      Portb = B1
     Reset Portd.5
 
    Case 1:
 
     Set Portd.5
      Portb = B2
     Reset Portd.4
 
    Case 2:
 
     Set Portd.4
     Portb = B3
     Reset Portd.3
 
       Case 3:
 
     Set Portd.3
      Portb = B4
     Reset Portd.2
 
 
  End Select
 
     Loop
      End
 
Return

Za wszelką pomoc dziękuję.

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

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.

Portret użytkownika EDC

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:

On Urxc Uart_rx
Enable Urxc
Enable Interrupts

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

Portret użytkownika Wieslaw.S

?

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 .

Portret użytkownika EDC

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:

Do
...kod
Lcd "Y1="; Y1; " Y2="; Y2
Lowerline
Lcd "Y3="; Y3; " Y4="; Y4
 
Loop

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

Portret użytkownika Wieslaw.S

re ?

nic z tego, wynik jest :
__________________
Y1=0 y2=0
Y3=0 Y4=0Y1=0 Y2
__________________

Oto 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
Dim Y(4) As Byte
Dim Y1 As Byte
Dim Y2 As Byte
Dim Y3 As Byte
Dim Y4 As Byte
 
Cls
 
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                                              'if time with seconds type 6
 
Gpsin = Waitkey()
 
While Gpsin = ","
 
Gpsin = Waitkey()
 
Count = Count + 1
 
If Count = 3 Then Goto Start                                'if time with seconds type 5
 
Wend
 
 
 
 
'Lcd Chr(gpsin) ;
 
  Y(x) = Asc(gpsin)
 
 
 
'=====================================
Lcd "Y1=" ; Y1 ; " Y2=" ; Y2
Lowerline
Lcd "Y3=" ; Y3 ; " Y4=" ; Y4
 
'=======================================
 
 
If X = 2 Then Lcd ":";                                      ' double point between hour and min
 
'If X = 4 Then Lcd ":"; ' double point between min and sec
 
Next X
 
Goto Start:

Portret użytkownika EDC

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 samo Cls
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..

$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
Cursor Off
Cls
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Wyswietlanie
 
Dim Gpsin As Byte , X As Byte , Count As Byte , Y(4) As Byte
Dim Dziel As Byte
 
Enable Interrupts
 
'***START***
Do
 
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
 
For X = 1 To 4
 
Gpsin = Waitkey()
 
While Gpsin = ","
 
Gpsin = Waitkey()
 
Count = Count + 1
 
If Count = 3 Then Goto Start
 
Wend
 
Y(x) = Asc(gpsin)
 
Next X
 
Loop
 
 
Wyswietlanie:                                               'obsluga przerwania
 
Timer0 = 85                                                 'przy tym kwarcu przerwanie co okolo 4ms
 Incr Dziel                                                 'co sie przyda do multipleksowania
   If Dziel = 250 Then                                      'a narazie co 1s
     Dziel = 0
Cls
Lcd "Y1=" ; Y(1) ; " Y2=" ; Y(2)                            'wyswietla zmienne
Lowerline
Lcd "Y3=" ; Y(3) ; " Y4=" ; Y(4)
 
   End If
Return

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

Portret użytkownika Wieslaw.S

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

Portret użytkownika EDC

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 przez Asc 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ędzie Y(x) = Gpsin - 48

Wchwili zatwierdzania tego postu u mnie 03:56

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

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:

                    $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
Cursor Off
Cls
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Wyswietlanie
 
Dim Gpsin As Byte , X As Byte , Count As Byte , Y(4) As Byte
Dim Dziel As Byte
 
Enable Interrupts
 
'***START***
Do
 
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
 
For X = 1 To 4
 
Gpsin = Waitkey()
 
While Gpsin = ","
 
Gpsin = Waitkey()
 
Count = Count + 1
 
If Count = 3 Then Goto Start
 
Wend
 
Y(x) = Gpsin - 48                                           'Y(x) = Asc(gpsin)
 
Next X
 
Loop
 
 
Wyswietlanie:                                               'obsluga przerwania
 
Timer0 = 85                                                 'przy tym kwarcu przerwanie co okolo 4ms
 Incr Dziel                                                 'co sie przyda do multipleksowania
   If Dziel = 250 Then                                      'a narazie co 1s
     Dziel = 0
Cls
Lcd "Y1=" ; Y(1) ; " Y2=" ; Y(2)                            'wyswietla zmienne
Lowerline
Lcd "Y3=" ; Y(3) ; " Y4=" ; Y(4)
 
   End If
Return

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.

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

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 :)

Wend
 
Y(x) = Gpsin - 48   
 
Next X
 
Y(2) = Y(2) + 1      'Dodałem tę linię i czas jest OK, na razie (zimowy) :)
 
Loop
 
Wyswietlanie:         'obsluga przerwania

Niestety, radość zbyt szybka.

Zamiast godziny 20:06
jest
y1=1
y2=10
y3=0
y4=6

Portret użytkownika EDC

odp. Victory

Najprościej chyba tak:

'***DEKLARACJE***
Dim Z As Byte 'dodaj zmienną pomocniczą na początku
 
Do
...kod
Loop
 
Wyświetlanie:
Timer0 = 85                                                 'przy tym kwarcu przerwanie co okolo 4ms
 Incr Dziel                                                 'co sie przyda do multipleksowania
   If Dziel = 250 Then                                      'a narazie co 1s
     Dziel = 0
 
 Z = Y(2) + 1
Cls
Lcd "Y1=" ; Y(1) ; " Y2=" ; Z                            'wyswietla zmienne
Lowerline
Lcd "Y3=" ; Y(3) ; " Y4=" ; Y(4)

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

Portret użytkownika Wieslaw.S

7447

chodzi mi o konfigurację portów

Musiałem zrobić tak, aby była godzina 20:49

   [qb]
  Z = Y(2) + 1
     If Z > 9 Then Z = 0

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

  Z = Y(2) + 1
     If Z > 9 Then Z = 0

Portret użytkownika EDC

odp.7447

Chyba masz błąd w zapisie bo Incr Y(1) teraz wykonuje się zawsze. Prawidłowo chyba tak:

Z = Y(2) + 1
If Z > 9 Then
   Z = 0
   Incr Y(1)
   If Y(1) > 2 Then Y(1) = 0
End If

...ale ja poszedłbym na całość :D

W deklaracjach np.

Config PORTB.7 = Input
Set PORTB.7
 
Dim Lato As Bit
 
Do
...kod
Loop
 
Wyswietlanie:
 
 Z = Y(2) + Lato

haha i tym sposobem montując mały wyłacznik i zwierajac pin do masy nie dodajesz godziny :D

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

nie działa

nie działa.

Ale tez myslałem o guziku.
To dobry pomysł.

Działa.
wygląda to tak :

.
.
.
Config Pinb.0 = Input   
.
.
.
  If Pinb.0 = 0 Then Z = Y(2) + 1         ' Czas Zimowy
  If Pinb.0 = 1 Then Z = Y(2) + 2         ' Czas Letni
 
 
Cls
Lcd "Y1=" ; Y(1) ; " Y2=" ; Z
Lowerline
Lcd "Y3=" ; Y(3) ; " Y4=" ; Y(4)

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

dla czego

Zrobiłem tak :

Z = Y(1) * 10                                               'tu mamy np 20
Z = Z + Y(2)                                                'tu np 23
   If Pinb.0 = 0 Then Z = Z + 1                             ' Czas Zimowy
   If Pinb.0 = 1 Then Z = Z + 2                             ' Czas Letni
   If Z = 24 Then Z = 0
Y(1) = 0                                                    'żeby znikneła 2
 
Cls
 
Lcd ; Z ; " : Y3=" ; Y(3) ; " Y4=" ; Y(4)

Wyświetla 22 : Y3=1 Y4=3

Jest dobrze, jak narazie.

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

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 :)

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

zobaczymy

jeszcze tylko 15 minut i wyjaśni sie sprawa godziny 24:00

No i jest.

0 : Y3=0 Y4=1

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

re

Tak to wygląda

$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
 
Config Pinb.0 = Input
 
Cursor Off
Cls
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Wyswietlanie
 
Dim Gpsin As Byte , X As Byte , Count As Byte , Y(4) As Byte
Dim Dziel As Byte
Dim Z As Byte
Dim A As Byte
 
Enable Interrupts
 
'***START***
Do
 
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
 
For X = 1 To 4
 
Gpsin = Waitkey()
 
While Gpsin = ","
 
Gpsin = Waitkey()
 
Count = Count + 1
 
If Count = 3 Then Goto Start
 
Wend
 
Y(x) = Gpsin - 48
 
Next X
 
Loop
 
Wyswietlanie:                                               'obsluga przerwania
 
 
 
Timer0 = 85                                                 'przy tym kwarcu przerwanie co okolo 4ms
 Incr Dziel                                                 'co sie przyda do multipleksowania
   If Dziel = 250 Then                                      'a narazie co 1s
     Dziel = 0
 
 
Z = Y(1) * 10                                               'tu mamy np 20
Z = Z + Y(2)                                                'tu np 23
   If Pinb.0 = 0 Then Z = Z + 1                             ' Czas Zimowy
   If Pinb.0 = 1 Then Z = Z + 2                             ' Czas Letni
   If Z = 24 Then Z = 0
Y(1) = 0                                                    'żeby znikneła 2
 
Cls
 
Lcd ; Z ; " : Y3=" ; Y(3) ; " Y4=" ; Y(4)
 
   End If
Return

==============================================================
==============================================================
Zrobiłem tak
Z = Y(1) * 10                           'tu mamy np 20
Z = Z + Y(2)                            'tu np 23
   If Pinb.0 = 0 Then Z = Z + 1         ' Czas Zimowy
   If Pinb.0 = 1 Then Z = Z + 2         ' Czas Letni
   If Z = 24 Then Z = 0
Y(1) = 0                                'żeby zniknęła 2
 
Y(1) = Z / 10
 
Y(2) = Z Mod 10
 
Cls
 
Lcd ; "A=" ; Y(1) ; ; " B=" ; Y(2) ; " C=" ; Y(3) ; " D=" ; Y(4)

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

Portret użytkownika EDC

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

Portret użytkownika Wieslaw.S

a

przesunięcie o 2 to czas letni

Idę spać, jutro dalsza część męczarni.

Do jutra.

Portret użytkownika EDC

GPS - test it! :D

Z = Y(1) * 10                           'tu mamy np 20
Z = Z + Y(2)
Z = Z + 1                               'stale przesuniecie od UTC
   If Z = 24 Then Z = 0
If Pinb.0 = 1 Then Z = Z + 1         ' Czas Letni
   If Z = 24 Then Z = 0
 
 
Y(1) = Z / 10
 
Y(2) = Z Mod 10
 
Cls
 
Lcd ; "A=" ; Y(1) ; " B=" ; Y(2) ; " C=" ; Y(3) ; " D=" ; Y(4)

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

RE:GPS - test it! :)

Testuję, w tej chwili jest OK.

Dzisiaj przerobiłem na 7 seg.

$regfile = "attiny2313.dat"
$crystal = 11059200
$baud = 9600
 
Dim Gpsin As Byte
Dim X As Byte ,
Dim Count As Byte
Dim Y(4) As Byte
Dim Z As Byte
Dim Mux As Byte
 
Config Portb = Output                                       '8 bitów na 7seg.
Config Pind.2 = Output                                      'anoda1
Config Pind.3 = Output                                      'anoda2
Config Pind.4 = Output                                      'anoda3
Config Pind.5 = Output                                      'anoda4
Config Pind.6 = Input                                       'przełącznik czasu
 
Config Timer0 = Timer , Prescale = 256
Enable Interrupts
Enable Timer0
On Timer0 Co4ms
 
Do
 
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
For X = 1 To 4
Gpsin = Waitkey()
While Gpsin = ","
Gpsin = Waitkey()
Count = Count + 1
If Count = 3 Then Goto Start
 
Wend
Y(x) = Gpsin - 48
 
Next X
 
Z = Y(1) * 10
Z = Z + Y(2)
Z = Z + 1
 
If Z = 24 Then Z = 0
If Pind.6 = 1 Then Z = Z + 1
If Z = 24 Then Z = 0
 
Y(1) = Z / 10
Y(2) = Z Mod 10
 
Y(1) = Lookup(y(1) , Tabela)
Y(2) = Lookup(y(2) , Tabela2)
Y(3) = Lookup(y(3) , Tabela)
Y(4) = Lookup(y(4) , Tabela)
 
 
Loop
End
 
 
Co4ms:
Timer0 = 85
 
   Incr Mux
   If Mux = 4 Then Mux = 0
 
   Select Case Mux
 
   Case 0:
 
   Set Portd.2
   Portb = Y(3)
   Reset Portd.5
 
   Case 1:
 
   Set Portd.5
   Portb = Y(4)
   Reset Portd.4
 
   Case 2:
 
   Set Portd.4
   Portb = Y(2)
   Reset Portd.3
 
   Case 3:
 
   Set Portd.3
   Portb = Y(1)
   Reset Portd.2
 
End Select
 
Return
 
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
' znak     0     1     2     3     4     5     6     7     8     9    pusty
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16
' znak    0.    1.   2.   3.   4.    5.  6.   7.   8.  9.

Działa dobrze, tabela2 to cyfry z kropką. Ona nie mruga a tylko oddziela godziny od minut.

Pozdrawiam.