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

Atmega16 RS232 - komunikacja dwóch procków

guest666 12 Sty 2009 08:49 1749 5
REKLAMA
  • #1 5986475
    guest666
    Poziom 12  
    Witam
    Problem następujący:
    Dwa procki komunikują sie radiowo na modułach telecontrolli.
    Jeden procek nadaje string, drugi odbiera.
    Ogólnie all jest ok, ale gdy dopisze opcje wyświetlania czasu na LCD to sekundy idą tylko wtedy kiedy coś nadaje nadajnik, a jesli go wylacze sekundy sie zatrzymują.

    Oto kod:
    Odbiornik

    $regfile = "m16def.dat"
    $crystal = 16000000
    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
    
    $baud = 1200
    
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    Config Serialin = Buffered , Size = 20
    
    Config Dcf77 = Pind.2 , Debug = 1 , Inverted = 1 , Check = 2 , Update = 1 , Updatetime = 30 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1
     Porta.7 = 1
    
    Dim Na As String * 10
    
    Enable Interrupts
    
    
    Cls
    Do
      Locate 1 , 1
      Lcd Time$
      If Ischarwaiting() = 1 Then                               'was there a char?
         Input Na
      End If
      Locate 2 , 1
      Lcd Na
    Loop
    
    


    Nadajnik:
    
    $regfile = "m16def.dat"
    $crystal = 16000000
    
    $baud = 1200
    
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    Dim A As String * 5
    
    
    Do
      A = "+21.5"
      Print A ; Chr(13);
      Wait 5
      A = "+10.5"
      Print A ; Chr(13);
      Wait 5
      A = "+1.5"
      Print A ; Chr(13);
      Wait 5
    Loop
    
  • REKLAMA
  • #2 5986624
    krzychS
    Poziom 29  
    Dla zmiennej TIME$ musisz zastosować instrukcję CONFIG CLOCK, żeby inicjować zegar: Config Clock = Soft
  • REKLAMA
  • #3 5986639
    guest666
    Poziom 12  
    Ale czy aby tu jest tylko problem? Czy właśnie dlatego przestaje dzialac ten zegarek?
    Zaznaczam ze wystarczy tylko gdy NOŚNA z nadajnika zniknie (brak prądu) to odbiornik (wyświetlany czas) zatrzymuje się, a gdy się znowu pojawi nośna to idzie dalej.
    Oczywiście ową sugestie sprawdzę wieczorem..
    Pozdrawiam
  • REKLAMA
  • #4 5988445
    guest666
    Poziom 12  
    Witam. Niestety nie pomogło..
    Czekam na dalsze sugestie

    Prawdopodobnie to odbiornik RRQ3 433Mhz daje zbyt dużo śmieci na wyjściu i dlatego procesor "mysli" ze te dane są rs232 i dlatego procesor staje i nic nie wyświetlacz na wyświetlaczu("w tle" czas idzie-gdy załącze ponownie zasilanie nadajnika wszystko wraca do normy)
    moze ktos sie z tym juz spotkal?

    Moze ktoś wie jak zrobić aby dane na wejście D.0 (RX) procesora nie blokowaly (wstrzymywały) programu.
    Prosze o pomoc.
    pozdrawiam
  • REKLAMA
  • #5 5991842
    guest666
    Poziom 12  
    Czy pomoże ktoś?
  • #6 5992061
    dawid512
    Poziom 32  
    Skorzystać z odbioru danych w przerwaniu od UARTA. Mały przykład dla ciebie:
    $regfile = "M32def.dat"                                     'Deklaracja typu mikrokontrolera
    $crystal = 8000000                                          'Czestotliwosc oscylatora
    $baud = 9600
    
    Const Max_znakow = 11                                       'rozmiar bufora 
    Dim Bufor As String * Max_znakow
    Dim Licz_znaki As Byte
    Dim Flaga As Bit
    
    Enable Interrupts
    On Urxc Odebrano                                            'przerwanie od UARTA
    Enable Urxc
    '************************************************
    
    Cls
    Cursor Off
    
    Do
    
    Locate 1 , 1
    Lcd Bufor
    
    
    
    If Flaga = 1 Then
    Cls
    Reset Flaga
    
    End If
    
    
    Loop
    End
    
    
    '*************************************************
    Odebrano:
    Disable Urxc                                                ' wylaczenie przerwania na czas trwania aktualnego
                                                                 'Jesli licznik znakow jest mniejszy od maksymalnego rozmiaru buforu to...
    If Licz_znaki < Max_znakow Then                             '...zwieksz licznik znakow, do buforu transmisji dopisz nastepny znak
       Incr Licz_znaki                                          'Chr(udr) dopisuje znaki z rejestru udr (rejestr transmisji)
       Bufor = Bufor + Chr(udr)
    End If
    
    
    If Licz_znaki = Max_znakow Then
    Print Bufor                                                 'Jesli bufor jest pelny to...
     Bufor = ""                                                 ' wyzeruj bufor i...
     Licz_znaki = 0
     Set Flaga                                                  'wyzeruj licznik znakow
    End If
    
    
    
    Enable Urxc
    Return


    Koniec gotowców :P
REKLAMA