logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Bascom] [Bascom][atmega8] Jak dodać komunikat o odłączeniu modułu GPS?

KamilDu 22 Mar 2010 23:22 1446 5
REKLAMA
  • #1 7868238
    KamilDu
    Poziom 10  
    Posty: 10
    Witam
    Mam program do odczytu danych z modułu GPS. Mój problem polega na tym iże nie wiem jak zrobić zabezpieczenie przed pewną sytuacją a mianowicie w przypadku gdy np. odłączę Moduł. Chcę aby w tej sytuacji wyświetlał napis informujący o tym, bo teraz program się zatrzymuje i zawiesza.

    Do
    
    If Ischarwaiting() = 1 Then
    A = Inkey()
    If A = 36 Then
    
    ' -- sprawdzenie jakie dane idą ---
    Txt = ""
    For I = 1 To 5
     Gosub Cze
     A = Inkey()
     Txt = Txt + Chr(a)
    Next I
    
    
    ' -- wczytanie danych GPRMC
    If Txt = "GPRMC" Then
    
     '--godzina
    
      Gosub Dop
    
    
     Txt = ""
    Gosub A
    
    'Locate 1 , 1
    
    Godzdzies = Mid(txt , 1 , 1)
    Godzjed = Mid(txt , 2 , 1)
    Mi = Mid(txt , 3 , 2)
    Sek = Mid(txt , 5 , 2)
    
    Godz1 = Val(godzdzies)
    Godz2 = Val(godzjed)                                        'zmiana stringów od godziny na bajtową
    Godz2 = Godz2 + 1
    
    If Godz2 = 10 Then                                          ' poprawa godziny 10 i 20
    Godz2 = 0 : Godz1 = Godz1 + 1
    End If
    
    If Godz2 = 11 Then
    Godz2 = 1 : Godz1 = Godz1 + 1
    Else
    End If
                                                      'dodanie 2h do naszej strefy czasowej
    If Godz1 = 2 And Godz2 = 4 Then
    Godz1 = 0 : Godz2 = 0                                       'jesli 24 zamien na 00
    End If
    
    If Godz1 = 2 And Godz2 = 5 Then
    Godz1 = 0 : Godz2 = 1
    Else
    End If
    Godzdzies = Str(godz1)
    Godzjed = Str(godz2)
    
     Lcdat 19 , 54 , Godzdzies , Black , White
      Lcdat 19 , 63 , Godzjed , Black , White
      Lcdat 19 , 73 , ":" , Black , White
      Lcdat 19 , 83 , Mi , Black , White
       Lcdat 19 , 103 , ":" , Black , White
       Lcdat 19 , 113 , Sek , Black , White
     'Lcd Mid(godzdzies , 1 , 1) ; Mid(godzjed , 1 , 1 ) ; ":" ; Mid(txt , 3 , 2) ; ":" ; Mid(txt , 5 , 2) ; "   ";
      Gosub Cze
    
      '--status
      Txt = ""
    Gosub A
    Sta = Mid(txt , 1 , 1)
    Lcdat 22 , 4 , Sta , Black , White
     'Locate 1 , 14
     'Lcd "S:"
     'Lcd Txt
      Gosub Cze
    
    
    
    Txt = ""
    
    
    '-- Latitude
    
    
    Gosub A
    La = Mid(txt , 1 , 2)
    La2 = Mid(txt , 3)
    
    
    Lcdat 46 , 14 , La , Black , Brightblue
    Lcdat 46 , 38 , La2 , Black , Brightblue
    Lcdat 46 , 94 , "'" , Black , Brightblue
    
    
    'Lcd Mid(txt , 1 , 2) ; Chr(0) ; Mid(txt , 3 , 5) ; "'" ;
     Gosub Cze
      A = Inkey()
      Lcdat 46 , 102 , Chr(a) , Black , Brightblue
                                                ' N/S
    
    '-- Longitude
    
    
    Txt = ""
    Gosub Dop
    
    Gosub A
    
    If Mid(txt , 1 , 1) = "0" Then
    
    Lo = Mid(txt , 2 , 2)
    Lo2 = Mid(txt , 4 )
    
    
    Lcdat 56 , 14 , Lo , Black , Brightblue
    Lcdat 56 , 38 , Lo2 , Black , Brightblue
    Lcdat 56 , 94 , "'" , Black , Brightblue
    
    Else
    
    La = Mid(txt , 1 , 2)
    La2 = Mid(txt , 3 )
    
    Lcdat 56 , 14 , Lo , Black , Brightblue
    Lcdat 56 , 38 , Lo2 , Black , Brightblue
    Lcdat 56 , 94 , "'" , Black , Brightblue
    
     End If
    
    Gosub Cze                                                   ' E/W
      A = Inkey()
      Lcdat 56 , 102 , Chr(a) , Black , Brightblue
    
    
    
    '-- predkosc
    
    Txt = ""
    
    Gosub Dop
    Gosub A
    Pre = Mid(txt , 1 , 5)
    Pre2 = Val(pre)
    Pre2 = Pre2 * 1.852
    Pre = Str(pre2)
    
    Lcdat 90 , 50 , "Pr:" , Black , White
    Lcdat 98 , 50 , Pre , Black , White
    Lcdat 98 , 97 , "km/h" , Black , White
    
    
    
    
    'Lcd Mid(txt , 1 , 2) ; Chr(0) ; Mid(txt , 3 , 5) ; "'" ;
     Gosub Cze
    
     'kat
      Txt = ""
    
    Gosub A
    Kat = Mid(txt , 1 , 3)
    Lcdat 98 , 24 , Kat , Black , White
    
     Gosub Cze
    
    
     '--data
    Txt = ""
    Gosub A
    Mi = Mid(txt , 1 , 2)
    Sek = Mid(txt , 3 , 2)
    Sek2 = Mid(txt , 5 , 2)
       Lcdat 28 , 54 , Mi , Black , White
       Lcdat 28 , 73 , "/" , Black , White
       Lcdat 28 , 83 , Sek , Black , White
       Lcdat 28 , 103 , "/" , Black , White
       Lcdat 28 , 113 , Sek2 , Black , White
     'Locate 2 , 1
     'Lcd Mid(txt , 1 , 2) ; "/" ; Mid(txt , 3 , 2) ; "/" ; Mid(txt , 5 , 2) ; "   ";
    
    
     Gosub Cze
    
    End If
    End If
    
    End If
    Loop
    
    
    
    End
    $include "color8x8.font"
    
    A:
    Do
     Gosub Cze
     A = Inkey()
     If A <> 44 Then
      Txt = Txt + Chr(a)
     End If
    Loop Until A = 44
    Return
    
    
    Cze:
     Do
     Loop Until Ischarwaiting() = 1
    Return
    
    Opuscznak:
     Gosub Cze:
     A = Inkey()
    Return
    
    Dop:
     Do
     Gosub Cze:
     A = Inkey()
     Loop Until A = 44
    Return


    pozdrawiam
  • REKLAMA
  • #2 7869791
    kaerb
    Poziom 12  
    Posty: 90
    Pomógł: 1
    Ocena: 2
    Witaj,
    rozumiem, że jak odłączysz moduł to w tym momencie piny procesora "wiszą w powietrzu?"
  • REKLAMA
  • #3 7869871
    KamilDu
    Poziom 10  
    Posty: 10
    To ma być takie zabezpieczenie, że w przypadku gdy zerwie się jakoś połączenie między pinami GPS a pinami uC. Bo teraz program się zatrzymuje i czeka na dane z GPS.
    Na początku myślałem że $timeout rozwiąże sprawę, lecz niestety nie.
  • REKLAMA
  • #4 7873191
    kaerb
    Poziom 12  
    Posty: 90
    Pomógł: 1
    Ocena: 2
    Ciężka sprawa, bo jak nawet w pętli

    do
    loop ischarwaiting() = 1


    będziesz sprawdzał obecność modemu np. wysyłając mu jakąkolwiek komendę i sprawdzając czy jest odpowiedź, to przecież myśląc pesymistycznie zerwanie połączenia może nastąpić przy odczycie protokołu przez program i co wtedy?

    W jaki sposób moduł jest fizycznie połączony z płytką z prockiem?
    Nie wiem, czy to rozwiązanie Cię zadowoli, ale jeżeli jakimś dłuższym przewodem to można by dać dodatkową żyłę zwartą do masy za pomocą np. obudowy modułu i w ten prowizoryczny sposób monitorować obecność modułu na jednym z pinów atmegi :)
    ewentualnie procesor może przez adc sprawdzać pobór prądu jako spadek napięcia na rezystorze zaraz za źródłem zasilania lub bezpośrednio na zasilaniu modułu i jeżeli zmiana poboru wyniesie ponad 30 mA to wiesz, że modułu nie ma.
  • REKLAMA
  • #5 7887947
    KamilDu
    Poziom 10  
    Posty: 10
    Myślałem nad rozwiązaniem programistycznym. Nie wiem czy istnieje taka funkcja która w przypadku braku danych z UART informuje w jakiś sposób np. dając 1.
  • #6 7888549
    kaerb
    Poziom 12  
    Posty: 90
    Pomógł: 1
    Ocena: 2
    Problem polega na tym, że jeżeli odłączasz moduł to piny rx i tx nie są nigdzie podłączone, uziemione ni nic.. więc jeżeli cokolwiek pojawi się na przewodzie dołączonym do ww. pinów może być różnie interpretowane przez uC, na długim przewodzie może zaindukować się napięcie wystarczające do uznania przez procesor, że jest to sygnał z urządzenia podłączonego pod uart. Wydaje mi się, że pomiar poboru prądu przez adc jest sensowny i nie trudny do zrealizowania, w przypadku zmiany tej wartości wystawiasz sobie flagę która zatrzyma działanie programu. chociaż też nie załatwia problemu do końca bo co gdy np urwie się tylko linia tx lub rx?
REKLAMA