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

Pomoc przy kodzie atmega8 + siemens a60

lenny35 16 Sie 2010 15:40 1764 6
REKLAMA
  • #1 8404147
    lenny35
    Poziom 13  
    Witam!
    Stworzyłem sobie układ do komunikacji pomiędzy atmega 8 i siemensem a60.
    Układ działa - komunikacja w obie strony jest OK, lecz mam problem z kodem, a mianowicie: chcę aby atmega po otrzymaniu sygnału trzech różnych telefonów wyłącza na 10s przekaźnik, a później z powrotem załączała. Program działa poprawnie do momentu wyświetlenia numeru telefonu dzwoniącego, ale później nie chce przejść do pętli, która na razie dla prób ma tylko wyświetlać napis na lcd. Z góry dziękuje!!! Poniżej zamieszczam kod. Numer telefonu oczywiście fikcyjny.

    $regfile = "m8def.dat"
    $crystal = 8000000
    Baud = 9600
    
    Config Serialin = Buffered , Size = 200
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , Rs = Portd.7
    
    Cursor Off
    Enable Interrupts
    
    Declare Sub Odczytaj_sprzetowy_uart
    Declare Sub Oproznij_bufor
    Declare Sub Wyslij
    
    
    
    Dim Bufor As Byte
    Dim Ring As Byte
    Dim Uart_txt As String * 20
    Dim Ringtxt As String * 20
    Dim Dzw As Byte
    Dim Dzwtxt As String * 5
    Dim Dzwoniacy As String * 9
    Dim Kod As Byte
    Dim Wlacz As Byte
    
    Dzwtxt = ": +48"
    Ringtxt = "RING"
    
    
      Waitms 100
      Print "ATX0" ; Chr(13)                                    'Odpowiadaj
      Waitms 100
      Print "ATZ" ; Chr(13)                                     'Ustaw domyślnie
      Waitms 100
      Print "ATE0" ; Chr(13)                                    'WYLACZ ECHO
      Waitms 100
      Print "AT+CLIP=1" ; Chr(13)                               'Wlaczanie prezentacji numeru
      Waitms 100
    
    Gosub Oproznij_bufor
    
    Locate 1 , 1
    Lcd "Koniec ini"
    Wait 1
    Cls
    
    
    Do
    
    
    Locate 1 , 1
    Lcd "dziala            "
    
    
    Bufor = Ischarwaiting()                                     'Sprawdz czy bufor pełny
    
           If Bufor = 1 Then
    
           Gosub Odczytaj_sprzetowy_uart
    
           Ring = Instr(uart_txt , Ringtxt)
           If Ring > 0 Then                                     'Jeśli telefon dzwoni
             Waitms 100
             Gosub Odczytaj_sprzetowy_uart
             Gosub Odczytaj_sprzetowy_uart
             Wait 1
             Print "ATH" ; Chr(13)                              'Rozłącz się
             Wait 1
             Gosub Oproznij_bufor                               'Opróżnij bufor ze smieci
             Cls : Lcd "RING" : Wait 1
             Dzw = Instr(uart_txt , Dzwtxt)
             Dzw = Dzw + 9
             Dzwoniacy = Mid(uart_txt , Dzw , 11)
             Cls
             Locate 1 , 1
             Lcd Dzwoniacy
             Wait 1                                             'Wyłuskaj numer dzwoniacego
             Cls
             If Dzwoniacy = "604604604" Or Dzwoniacy = "604604604" Or Dzwoniacy = "604604604" Then
             Gosub Wyslij
    
    
         End If
         End If
         End If
    
    
    Loop
    End
    
    
    Odczytaj_sprzetowy_uart:
    
    Uart_txt = ""
    
    Do                                                          'Odbierz znak po znaku
      Kod = Inkey()
      Uart_txt = Uart_txt + Chr(kod)                            'Zapisz w Uart_txt
      Bufor = Ischarwaiting()                                   'Zakoncz jeśli CR lub brak znaku
    Loop Until Bufor = 0 Or Kod = 13
    Return
    
    
    Oproznij_bufor:
    Do
       Kod = Inkey()                                            'Czyści bufor
       Bufor = Ischarwaiting()
       If Bufor > 0 Then Wlacz = 0
    Loop Until Bufor = 0
    Return
    
    Wyslij:
    Cls
    Locate 1 , 1
    Lcd "działa"
    Locate 2 , 1
    Lcd "dobrze"
    Wait 10
    Cls
    Return
  • REKLAMA
  • #2 8404365
    nsvinc
    Poziom 35  
    Nie chce mi sie kodu w bascomie czytac, ale:

    napisze ci pseudokodem, bo nie znam bascoma :]

    
    
    var dzwoniacy;
    var dzwoni1,dzwoni2,dzwoni3
    
    dzwoni1=0; 
    dzwoni2=0; 
    dzwoni3=0;
    //--------------------------------
    
    if (dzwoniacy="1234567") dzwoni1=1
    if (dzwoniacy="2345678") dzwoni2=1
    if (dzwoniacy="3456789") dzwoni3=1
    
    if (dzwoni1 AND dzwoni2 AND dzwoni3)
    {
    pracuj(); //wykonaj jakas robote jak zadzwonia wszyscy trzej
    dzwoni1=0
    dzwoni2=0
    dzwoni3=0
    }
    


    Pamietaj, ze jeszcze musi byc jakis timeout, ze jak jeden z nich zadzwoni
    dzisiaj, a drugi i trzeci zadzwoni trzy dni pozniej, to im zadziala.
    Musisz liczyc czas miedzy dzwoniacymi...
  • REKLAMA
  • #3 8404589
    lenny35
    Poziom 13  
    Trochę źle opisałem o co mi chodzi. Układ ma być sterowany jednym z trzech telefonów. Chodzi o to że dostępne mają być trzy numery, którymi będzie można sterować urządzenie.
  • REKLAMA
  • #4 8405975
    xury
    Specjalista automatyka domowa
    Kolega zadeklarował Subroutin'y a korzysta z Gosub i Return.
    Typowy błąd w sztuce.
    Poczytać o Gosub i Call
    Dla Gosub nie trzeba nic deklarować.

    A i jeszcze kilka uwag:
    Zamiast jakiejś tam Opróżnij_bufor wystarczy Clear serialin
    A może coś źle parsujesz te numery i żaden się nie zgadza, a tego nie przewidziałeś w programie, że numer się nie zgadza.
    Zamiast If dzwoniący numer or ....
    Lepiej zastosować Select Case i z opcja calse else jeśli numer jest nieprawidłowy.
  • #5 8411052
    lenny35
    Poziom 13  
    Chyba czegoś nie rozumiem, a więc poprawiłem program według wcześniejszych zaleceń. Dzwonię na komórkę podłączoną do atmegi z telefonu o numerze 509509509. Na ekranie lcd podłączonym pod atmegę wyświetla się "509509509"
    a procedura select case przechodzi do pod programu "nie_dziala". Pomóżcie bo już nie mam pomysłu. Czemu wyświetla na LCD dobrze, a później twierdzi, że nie dzwoni odpowiedni numer. Dla mnie jest to niezrozumiałe.
    $regfile = "m8def.dat"
    $crystal = 8000000
    Baud = 9600
    
    Config Serialin = Buffered , Size = 100
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , Rs = Portd.7
    
    Cursor Off
    Enable Interrupts
    
    Dim Bufor As Byte
    Dim Ring As Byte
    Dim Uart_txt As String * 100
    Dim Ringtxt As String * 20
    Dim Dzw As Byte
    Dim Dzwtxt As String * 20
    Dim Dzwoniacy As String * 40
    Dim Kod As Byte
    Dim Wlacz As Byte
    Dim X As String * 20
    
    Dzwtxt = "CLIP: "
    Ringtxt = "RING"
    
    
      Waitms 100
      Print "ATX0" ; Chr(13)                                    'Odpowiadaj
      Waitms 100
      Print "ATZ" ; Chr(13)                                     'Ustaw domyślnie
      Waitms 100
      Print "ATE0" ; Chr(13)                                    'WYLACZ ECHO
      Waitms 100
      Print "AT+CLIP=1" ; Chr(13)                               'Wlaczanie prezentacji numeru
      Waitms 100
    
    Gosub Oproznij_bufor
    
    Locate 1 , 1
    Lcd "Koniec ini"
    Wait 1
    Cls
    
    
    Do
    
    Locate 1 , 1
    Lcd "pracuje                "
    
    Bufor = Ischarwaiting()                                     'Sprawdz czy bufor pełny
    
           If Bufor = 1 Then
    
           Gosub Odczytaj_sprzetowy_uart
    
           Ring = Instr(uart_txt , Ringtxt)
    
           If Ring > 0 Then                                     'Jeśli telefon dzwoni
             Waitms 100
             Gosub Odczytaj_sprzetowy_uart
             Gosub Odczytaj_sprzetowy_uart
             Wait 1
             Print "ATH" ; Chr(13)                              'Rozłącz się
             Wait 1
             Gosub Oproznij_bufor                               'Opróżnij bufor ze smieci
             Cls : Lcd "RING" : Wait 1
             Dzw = Instr(uart_txt , Dzwtxt)
             Dzw = Dzw + 6
             Dzwoniacy = Mid(uart_txt , Dzw , 11 )
             Cls
             Locate 1 , 1
             Lcd Dzwoniacy
             Wait 5                                             'Wyłuskaj numer dzwoniacego
             Cls
    
             Select Case Dzwoniacy
             Case "509509509" : Gosub Wyslij
             Case Else : Gosub Nie_dziala
             End Select
    
    
             End If
             End If
    
    
    Loop
    End
    
    
    Odczytaj_sprzetowy_uart:
    
    Uart_txt = ""
    
    Do                                                          'Odbierz znak po znaku
      Kod = Inkey()
      Uart_txt = Uart_txt + Chr(kod)                            'Zapisz w Uart_txt
      Bufor = Ischarwaiting()                                   'Zakoncz jeśli CR lub brak znaku
    Loop Until Bufor = 0 Or Kod = 13
    Return
    
    
    Oproznij_bufor:
    Do
       Kod = Inkey()                                            'Czyści bufor
       Bufor = Ischarwaiting()
       If Bufor > 0 Then Wlacz = 0
    Loop Until Bufor = 0
    Return
    
    Wyslij:
    Cls
    Locate 1 , 1
    Lcd "działa"
    Locate 2 , 1
    Lcd "dobrze"
    Wait 10
    Cls
    Return
    
    Nie_dziala:
    Cls
    Locate 1 , 1
    Lcd "nie dziala"
    Wait 5
    Cls
    Return
  • REKLAMA
  • #6 8413430
    Jaca
    Poziom 31  
    Czy numer jaki odczytujesz nie jest przypadkiem zawarty w "" ? Jeśli tak to w case go nie rozpozna bo "" w Bascom'ie używany jest do definicji string'ów. Pozbądź się "" z odczytanego numeru zanim go porównasz w case.
  • #7 8414089
    lenny35
    Poziom 13  
    Jaca jest jak mówisz, ale doszedłem do tego przed przeczytaniem twojego posta. :D Czasem tak jest, że człowiek nie zwraca uwagi na drobiazgi i potem jest problem. W każdym razie dziękuje za podpowiedź. Teraz urządzenie działa OK.
REKLAMA