Elektroda.pl
Elektroda.pl
X
Tektronix
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

06 Kwi 2019 20:31 432 10
  • Poziom 8  
    Witajcie,

    dziś postanowiłem się podzielić dorobkiem w postaci oprogramowania i wiedzy na temat pewnego modułu GPS.
    Zegar softowy synchronizowany GPS z dodatkowym wyświetlaniem współrzędnych i prędkości no i dorzuciłem w ostatniej chwili temperaturę z DS18B20 - taki szkoleniowy programik w BASCOM (świetny przykład - gotowiec dla tych którzy chcą zrobić układ z wykorzystaniem właściwości GPS). Ideą projektu było rozpracowanie modułu GPS - dotąd mi nie znanego oraz pokazanie jak łatwo można go wykorzystać dosłownie w każdym projekcie.

    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Do celów realizacji i sprawdzenia wykorzystałem jak zwykle - służący mi od lat - zestaw uruchomieniowy z Gotronik z prockiem Atmega16 taktowany 16MHz.

    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Shemacik połączeń na szybko odręczny (w sumie zbudowałem setki układów a schematów ani jednego prócz tego co z netu, dlategoz braku czasu tylko odręcznie rysowany):
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Na COM3 podłączoną mam atmegę16 z zestawem, który wysyła do terminala232 (tylko TX FT232 onboard), a na COM6 mam podłączony konwerter USB<>TTL oparty o FT232 (Rx i Tx) który przesyła dane pomiędzy iQ_Monitorem, a modułem GPS.

    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Do obsługi, ustawiania i zmian ramek GPS'a używam programu IQ_Monitor,
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ
    którego podrzucę wraz ze wszystkimi opisami oraz manualem w jakimś bundle'u, jeśli będzie zainteresowania - zobaczymy.

    O module:
    Moduł GPS Trimlbe Lassen iQ jest uniwersalny, z wykorzystaniem adaptera bezproblemowo nadaje się do Arduiono wystarczy użyć 4 piny 1. +5V, 2. -5V oraz do odczytu w uC 3. TX (NMEA uwaga: domyślnie szybkość transmisji jest 4800) i ew. do wysyłania do modułu 4. RX (RTCM). Wysoka jakość produktu ze Stanów, chyba nikomu nie trzeba tłumaczyć, podwyższona czułość hiper niski pobór mocy, bardzo wysoka dokładność w wyznaczaniu pozycji, kompatybilny z GPS, GALILEO, GLONASS, dwa porty jeden do serwisu i zmiany ustawień, a drugi do wykorzystania w aplikacji - super wygodna rzecz, mały gabaryt, same zalety no i cena :) najniższa na rynku, można odnaleźć na allegro lub OLX wpisując "GPS Lassen IQ".

    Pierwsze dwa zdjęcia to sam moduł rozebrany z osłony aluminiowej. Kolejne to osobno moduł na płytce adaptacyjnej w dwóch wariantach. Następnie duży schemat jak podłączyć moduł GPS z ARDUION UNO. I potem kolejne foty z opisami adaptera antenowego.
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Moduł jest na płytce adaptacyjnej, która pozwala na dojście do układu za pomocą goldpin, można go oczywiście odłączyć wlutować mikro-złącze goldpin i użyć w na swojej płytce. Standardowo moduł posiada jeden z dwóch przewodów antenowych, jeden to adapter dla przewodu długiego i anteny zewnętrznej, a drugi to kabelek z aktywną mini-antenką GPS. Płytka adaptacyjna wykorzystuje wszelkie możliwości modułu i daje dostęp do wszystkiego, włącznie z możliwością podłączenia zewnętrznej baterii 3.3V do podtrzymania pamięci modułu. Antena w tym projekcie jest za oknem podłączona do modułu za pomocą adaptera kablowego. Na jednym ze zdjęć powyżej pokazałem w jaki sposób można zabezpieczyć moduł na adapterze tak aby nie wypadł z gniazda, można go polutować na stałe jeśli nie mamy zamiaru zmiany adaptera antenowego lub zrobić pętelkę z drucika 0.5mm - ja na zdjęciu.

    Płytka adaptera jest mojego autorstwa - wymiary 30x41x8mm (UWAGA masa zasilania=masa PC=masa sygnałów - to ta sama ścieżka).
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Obecność sygnału GPS jest obrazowana za pomocą piktogramu GPS'a, a brak sygnału obrazowany kręcącym się kółeczkiem "rodem" z windows10 :), zapraszam do obejrzenia jak to działa na filmie:
    FILMIK: https://www.youtube.com/watch?v=lfCqRCl5hVA

    Dla ścisłości: to co wypisuje na filmie terminal 232 to nie dane z GPS tylko z atmega16 po odczytaniu GPS pakietu NMEA GPRMC, który wygląda tak: $GPRMC,180821.00,A,4957.7118,N,02246.2254,E,000.0,000.0,140319,02.8,E,A*02
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    ponadto można ustawić następujące ramki:
    GGA, CSV, GLL, GSA, TF, VTG, ZDA, BA oraz interwał podawania danych od 1 sek w górę
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Działający program w BASCOMIE v. 2.0.7.6:

    ' Autor: Mirek, www.mirekkon.pl, mirekkon(malpa)vp.pl, Copyright C-2025
    ' Zegar astronomicznej dokładności z wykorzystaniem dowolnego modułu GPS generującego NMEA $GPRMC
    ' Przykładowy ciąg -----> $GPRMC,180821.00,A,4957.7118,N,02246.2254,E,000.0,000.0,140319,02.8,E,A*02
    ' NMEA $GPRMC Recommended minimum specific GPS/Transit data --> http://aprs.gids.nl/nmea/
    $Regfile="m16def.dat"
    $Crystal=16000000
    $hwstack=40
    $swstack=16
    $framesize=32

    Open "comd.0:4800,8,n,1" For Input As #2
    Open "comd.1:4800,8,n,1" For Output As #1

    Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
    Config Lcd = 16 * 2
    Cursor Off

    Config Pind.2 = Input ' klawisz zmiany wartości wyświetlanych
    Ok Alias Pind.2
    Config Pind.3 = Input ' klawisz wejścia do menu ustawień ręcznych zegara oraz zmiana wartości +
    Up Alias Pind.3
    Config Pind.4 = Input ' klawisz zmiany wartości na -
    Dwn Alias Pind.4

    Config Portd.5 = Output
    Config Portd.6 = Output
    Config Portd.7 = Output
    Config Portb = Output
    Config Porta = Output
    Config Portc = Output

    Deflcdchar 0,14,17,17,14,14,4,4,32 ' GPS symbol
    Deflcdchar 1,32,4,16,32,17,4,32,32
    Deflcdchar 2,32,4,17,32,16,4,32,32
    Deflcdchar 3,32,4,17,32,17,32,32,32
    Deflcdchar 4,32,4,17,32,1,4,32,32
    Deflcdchar 5,32,4,1,32,17,4,32,32
    Deflcdchar 6,32,32,17,32,17,4,32,32
    Deflcdchar 7,8,20,8,32,32,32,32,32 ' stopień

    Enable Interrupts
    Config Clock = Soft ' zegar programowy wymaga podłączenia kwarcu 32678 na PC6 i PC7
    Config Date = Mdy , Separator = - ' separator dowolny ascii np: / lub - lub . itp

    Declare Sub wyswietl
    Declare Sub Ds18b20
    Declare Sub Ustawzegar

    Dim i As Byte
    Dim Licznik As Byte
    Dim menu As Byte
    Dim s1 As single
    Dim s2 As single
    Dim systsec As Long
    Dim Dzientyg As String * 3
    Dim miesiac As String * 3
    Dim GPSstr As String * 75
    Dim G As String * 2 ' Godzina wyciagnieta z ramki $GPRMC
    Dim M As String * 2 ' Minuta wyciagnieta z ramki $GPRMC
    Dim S As String * 2 ' Sekunda wyciagnieta z ramki $GPRMC
    Dim DD As String * 2 ' dzień wyciagniety z ramki $GPRMC
    Dim MM As String * 2 ' miesiąc wyciagniety z ramki $GPRMC
    Dim RR As String * 2 ' rok wyciagniety z ramki $GPRMC
    Dim vznak As String * 1 ' znak validacji
    Dim Dlugoscstop As String * 2
    Dim Dlugoscmin As String * 2
    Dim Dlugoscsek As String * 4
    Dim Dlugosckier As String * 1 ' E wschód lub W zachód
    Dim Szerokoscstop As String * 2
    Dim Szerokoscmin As String * 2
    Dim Szerokoscsek As String * 4
    Dim Szerokosckier As String * 1 ' N północ lub S południe
    Dim Predkosc As String * 5
    '************************* zmienne procedury odczytu temperatury z DS18B20
    '''Dim TempDS As Word
    Dim TDS As String * 4
    '*************************poniżej są zmienne dla wyliczania sumy kontrolnej, a procedura jest niżej zakomentowana dwoma ''
    ''Dim ciag70 As String * 70
    ''Dim Strtablica(70) As Byte
    ''Dim GPSstr1 As String * 69 At Strtablica(1) Overlay
    ''Dim Dlugoscstr As Byte
    ''Dim Cksm As Byte
    ' zakomentowałem '' całą procedurę i wszystkie wpisy dotyczące wysyłania na RS i do terminala PC danych z procka w tym GPS
    ' aby to uruchomić wystarczy wykacować wszędzie '' no i podłączyć Tx D.1 procka do RX FT232 usb
    '****************************************************************************************************************
    Cls
    locate 1,1
    LCD " GPS Lassen IQ "
    locate 2,1
    LCD ">www.mirekkon.pl"
    wait 1
    menu=0
    Licznik=1
    Do
    if vznak <> "V" Then
    do
    loop until ok=1 ' pułapka dla klawisza żeby nie zmianiał jak chce
    end IF
    '***********************************************pętla startu*****************************************************
    Do
    i = Waitkey(#2)
    Loop Until i = 82 ' R w kodzie ascii czytam kiedy będzie R w ciągu $GPRMC, ....

    '**********************************************pętla czytania ciągu**********************************************
    Do
    i = Waitkey(#2) ' czytanie zaczynam od MC,........ $GPR są pominięte bo R rozpoczyna program!
    GPSstr = GPSstr + Chr(i)
    Loop Until i = 13 ' enter -> #13

    ' Przykładowy ciąg -----> $GPRMC,180821.00,A,4957.7118,N,02246.2254,E,000.0,000.0,140319,02.8,E,A*02
    ' ^czas^ ^valid ^szer ^dług ^speed ^data ^chcecksum

    '********************************************** obsługa klawisza ************************************************
    if ok=0 and vznak <> "V" Then ' zrobić klawisze na przerwaniu tak żeby się nie pierdzieliło - brak czasu :)
    incr menu
    if menu=4 then menu=0
    end IF
    if Up=0 Then
    do
    loop until Up=1
    call Ustawzegar
    end IF

    vznak = Mid(GPSstr , 14 , 1) ' znak validacji V - invalid brak sygnału GPS, A - Sygnał GPS aktywny

    ' ****************** poniżej wyliczanie sumy kontrolnej żeby zweryfikować odebrany ciąg
    '' ciag70= Mid(GPSstr , 1 , 70)
    '' Print #1 ,"$GPR";ciag70 ' tu wypisuję cały odebrany z GPS'a ciąg - kontrolnie do obliczeń chcecksum bez $ !!!
    '' ciag70= Mid(GPSstr , 1 , 67)
    '' GPSstr1 = "GPR" +ciag70
    '' Dlugoscstr = Len(GPSstr1)
    '' Cksm = 0
    '' For i = 1 To Dlugoscstr
    '' Cksm = Cksm Xor Strtablica(i)
    '' Next i
    '' If vznak <> "V" Then Print #1 ,"Wyliczona checksum:"; hex(Cksm)';chr(13) ' tu wyliczam sumę kontrolną mogę ją sprawdzić z tą z ciągu wysłanego przez GPS jeśli jest taka sama to ok, jesli nie błąd odbioru i pomijamy ten odczyt '******************************************************************************

    If vznak = "V" Then ' brak sygnału GPS
    if menu=0 then
    if _day=0 then
    Time$ = "12:00:00" ' domyślnie dla zegara gdy brak GPS
    Date$ = "01/01/00" ' domyślnie dla zegara gdy brak GPS
    end IF
    Call wyswietl
    Locate 1,10
    Lcd chr(Licznik) ' brak sygnału GPS = wkurwiające kółeczko z windowsa :)
    incr Licznik
    if Licznik =7 then Licznik=1
    end IF
    Print #1 , "Brak sygnału GPS ..."
    End If
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If vznak = "A" Then
    Licznik=1
    ' Przykładowy ciąg -----> $GPRMC,180821.00,A,4957.7118,N,02246.2254,E,000.0,000.0,140319,02.8,E,A*02
    ' ^ czytamy od MC, .. ! bo R jest kluczem rozpoczęcia czytania patrz wyżej
    G = Mid(GPSstr , 4 , 2) ' godzina
    i=val(G)
    i=i+1
    if i=24 then i=0 ' zmiana gdy godzina równa się 24
    if i<10 then G=hex(i) else G=str(i) ' zachowanie formy dwuznakowej pomimo że godzina jest jedną cyfrą

    M = Mid(GPSstr , 6 , 2) ' minuta
    S = Mid(GPSstr , 8 , 2) ' sekunda
    i=val(S)
    i=i+1
    if i=60 then
    i=val(M)
    i=i+1 ' zmiana gdy minuta równa się 60
    if i<10 then M=hex(i) else M=str(i) ' zachowanie formy dwuznakowej pomimo że minuta jest jedną cyfrą
    i=0
    end IF
    if i<10 then S=hex(i) else S=str(i) ' zachowanie formy dwuznakowej pomimo że sekunda jest jedną cyfrą

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    if menu=3 then
    Predkosc = Mid(GPSstr , 41, 5) ' przelicznik mile na kilkometry Kmh * 1.852
    s1= val(Predkosc)
    s1=s1*1.852
    Predkosc=str(s1)+" km/h"
    Locate 1,1
    LCD " Predkosc ruchu "
    Locate 2,1
    LCD " ";Predkosc;" "
    end IF
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    DD = Mid(GPSstr , 53 , 2)
    MM = Mid(GPSstr , 55 , 2)
    RR = Mid(GPSstr , 57 , 2)

    Dlugoscstop = Mid(GPSstr , 29 , 2)
    Dlugoscmin = Mid(GPSstr , 31 , 2)
    Dlugoscsek = Mid(GPSstr , 34 , 4)
    Dlugosckier = Mid(GPSstr , 39 , 1)

    Szerokoscstop = Mid(GPSstr , 16 , 2)
    Szerokoscmin = Mid(GPSstr , 18 , 2)
    Szerokoscsek = Mid(GPSstr , 21 , 4)
    Szerokosckier = Mid(GPSstr , 26 , 1)

    'Time$ = "16:00:00" ' format czasu soft zegara
    'Date$ = "05/12/19" ' format daty soft zegara
    Time$ = G + ":" + M + ":" + S ' aktualizacja zegara programowego czasu z GPS
    Date$ = MM + "/" + DD + "/" + RR ' aktualizacja zegara programowego daty z GPS

    if menu=0 then Call wyswietl

    s1=val(Dlugoscsek)
    s1=s1/10000
    s1=s1*60
    Locate 1,1
    if menu=1 then Lcd Dlugosckier;":" ; Dlugoscstop ;chr(7); Dlugoscmin ;"'."; Dlugoscsek;" " 'w s1 są sekundy i ułamki sekund, a w Dlugoscsek są ułamki minuty
    if menu=2 then Lcd Dlugosckier;":" ; Dlugoscstop ;chr(7); Dlugoscmin ;"'"; Fusing(s1 , "#.##"); "'' " 'w s1 są sekundy i ułamki sekund, a w Dlugoscsek są ułamki minuty

    s2=val(Szerokoscsek)
    s2=s2/10000
    s2=s2*60
    Locate 2,1
    if menu=1 then Lcd Szerokosckier;":" ; Szerokoscstop ;chr(7); Szerokoscmin ;"'."; Szerokoscsek;" " 'w s2 są sekundy i ułamki sekund, a w Szerokoscsek są ułamki minuty
    if menu=2 then Lcd Szerokosckier;":" ; Szerokoscstop ;chr(7); Szerokoscmin ;"'"; Fusing(s2 , "#.##"); "'' " 'w s2 są sekundy i ułamki sekund, a w Szerokoscsek są ułamki minuty

    ' poniżej wypisuję do Terminala RS232 lub innego monitora portu żeby mieć podgląd tego co robi procek
    Print #1 , "Godzina " ; G ; ":" ; M ; ":" ; S ; " "; Dzientyg;" Data " ; DD ; "/" ; MM ; "/" ; RR ; " ";Dlugosckier;" " ; Dlugoscstop ;" "; Dlugoscmin ;"' "; Fusing(s1 , "#.###");"'' /";Dlugoscsek ; " ";Szerokosckier;" " ; Szerokoscstop ;" "; Szerokoscmin ;"' "; Fusing(s2 , "#.###");"'' /";Szerokoscsek;chr(13)
    End If
    GPSstr = "" ' czyścimy zmieną GPSstr w celu przygotowania do nowego zapisu
    Loop
    '****************************************************************************************************************

    '****************************************************************************************************************
    Sub wyswietl
    Call Ds18b20
    systsec = Syssec(Time$ , Date$) ' wylicza syssec ilość sekund od 1.1.2000 do daty i czasu!

    i = Dayofweek(systsec) ' wylicza dzień tygodnia dla podanej ilości sekund (czyli daty i czasu zmienionej na sekundy)
    Select Case i
    Case 0 : Dzientyg = "Pon"
    Case 1 : Dzientyg = "Wto"
    Case 2 : Dzientyg = "Sro"
    Case 3 : Dzientyg = "Czw"
    Case 4 : Dzientyg = "Pia"
    Case 5 : Dzientyg = "Sob"
    Case 6 : Dzientyg = "Nie"
    End Select

    Select Case _month
    Case 1 : miesiac = "Sty"
    Case 2 : miesiac = "Lut"
    Case 3 : miesiac = "Mar"
    Case 4 : miesiac = "Kwi"
    Case 5 : miesiac = "Maj"
    Case 6 : miesiac = "Cze"
    Case 7 : miesiac = "Lip"
    Case 8 : miesiac = "Sie"
    Case 9 : miesiac = "Wrz"
    Case 10 : miesiac = "Paz"
    Case 11 : miesiac = "Lis"
    Case 12 : miesiac = "Gru"
    End Select
    Locate 1,1
    Lcd Time$;" " ' Lcd Time$ -> zmienne dla Time$ _sec , _Hour , _Min
    if vznak <> "V" Then
    Locate 1,10
    Lcd chr(0)
    end IF
    Locate 1,11
    Lcd " ";TDS;chr(7)
    Locate 2,1
    if _year<10 then RR=hex(_year) else RR=str(_year)
    Lcd Dzientyg;" ";_day; " "; miesiac;" 20";RR ;" " ' Lcd Date$ -> zmienne dla Date$ _day , _month , _year
    end SUB
    '****************************************************************************************************************

    '******************************************* DS18B20 ************************************************************
    Sub Ds18b20
    dim Adres1(16) As Byte
    dim W(9) As Byte
    local T As Integer
    local Wl As Word

    Config 1wire = Portb.2
    Adres1(1) = 1wsearchfirst()

    Wl = 1wirecount()

    1wreset
    1wwrite &H55
    1wwrite Adres1(1) , 8
    1wwrite &HBE
    W(1) = 1wread(9)
    1wreset
    1wwrite &HCC
    1wwrite &H44

    1wverify Adres1(1)
    If Err = 1 Then
    TDS=" Err"
    Elseif Err = 0 Then
    T = Makeint(w(1) , W(2))
    T = T * 10
    T = T / 16
    ''' TempDS= T*10
    ''' 'KOREKTA TEMPERATURY
    ''' 'TempDS=TempDS+/-KORETKA 1 oznacza 0.1stC
    ''' TempDS=TempDS/10

    TDS = Str(T) 'lub to: Str(TempDS)
    TDS = Format(TDS , "00.0")

    End If
    End Sub
    '****************************************************************************************************************

    '***************************************** RĘCZNE USTAWIANIE ZEGARA *********************************************
    Sub Ustawzegar
    ' jeśli komuś to potrzebne żeby przy braku sygnału GPS ustawić wartość proszę bardzo napisać sobie procedurę
    ' zegar oparty o soft clock atmegi generuje błąd rzędu kilku sekund na dobę, a więc czy jest sens?
    ' przy każdym pojawieniu się sygnału GPS zegar automatycznie się ustawia i gdy sygnał jest koryguje czas na bieżąco
    ' do
    'Time$ = "16:00:00" ' format czasu soft zegara
    'Date$ = "05/12/19" ' format daty soft zegara
    ' If Up = 0 Then
    '
    ' end IF
    ' If Dwn = 0 Then
    '
    ' end IF
    ' until .....warunek zakończenia ustawiania
    End Sub
    '****************************************************************************************************************
    End

    schemat odręczny dla w/w softu w BASCOM:
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ
  • Tektronix
  • Poziom 30  
    Dlaczego użyłeś Meha16 zamiast tańszego i dużo lepszego Mega164?
  • Tektronix
  • Poziom 8  
    Mam płytkę uruchomieniową na DIP 40, nie zdążyłem napisać bo w trakcie edytowania się wciąłeś :)

    zaraz dodam zdjęcia i będzie wszystko jasne.

    Zastosowanie procesora to sprawa dowolna byle miał port UART i trochę pamięci, wydaje mi się że swój program po optymalizacji spokojne upchnę w atmega 8.
  • Poziom 30  
    mirekkon napisał:
    Zastosowanie procesora to sprawa dowolna byle miał port UART i trochę pamięci,

    Trochę RAM?To ile? 2kB? 1MB?
    FLASH? to ile?

    mirekkon napisał:
    Mam płytkę uruchomieniową na DIP 40, nie zdążyłem napisać bo w trakcie edytowania się wciąłeś :)

    No tak, "beszczelnie" ale jak masz DIP to uC sobie wymień na cos nowszego chyba, że wolisz dinozaury, które za rok czy dwa osiągna niebotyczne w stosunku to teraz nowych konstrukcji ceny. Skrajne przypadki sa w PIC, po 100zł na CPU o możliwościach Z8 (nie mylić z Z-80) z zeszłego tyśąclecia.
  • Poziom 8  
    Nie mam zamiaru niczego wymieniać bo po co, to jest zestaw uruchomieniowy - wrzuciłem co było pod ręką.
    Tak jak pisałem procek to sprawa dowolna i tyle w temacie, flasha tyle żeby wlazł program obecnie 8752b ale jak pisałem jak bym to zoptymalizował i powyrzucał niepotrzebne rzeczy to wejdzie to mega8 (mniej niż 8kb )czyli tyle ramu i flasha co w mega8 :) Tematem projektu nie jest na jakim procku sprawdziłem działanie - tylko moduł GPS.
  • Poziom 30  
    mirekkon napisał:
    Nie mam zamiaru niczego wymieniać bo po co, to jest zestaw uruchomieniowy - wrzuciłem co było pod ręką.

    Czyli masz zestaw i chcesz go dostosować do projektu?
  • Poziom 8  
    LChucki napisał:
    mirekkon napisał:
    Nie mam zamiaru niczego wymieniać bo po co, to jest zestaw uruchomieniowy - wrzuciłem co było pod ręką.

    Czyli masz zestaw i chcesz go dostosować do projektu?


    Nie. W przeciwieństwie do Ciebie mam co robić.

    Dodano po 4 [minuty]:

    kaczakat napisał:
    Tego GPS kupuje się z PCB czy sam sobie robiłeś, bo jest tam link Twojej strony? No i ile oraz gdzie jest to najtaniej...


    GPS dostępny z adapterem. Projekt adaptera mam w PROTEL99SE. Jak trzeba podrzucę.
  • Poziom 30  
    mirekkon napisał:
    Nie mam zamiaru niczego wymieniać bo po co, to jest zestaw uruchomieniowy - wrzuciłem co było pod ręką.

    To świadczy wyraźnie, że dostosowujesz sprzęt do zadania. Możesz sie z tym nie zgadzać ale to jest fakt!
    Często tak robię bo mam wymaganie zamawiającego "ma być gotowy moduł" ale wtedy dobieram moduł, który spełnia wymagania. Może byc tak "zrób cos na tym module" wtedy robię cos prostego - miganie ledem.

    mirekkon napisał:
    LChucki napisał:
    mirekkon napisał:
    Nie mam zamiaru niczego wymieniać bo po co, to jest zestaw uruchomieniowy - wrzuciłem co było pod ręką.

    Czyli masz zestaw i chcesz go dostosować do projektu?

    Nie. W przeciwieństwie do Ciebie mam co robić.

    Twierdzisz, ze nie mam co robić? Weźmiesz kilkanaście moich projektów?
    Taki prosty, oscyloskop 54Ms/s na F407. Bierzesz?
  • Poziom 8  
    Przykładowe Kody ARDUINO:

    #include <string.h>
    #include <ctype.h>

    int ledPin = 13; // LED test pin
    int rxPin = 0; // RX PIN
    int txPin = 1; // TX TX
    int byteGPS=-1;
    char linea[300] = "";
    char comandoGPR[7] = "$GPRMC";
    int cont=0;
    int bien=0;
    int conta=0;
    int indices[13];

    void setup() {
    pinMode(ledPin, OUTPUT); // Initialize LED pin
    pinMode(rxPin, INPUT);
    pinMode(txPin, OUTPUT);
    Serial.begin(4800);
    for (int i=0;i<300;i++){ // Initialize a buffer for received data
    linea[i]=' ';
    }
    }

    void loop() {
    digitalWrite(ledPin, HIGH);
    byteGPS=Serial.read(); // Read a byte of the serial port
    if (byteGPS == -1) { // See if the port is empty yet
    delay(100);
    } else {
    // note: there is a potential buffer overflow here!
    linea[conta]=byteGPS; // If there is serial port data, it is put in the buffer
    conta++;
    Serial.print(byteGPS, BYTE);
    if (byteGPS==13){ // If the received byte is = to 13, end of transmission
    // note: the actual end of transmission is <CR><LF> (i.e. 0x13 0x10)
    digitalWrite(ledPin, LOW);
    cont=0;
    bien=0;
    // The following for loop starts at 1, because this code is clowny and the first byte is the <LF> (0x10) from the previous transmission.
    for (int i=1;i<7;i++){ // Verifies if the received command starts with $GPR
    if (linea[i]==comandoGPR[i-1]){
    bien++;
    }
    }
    if(bien==6){ // If yes, continue and process the data
    for (int i=0;i<300;i++){
    if (linea[i]==','){ // check for the position of the "," separator
    // note: again, there is a potential buffer overflow here!
    indices[cont]=i;
    cont++;
    }
    if (linea[i]=='*'){ // ... and the "*"
    indices[12]=i;
    cont++;
    }
    }
    Serial.println(""); // ... and write to the serial port
    Serial.println("");
    Serial.println("---------------");
    for (int i=0;i<12;i++){
    switch(i){
    case 0 :Serial.print("Time in UTC (HhMmSs): ");break;
    case 1 :Serial.print("Status (A=OK,V=KO): ");break;
    case 2 :Serial.print("Latitude: ");break;
    case 3 :Serial.print("Direction (N/S): ");break;
    case 4 :Serial.print("Longitude: ");break;
    case 5 :Serial.print("Direction (E/W): ");break;
    case 6 :Serial.print("Velocity in knots: ");break;
    case 7 :Serial.print("Heading in degrees: ");break;
    case 8 :Serial.print("Date UTC (DdMmAa): ");break;
    case 9 :Serial.print("Magnetic degrees: ");break;
    case 10 :Serial.print("(E/W): ");break;
    case 11 :Serial.print("Mode: ");break;
    case 12 :Serial.print("Checksum: ");break;
    }
    for (int j=indices[i];j<(indices[i+1]-1);j++){
    Serial.print(linea[j+1]);
    }
    Serial.println("");
    }
    Serial.println("---------------");
    }
    conta=0; // Reset the buffer
    for (int i=0;i<300;i++){ //
    linea[i]=' ';
    }
    }
    }
    }
    schemat do w/w kodu:
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ ____________________________________________________________________________________________________________________________________________________________
    #include <LiquidCrystal.h>
    #include <string.h>
    #include <ctype.h>

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    int rxPin = 0; // RX pin
    int txPin = 1; // TX pin
    int byteGPS=-1;
    char cmd[7] = "$GPRMC";
    int counter1 = 0; // counts how many bytes were received (max 300)
    int counter2 = 0; // counts how many commas were seen
    int offsets[13];
    char buf[300] = "";

    /**
    * Setup display and gps
    */
    void setup() {
    pinMode(rxPin, INPUT);
    pinMode(txPin, OUTPUT);
    Serial.begin(4800);
    lcd.begin(16, 2);
    lcd.print("waiting for gps");
    offsets[0] = 0;
    reset();
    }

    void reset() {
    counter1 = 0;
    counter2 = 0;
    }

    int get_size(int offset) {
    return offsets[offset+1] - offsets[offset] - 1;
    }

    int handle_byte(int byteGPS) {
    buf[counter1] = byteGPS;
    Serial.print((char)byteGPS);
    counter1++;
    if (counter1 == 300) {
    return 0;
    }
    if (byteGPS == ',') {
    counter2++;
    offsets[counter2] = counter1;
    if (counter2 == 13) {
    return 0;
    }
    }
    if (byteGPS == '*') {
    offsets[12] = counter1;
    }

    // Check if we got a <LF>, which indicates the end of line
    if (byteGPS == 10) {
    // Check that we got 12 pieces, and that the first piece is 6 characters
    if (counter2 != 12 || (get_size(0) != 6)) {
    return 0;
    }

    // Check that we received $GPRMC
    for (int j=0; j<6; j++) {
    if (buf[j] != cmd[j]) {
    return 0;
    }
    }

    // Check that time is well formed
    if (get_size(1) != 10) {
    return 0;
    }

    // Check that date is well formed
    if (get_size(9) != 6) {
    return 0;
    }

    // TODO: compute and validate checksum

    // TODO: handle timezone offset

    // print time
    lcd.clear();
    for (int j=0; j<6; j++) {
    lcd.print(buf[offsets[1]+j]);
    if (j==1) {
    lcd.print("h");
    } else if (j==3) {
    lcd.print("m");
    } else if (j==5) {
    lcd.print("s UTC");
    }
    }

    // print date
    lcd.setCursor(0, 1);
    for (int j=0; j<6; j++) {
    lcd.print(buf[offsets[9]+j]);
    if (j==1 || j==3) {
    lcd.print(".");
    }
    }
    return 0;
    }
    return 1;
    }

    /**
    * Main loop
    */
    void loop() {
    byteGPS=Serial.read(); // Read a byte of the serial port
    if (byteGPS == -1) { // See if the port is empty yet
    delay(100);
    } else {
    if (!handle_byte(byteGPS)) {
    reset();
    }
    }
    }
    schemat do w/w kodu:
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ

    Dodano po 2 [godziny] 33 [minuty]:

    dodatkowo zamieszczam wszelkie materiały dotyczące Lassen IQ włącznie z oprogramowaniem flashującym, Chat itp. miłej zabawy :)
    Załączniki:
  • Poziom 8  
    tak wygląda pakiet modułów z antenkami aktywnymi (płytki jeszcze nie oddzielone):
    ZEGAR GPS z termometrem z wykorzystaniem ATmega +BASCOM + GPS Lassen iQ