Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega16][Bascom] moduł gps -> uart -> atmega16

kekerott 19 Nov 2008 22:23 9475 30
IGE-XAO
  • #1
    kekerott
    Level 11  
    Witam,

    posiadam moduł gps który chcę skomunikować z uC Atmega16. Sam moduł działa świetnie, komunikacja poprzez max232 z komputerem jest bezproblemowa. Problemy zaczynają się przy komunikacji przez UART z atmegą. Nic nie pojawia się na wejściu RxD/PD0, transmisja ustawiona wdg specyfikacji:
    [Atmega16][Bascom] moduł gps -> uart -> atmega16 [Atmega16][Bascom] moduł gps -> uart -> atmega16
    Nie wiem w czym tkwi problem? Czy trzeba coś dodatkowego wstawić pomiędzy moduł a uC (konwerter/inwerter)? Procesor działa na zew. kwarcu 16mhz (fuse'y ustawione). Atmega z komputerem świetnie komunikuje się poprzez UART/max232 ale z modułem działać nie chce, w czym może tkwić problem ?

    Taki prosty kod działa z PC'tem (przez max232) a z modułem nie chce, nie wyświetla nic, nawet krzaków:
    Code:

    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 9600

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

    Dim A As Byte

    Cls
    Do
    If Ischarwaiting() = 1 Then
     A = Inkey()
     Lcd Chr(a)
    End If
    Loop

    End
  • IGE-XAO
  • #2
    djsway
    Level 18  
    A w jakim standardzie dane wysyła gps? Odbieranie danych ja robiłem na przerwaniach od uartu. Jeżeli gps wysyła dane w NAMEA to jak przyjdzie przerwanie to sprawdzamy czy odebrał znak '$' jeżeli tak to mamy początek ramki, potem sprawdzamy co to za ramka. Jeżeli nas interesuje ta ramka, to ładujemy ją do jakiegoś bufora i potem dopiero obrabiamy.
  • #3
    kekerott
    Level 11  
    GPS wysyła dane w formacie NMEA, problem w tym że kompletnie nic nie pojawia się na wejściu (czy to inkey czy waitkey). Najdziwniejsze że moduł gps podłączony przez maxa232 do komputera działa bezproblemowo a podłączony pod końcówkę RxD procesora nie. Procesor bez problemu na prędkości 9600 komunikuje się przez rs'a z pecetem.

    wstępny kod do wyciągnięcia współrzędnych z ramki GPRMC napisałem następujący:
    Code:
    $regfile = "m16def.dat"
    
    $crystal = 16000000
    $baud = 9600

    Config Serialin = Buffered , Size = 32
    Enable Interrupts

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


    Dim A As Byte
    Dim I As Byte
    Dim Txt As String * 32

    Cls
    Do

    If Ischarwaiting() = 1 Then
    A = Inkey()
    If A = 36 Then

    ' -- sprawdzenie jakie dane idą ---
    Txt = ""
    For I = 1 To 5
     Gosub Czekajznak
     A = Inkey()
     Txt = Txt + Chr(a)
    Next I

    ' -- wczytanie godziny
    If Txt = "GPRMC" Then
     Cls
     Txt = ""
     Gosub Opuscznak
    For I = 1 To 6
     Gosub Czekajznak
     A = Inkey()
     Txt = Txt + Chr(a)
    Next I

    '-- Latitude
    Txt = ""
    Gosub Doprzecinka
    Gosub Doprzecinka
    Do
     Gosub Czekajznak
     A = Inkey()
     If A <> 44 Then
      Txt = Txt + Chr(a)
     End If
    Loop Until A = 44
    Lcd Mid(txt , 1 , 2) ; " " ; Mid(txt , 3)
     Gosub Czekajznak
     A = Inkey()
    Lcd Chr(a)                                                  ' N/S

    Lowerline

    '-- Longitude
    Txt = ""
    Gosub Doprzecinka
    Do
     Gosub Czekajznak
     A = Inkey()
     If A <> 44 Then
      Txt = Txt + Chr(a)
     End If
    Loop Until A = 44

    If Mid(txt , 1 , 1) = "0" Then
     Lcd Mid(txt , 2 , 2) ; " " ; Mid(txt , 4)
    Else
     Lcd Mid(txt , 1 , 2) ; " " ; Mid(txt , 3)
    End If

     Gosub Czekajznak
     A = Inkey()
    Lcd Chr(a)                                                  ' E/W

    End If


    End If
    End If
    Loop


    End

    Czekajznak:
     Do
     Loop Until Ischarwaiting() = 1
    Return

    Opuscznak:
     Gosub Czekajznak:
     A = Inkey()
    Return

    Doprzecinka:
     Do
     Gosub Czekajznak:
     A = Inkey()
     Loop Until A = 44
    Return


    Działa to świetnie przy emulacji wysyłanych danych przez komputer (prog w delphi/c wysyła na COM1 czyste dane NMEA).

    Moje pytanie czy trzeba wstawić coś pomiędzy pin TxD modułu a RxD procesora, czy można połączyć wprost?
  • #4
    zumek
    Level 39  
    kekerott wrote:
    ... Najdziwniejsze że moduł gps podłączony przez maxa232 do komputera działa bezproblemowo a podłączony pod końcówkę RxD procesora nie. Procesor bez problemu na prędkości 9600 komunikuje się przez rs'a z pecetem...

    Wszystko fajnie, tylko brakuje schematu. Pokaż lub opisz DOKŁADNIE, jak masz połączony odbiornik GPS z uC i jak to jest zasilane, bo często i gęsto, diabeł tkwi w szczegółach :-P
  • IGE-XAO
  • #5
    kekerott
    Level 11  
    jak się okazuje powodem problemu był niski poziom stanu wysokiego jaki wychodzi z modułu gps: stan wysoki jest między 2.1 a 2.8 V:
    [Atmega16][Bascom] moduł gps -> uart -> atmega16

    Przepuściłem sygnał z modułu przez maxa232 a po drugiej stronie (wyjściowej) zwarłem rx z tx, dzięki czemu tx z modułu idzie przez max232, z powrotem do max232 i do RxD procesora. wydaje się działać :)

    jest może jakiś prostszy sposób konwersji poziomów ttl:
    0 - 0.8 => 0V
    2.1 - 2.8 V => 5V
    wzmacniacz, jakaś dioda zennera?

    Póki co działa działa po przejściu dwukrotnie przez maxa232, ale interesuje mnie bardziej eleganckie rozwiązanie.

    edit:
    @zumek: pisałem tego posta chyba równolegle z Tobą. Połączenie przez maxa jest standardowe do bólu - tu chyba nic nie można sknocić :) Jeżeli jednak potrzeba schematu aby rozwiązać powyższy problem (dylemat bardziej, czy zostawiać tak jak jest przez zwartego maxa, czy szukac innego rozwiązania) to upnę go wykładach.
  • #6
    remzibi
    Level 24  
    kekerott wrote:
    jak się okazuje powodem problemu był niski poziom stanu wysokiego jaki wychodzi z modułu gps: stan wysoki jest między 2.1 a 2.8 V:


    Cos chyba jednak zle robisz , jestem o tym przekonany . Te poziomy sa bardzo dobre do podlaczenia z mega .
    Tu
    https://www.elektroda.pl/rtvforum/topic1135809.html
    jest projekt w ktorym z powodzeniem wykorzystalem ten modul (zreszta tez inne tego producenta) i dziala z atmega16 wysmienicie bez zadnych ale to zadnych niespodzianek czy dodatkowych kombinacji - wszystko ruszylo z kopa . Poprostu podpinasz i smiga - jesli tak nie jest to masz cos skopane - ale bez dokladniejszych informacji to raczej nie wiadomo co .
  • #7
    kekerott
    Level 11  
    remzibi wrote:
    [...]Te poziomy sa bardzo dobre do podlaczenia z mega [...]


    muszę przyznać całkowitą rację. Początkowo moduł dołączyłem do płytki ewaluacyjnej z atmegą16, zapewne znajduje się coś na tej płytce co osłabia sygnał wchodzący na PD0 - gdyż stan wysoki (2.8) podwyższony przez maxa działał, zwykły nie.

    Połączyłem wprost moduł z atmegą na dedykowanej płytce i wszystko tak jak pisze @remzibi 'ruszyło z kopa'.
  • #8
    remzibi
    Level 24  
    kekerott wrote:
    remzibi wrote:
    [...]Te poziomy sa bardzo dobre do podlaczenia z mega [...]


    muszę przyznać całkowitą rację. Początkowo moduł dołączyłem do płytki ewaluacyjnej z atmegą16, zapewne znajduje się coś na tej płytce co osłabia sygnał wchodzący na PD0 - gdyż stan wysoki (2.8) podwyższony przez maxa działał, zwykły nie.

    Połączyłem wprost moduł z atmegą na dedykowanej płytce i wszystko tak jak pisze @remzibi 'ruszyło z kopa'.


    No to teraz masz ogromne pole do popisu - moduly swietnie pracuja na wiekszych czestotliwosciach - update 5Hz , ten akurat swietnie sie konfiguruje na np. predkosc transmisji 34800 (osobiscie testowalem) i wyzej , jesli dodamy do tego prosta konfiguracje naszego modulu GPS wlaczjac go do wspolracy z systemami poprawek pozycjonowania dla systemow WAAS i SBAS dla Europy nadawane przez satelity gostacjonarne EGNOS . WAAS jako taki ma byc dokladniejszy od certyfikowanego RTCM . Skutki tych poprawek beda lepiej widoczne w strefach nadmorskich i lotniskowych (do 100mil) ale zapewne beda dzialac znakomicie na calym obszarze europejskim jako juz dosc mocno robudowany system .
    A wszystko dzieki komendom chipsetu MTK - to te $PMTKxxxxxxx :) .
    To ostatecznie mamy naprawde super malutki , leciutki i dokladny modul GPS idealny do wszelkich zastosowan .
    Proponuje tez jakos "sciesnic" ten NMEA parsing bo cosik wyszedl jakby troszku ogromniasty :) , djsway dobrze podpowiada .
    Zycze powodzenia w projekcie :) .
  • #9
    ariello87
    Level 11  
    Witam, odkopię temat, ponieważ mam dość podobny problem, i podobny sprzęt.

    Schemat:
    http://img10.imageshack.us/img10/152/schematri.jpg

    Połączenie z LCD jest ok, tekst się bezproblemowo wyświetla.

    Po uruchomieniu programu na LCD wyskakuje napis "Start", a po chwili "Znalazłem początek ramki". I wtedy pojawia się ciąg pięciu bajtów w kodzie hex - jednak nigdy pierwszym bajtem nie jest 47 odpowiadające literze G w Ascii. Zazwyczaj początkowy bajt ma wartość 98 lub D8, choć zdarzają się różne.

    Próbowałem podłączyć ATmege bez udziału programatora, efekt ten sam.

    Po zmianie wyszukiwanego znaku z "$" na "G" znajduje ten znak, jednak trzeba na to czekać kilka sekund.

    GPS-http://www.maritex.com.pl/pl/shop/productInfo/ggid/10/pid/17682/page/1/backurl/shop/special%3Fid%3D10%26page%3D1
    9600b/8bit/bez parzystości/1bit stopu.

    Co dziwne, w DS jest napisane typowe napięcie zasilania - 3.3V. Jednak gdy nastawiam je potencjometrem, układ poprawnie działa dopiero przy 4,7V...


    Code:


    'Odebranie jakiejkolwiek informacji z modułu GPS


    $regfile = "m16def.dat"

    $crystal = 8000000

    $baud = 9600


    Config Lcd = 20 * 4                                         ' Wyswietlacz 20x4

    Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5

    Cls

    Dim Dana As Byte

    Dim Licznik As Byte

    Dim Tekst As String * 32

    Dim Warunek As Bit

    Warunek = 0

    Lcd "Start"

    Do
       If Ischarwaiting() = 1 Then
          Dana = Inkey()

          If Dana = 36 Then                                     'Obrebrano znak $

             Tekst = ""
             For Licznik = 1 To 5

                Do
                Loop Until Ischarwaiting() = 1                  ' czeka na następny znak
                Dana = Inkey()
                Tekst = Tekst + Hex(dana)


             Next Licznik

             Lowerline
             Lcd "Znalazlem poczatek ramki"

             Lcd Tekst
             If Tekst = "GPGGA" Then

                Thirdline
                Lcd "Znalazl te Ramke!"

                Warunek = 1
             End If

          End If

          End If


    Loop Until Warunek = 1

    Do

    Loop

    End                                                         'end program




    Czy niemożność znalezienia ramki może być powiązana ze złym połączeniem (Gdy odłącze programator od USB układ pracuje, więc nie sądzę by były różne potencjały)?

    Dodam ze gps nie łapie fix'a, jednak z tego co wiem mimo to powinien wysyłać ramki.

    Jeśli ktoś ma jakąś rade to byłbym za nią wdzięczny.
  • #10
    Fredy
    Level 27  
    Spróbuj tak:

    Code:
    'Odebranie jakiejkolwiek informacji z modułu GPS
    


    $regfile = "m16def.dat"

    $crystal = 8000000

    $baud = 9600


    Config Lcd = 20 * 4                                         ' Wyswietlacz 20x4

    Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5

    Cls

    Dim Dana As string * 1

    Dim Licznik As Byte

    Dim Tekst As String * 32

    Dim Warunek As Bit

    Warunek = 0

    Lcd "Start"

    Do
       If Ischarwaiting() = 1 Then
          Dana = Inkey()

          If Dana = "$"  Then                                     'Obrebrano znak $

             Tekst = ""
             For Licznik = 1 To 5

                Do
                Loop Until Ischarwaiting() = 1                  ' czeka na następny znak
                Dana = Inkey()
                Tekst = Tekst + dana


             Next Licznik

             Lowerline
             Lcd "Znalazlem poczatek ramki"

             Lcd Tekst
             If Tekst = "GPGGA" Then

                Thirdline
                Lcd "Znalazl te Ramke!"

                Warunek = 1
             End If

          End If

          End If


    Loop Until Warunek = 1

    Do

    Loop

    End                                                         'end program
    Code:
  • #11
    ariello87
    Level 11  
    rozumiem że zmiany dokonałeś tutaj
    Code:
               Loop Until Ischarwaiting() = 1                  ' czeka na następny znak 
    
                Dana = Inkey()
                Tekst = Tekst + dana


    Znajduje więc ramke jak poprzednio, a potem wywala krzaki z ASCII, rzadko jakąś litere z alfabetu.
  • #12
    Fredy
    Level 27  
    Najlepiej zrób buforowanie UARTA - wtedy złapiesz wszystko i nie będziesz musiał się tak "śpieszyć".
  • #13
    ariello87
    Level 11  
    czyli wypisać XX bajtów do tej zmiennej tekst i na końcu wyświetlić je wszystkie?

    Choć skoro po "$" nie ma "G" to nie wiem w czym to miałoby pomóc.. Ale sprawdzę.
  • #14
    Fredy
    Level 27  
    A spróbuj tak:

    Code:
    Dim X As Byte
    
    Dim Znak As String * 1
    Dim Ramka As String * 20


    Do
       Ramka = ""
       Gosub Czytaj_znak
          If Znak = "G" Then
                For X = 1 To 20
                   Ramka = Ramka + Znak
                   Gosub Czytaj_znak
                Next X
          End If
    Print Ramka

    Loop

    Czytaj_znak:


                                            Znak = ""
                                            Do
                                              Znak = Inkey()
                                            Loop Until Asc(znak) <> 0
    Return
  • #15
    ariello87
    Level 11  
    dodałem do tego kodu obsługę LCd, zmieniłem print na LCD.
    Bardzo długo - z 2 min - nic się nie działo, następnie wyskoczyło coś takiego:

    http://img145.imageshack.us/f/image071f.jpg/

    Wrzucam foto, może zrobiłem jakąś inną głuptę i komuś nasunie się rozwiązanie.
  • #16
    Fredy
    Level 27  
    a ty dałeś negator pomiedzy wyjście gpsa a wejściem kontrolera? Bo jak nie to napewno dostaniesz taka chińczszczyznę. Powienien być tam tranzystr albo jakiś max232.

    Proszę poprawić pisownię.
    Robak
  • #17
    ariello87
    Level 11  
    nie, nie dałem. Czyli musi być coś co podbije sygnał?
    Myślałem że max wymagany byłby tylko w kontakcie z pc.
  • #18
    Fredy
    Level 27  
    tu nie chodzi tylko o poziom sugnału (chociaz też zwróc na to uwagę). Tylko chodzi o to że gps daje sygnał zanegowany, potrzebny jest jakis negator i dopiero wtedy jest sygnał ok.
    Możesz spróbować w bascomie zastosować programowy UART , i ustawić go w opcji inwerted to wtedy moze uciekniesz od koniecznośći negacji.
    Z tym że sprzętowy UART napewno jest lepszy więc chyba lepiej dać jeden tranzystor i po sprawie.

    Proszę poprawić pisownię.
    Robak
  • #19
    Jaca
    Level 29  
    1. Odłącz całkowicie 3D-FIX modułu i zostaw pin wolny (nie używaj go);
    2. Podłącz VBACKUP do napięcia 2V-4.3V np 5V przez dwie diody prostownicze lub akumulator Li-Ion 3.7V bezpośrednio do tego pinu.

    Po tych czynnościach zacznie działać prawidłowo.
  • #20
    ariello87
    Level 11  
    ale negator nadal potrzebny?

    3,7V mogę uzyskać też z tego zasilacza 5V przez potencjometr?
  • #21
    Jaca
    Level 29  
    Nie słuchaj innych, żaden negator nie jest potrzebny.
  • #22
    Fredy
    Level 27  
    Jaca wrote:
    Nie słuchaj innych, żaden negator nie jest potrzebny.


    Jesteś tego pewien? U góry jest napisane że GPS komunikuje się prawidłowo z komputerem PC przez Maxa , czyli tam stosuje negację.
    A niby dlaczego nie jest wymagana ta negacja przy współpracy z prockiem?
    Używałem już kilka gpsów z wyjściem RSowym i zawsze musiałem dać tranzystor na wejściu procka aby odwrócić transmisję.
  • #23
    ariello87
    Level 11  
    pewnie dlatego że sam standard RS232 ma odwróconą logike.

    jutro sprawdzę proponowane przez kolegę Jaca podłączenie.

    Edit.

    Niestety pod odpięciu 3D-Fix i podaniu przez potencjometr 2,7V i 4,0V na backup moduł nadal wywala bzdury, jednak teraz pierwszym bajtem po $ jest już więcej kombinacji, 98, B8, 41, 49, 20, D8 itp.


    Cd negatora
    jeśli dobrzę rozumuję: G reprezentuje w ascii 47h(01000111), więc nawet jeśli to zanegujemy, powinienem otrzymać bajt C8(10111000), a taki bajt nigdy nie pojawił się po $...
  • #24
    Jaca
    Level 29  
    Umieść odbiór danych w obsłudze przerwania od URXC.
  • #25
    ariello87
    Level 11  
    Zrobiłem to tak:

    Code:
    'Odebranie jakiejkolwiek informacji z modułu GPS
    


    $regfile = "m16def.dat"

    $crystal = 8000000

    $baud = 9600

    Enable Interrupts

    Enable Urxc

    On Urxc Przerwanie_rx

    Config Lcd = 20 * 4                                         ' Wyswietlacz 20x4

    Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5

    Cls

    Dim Dana As Byte

    Dim Tekst As String * 32

    Dim Warunek As Bit

    Warunek = 0

    Lcd "Start"

    Lowerline
    Do

       If Warunek = 1 Then
          Lcd Tekst
       End If


    Loop

    End                                                         'end program


    Przerwanie_rx:

        Dana = Inkey()

        Tekst = Tekst + Hex(dana)

        If Dana = 36 Then

          Tekst = "xxxx"
          Warunek = 1

        End If


    Return


    http://img27.imageshack.us/gal.php?g=image072tp.jpg



    Czyli po znalezieniu "$" wprowadza "xxxx"i wypisuje zawartość pomiędzy kolejnymi "$". Czasem są to trzy bajty, czasem dużo więcej, ale nadal kolejnymi po "$" są np 80689BFF, (często to się potwarza jako zawartość pomiędzy "$", a także jako "nagłówek" zawartości)


    Tak jakby ten moduł generował inne ramki, bo jakaś powtarzalność jest, ale w dokumentacji wyraźnie napisano o NMEA...

    Zauważyłem też że atmega zaczęła się resetować, dobrze myślę że to sprawka watchdoga?
  • #26
    Jaca
    Level 29  
    Code:
    $hwstack = 64
    
    $swstack = 64
    $framesize = 128

    Dim Dane As String * 1
    Dim Parametr As Byte
    Dim Bufor As String * 16
    Dim Naglowek As String * 16
    Dim Latitude As String * 16
    Dim Longitude As String * 16
    Dim Flaga As Byte

    [...]

    Urxc_irq:
       Dane = Chr(udr)
       Select Case Dane
          Case "{010}" :
          Case "{013}" :
          Case "$" :
             Parametr = 0
             Bufor = ""
          Case "," :
             If Parametr = 0 Then
                Naglowek = Bufor
             Else
                Select Case Naglowek
                   Case "GPRMC" :
                      Select Case Parametr
                         Case 3 :
                            Flaga = 0
                            Latitude = Bufor
                         Case 5 :
                            Longitude = Bufor
                            Flaga = 1
                      End Select
                End Select
             End If
             Incr Parametr
             Bufor = ""
          Case Else :
             Bufor = Bufor + Dane
       End Select
    Return
  • #27
    ariello87
    Level 11  
    Umieściłem to w ten sposób
    Code:
    'Odebranie jakiejkolwiek informacji z modułu GPS
    


    $regfile = "m16def.dat"

    $crystal = 8000000

    $baud = 9600


    $hwstack = 64
    $swstack = 64
    $framesize = 128

    Enable Interrupts

    Enable Urxc

    On Urxc Przerwanie_rx

    Config Lcd = 20 * 4                                         ' Wyswietlacz 20x4

    Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5

    Cls

    Dim Dana As String * 32

    Dim Tekst As String * 32

    Dim Naglowek As String * 32

    Dim Bufor As String * 32

    Dim Latitude As String * 32

    Dim Longitude As String * 32

    Dim Parametr As Byte

    Dim Warunek As Bit

    Dim Flaga As Bit

    Warunek = 0

    Lcd "Start"

    Lowerline
    Do

          Lowerline
          Lcd "Latitude "
          Lcd Latitude
          Thirdline
          Lcd "Longitude "
          Lcd Longitude


    Loop

    End                                                         'end program


    Przerwanie_rx:
       Dana = Chr(udr)
       Select Case Dana
          Case "{010}" :
          Case "{013}" :
          Case "$" :
             Parametr = 0
             Bufor = ""
          Case "," :
             If Parametr = 0 Then
                Naglowek = Bufor
             Else
                Select Case Naglowek
                   Case "GPRMC" :
                      Select Case Parametr
                         Case 3 :
                            Flaga = 0
                            Latitude = Bufor
                         Case 5 :
                            Longitude = Bufor
                            Flaga = 1
                      End Select
                End Select
             End If
             Incr Parametr
             Bufor = ""
          Case Else :
             Bufor = Bufor + Dana
       End Select
    Return


    I po słowach Longitude i Latitude wywala krzaki

    http://img534.imageshack.us/img534/6159/image076xn.jpg

    może mieć to jakiś związek z posiadaniem przez moduł chipsetu MTK? Choć ramka też nie zaczyna się u mnie od $PMTK...

    napięcie na pinie RX atmegi waha się między 2 a 3V gdy sprawdzam woltomierzem.
  • #28
    Jaca
    Level 29  
    1. W swoim kodzie wyżej dodałem deklaracje zmiennych - przepisz je;
    2. Wyświetlaj odebrane dane gdy Flaga = 1;
    3. Sprawdź taktowanie uC !!! Zrób miganie diodą i sprawdź, czy czasy włączenia i wyłączenia będą prawidłowe;
    4. Napięcie na RX jest wartością średnią (zmiany poziomów podczas nadawania danych).
  • #29
    ariello87
    Level 11  
    ad 1. przepisałem
    ad 2

    Code:
    Lcd "Start"
    

    Lowerline
    Do
       If Flaga = 1 Then
          Lowerline
          Lcd "Latitude "
          Lcd Latitude
          Thirdline
          Lcd "Longitude "
          Lcd Longitude
       End If

    Loop

    End 


    Wyświetla się wyłącznie napis Start, napisy Longitute i latitude nie pokazują się na lcd. Nie definiowalem wartości Flagi, jednak po chwili powinna się sama ustawić na 0 lub 1, wychodzi więc na to że program nigdy nie wchodzi w pętle w których jest zmiana flagi

    ad 3. nie bardzo wiem o co chodzi, mam kwarc 8mhz, poprzednie programy z przerwaniem od int0 chodziły.

    ad 4. wiem, w sumie to musi więc oscylować wokół tych wartości.
  • #30
    Jaca
    Level 29  
    Co do taktowania to jest ono ściśle powiązane z prędkością transmisji ! W przypadku niezgodności deklaracji $crystal z rzeczywistą częstotliwością taktowania uC, podczas odbierania danych po RS'ie otrzymasz krzaki.
    Dlatego zrób program migania diodą co 1s i sprawdź, czy rzeczywiście będzie tak migać.
    Znak "$" to pewnie inny, losowy znak wyłapywany z masy krzaków i nie jest on początkiem ramki. :)