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

[Atmega16][Bascom] Status unit

jacektomko 18 Lis 2010 16:37 1344 2
  • #1 8759369
    jacektomko
    Poziom 10  
    Witam
    Na początku zaznaczę ze jestem początkujący i jest to mój pierwszy projekt i nie proszę o podanie mi odpowiedzi na tacy tylko ukierunkowanie na odpowiednie rozwiązanie...to tyle na wstępie:)

    Projekt: Status unit - służy do przesyłania informacji o stanie wejść mikrokontrolera-nadajnika do odbiornika i wyświetlaniu informacji na lcd wszystko opiera sie na komunikacji po rs485.
    Wszystko mi fajnie działa,komunikacja, wyświetlanie na lcd, do czasu kiedy dodałem do urządzenia diody led, mianowicie chciałem aby oprócz informacji na lcd zapaliła sie również odpowiednia dioda, nie potrafię napisać kodu który by powodował że dioda jest zapalona do czasu kiedy dany znak przestanie być odbierany po rs485,w moim przypadku dioda miga tak jak sie przewija informacje na lcd.

    Cała idea jest następująca: załóżmy ze w nadajniku uruchomią sie 4 alarmy;w odbiorniku na lcd zaczyna sie przewijać po kolei odpowiednio zaprogramowane etykiety ,w tym samym czasie led1 był by cały czas zapalony dopóki odbiornik odbiera np. alarm "Fire"

    Nie wiem czy dobrze rozwiązałem sposób komunikacji (najważniejsze że działa) może ktoś mógł by mi podpowiedzieć.

    Może dało by rade napisać jakoś żeby to co odbierze od razu zostało wyświetlone na lcd bez zbędnych stałych.

    Prosiłbym aby ktoś naprowadził mnie na odpowiednie rozwiązanie albo chociaż podał jakiś pomysł który potem samodzielnie rozwinę

    Przyjmuję wszystkie słowa krytyki ,przecież uczymy sie całe życie:)

    Z góry bardzo dziękuje

    Poniżej wklejam zdjęcia i kod

    [Atmega16][Bascom] Status unit [Atmega16][Bascom] Status unit [Atmega16][Bascom] Status unit [Atmega16][Bascom] Status unit [Atmega16][Bascom] Status unit

    Nadajnik
    $regfile = "M16def.dat"
    $crystal = 16000000
    $baud = 9600
    
    
    Dim I As Byte , J As Byte , G As Byte , H As Byte , K As Byte , L As Byte , M As Byte , N As Byte , O As Byte
    
    Config Portc = &B00000000
            Portc = &B11111111
    Config Pind.2 = Output
    Re_de Alias Portd.2
    Enable Interrupts
    Set Re_de
     I = 1
     J = 2
     G = 3
     H = 4
     K = 5
     L = 6
    
    Do
    
     If Pinc.0 = 0 Then Printbin I
     If Pinc.1 = 0 Then Printbin J
     If Pinc.2 = 0 Then Printbin G
     If Pinc.3 = 0 Then Printbin H
     If Pinc.4 = 0 Then Printbin K
     If Pinc.5 = 0 Then Printbin L
    Loop
    End
    


    Odbiornik
    $regfile = "M16def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.2
    Config Lcd = 16 * 2
    Config Pind.2 = Output
    Config Portc = Output
    Re_de Alias Portd.2
    Enable Interrupts
    
    Reset Re_de
    Portc = &B11111111
    Dim I As Byte
    Cursor Off
    Lcd Spc(5) ; "ooooo"
    Wait 1
    Lowerline
    Lcd Spc(2) ; "Status Unit"
    Wait 4
    Cls
    Do
     I = Waitkey()
    
     If I = 1 Then Lcd Spc(1) ; "Gas Level 10%"
    
     If I = 2 Then Lcd Spc(6) ; "Fire"
    
     If I = 3 Then Lcd Spc(4) ; "Low Fuel"
    
     If I = 4 Then Lcd Spc(5) ; "Fault"
    
     If I = 5 Then Lcd Spc(1) ; "Gas Level 20%"
    
    
      Wait 1
       Cls
     Loop
    End


    P.S.
    Przy zaprojektowaniu płytki bardzo mi pomógł użytkownik marco47, za co jeszcze raz bardzo dziękuje
    Zaznaczam że nie jest to żaden komercyjny projekt
  • #2 8761802
    xury
    Specjalista automatyka domowa
    Przede wszystkim w komunikacji po Usarcie to przeszedł bym na przesyłanie ASCII, a wyrażenie kończyłbym znakiem CR (13). Wtedy możesz wysyłać odebrane ciągi na wyświetlacz, bez używania stałych. Używaj do tego zwykłego Print zamiast printbin. Tak swoją drogą nie wiem czemu większość początkujących próbuje komunikować się poprzez Printbin zamiast używać ASCII.
    Odbierać możesz w przerwaniu, używając Input w połączeniu z Config Serialin z ustawionym Bytematch = 13 i buforem. Kiedy nadejdzie znak CR w obsłudze przerwania ustawiasz flagę, a w pętli sprawdzasz jej stan, a jeśli jest ustawiona odbierasz przez Input o ciąg z bufora, następnie wysyłasz go na LCD, ustawiasz odpowiednią diodę, wyłączasz inne diody i kasujesz flagę na końcu.
    Napisałem ci niemal kompletny algorytm, Tobie jedynie zostało zamienić to na kod w Bascomie.
  • #3 8761920
    jacektomko
    Poziom 10  
    dzieki za odpowiedz

    a czy jesteś w stanie mi napisać co będzie się działo np. gdy będe miał 4 alarmy aktywne i dwa alarmy bedą z parowane z diodami które muszą być włączone dopóki ktoś nie naciśnie reset-u a na lcd etykiety musza w miare płynnie wskakiwać dopóki alarmy są aktywne???

    z góry dzieki
REKLAMA