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 attiny2313 problem z komunikacją UART

adamus202 07 Maj 2010 19:37 2540 3
REKLAMA
  • #1 8048212
    adamus202
    Poziom 13  
    Witam.
    Wykonałem sterownik zaworu na silniku krokowym którym steruje µC attina2313.
    W celu zamknięcia lub otwarcia zaworu do sterownika wysyłana jest liczba 60 (zamknij) i 55 (otwórz). Te liczby wysyłam z drugiej attiny 2313 przez polecenie:
    Sto = 55
    Print Sto ; Chr(13);

    I niby wszystko działa za każdym razem lecz jest jeden problem. Za każdym razem po 22 wysłaniach zamknij otwórz wysłanie 23 razu, którym jest komenda otwarcia sterownik zaworu już nie reaguje.
    Na pewno nie jest to wina nadajnika bo go resetowałem i nic nie pomogło, zawór dalej nie reaguje.
    Poniżej zamieszczam kod od attiny w sterowniku zaworu.
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $baud = 2400
    Echo Off
    
    
    Config Serialin = Buffered , Size = 3 , Bytematch = 13
    'Config Serialout = Buffered , Size = 15
     Config Input = Cr , Echo = Off
    
     Enable Interrupts
    Config Pinb.3 = Output                                      'cztery wyjścia na krokowca
    Config Pinb.2 = Output
    Config Pinb.1 = Output
    Config Pinb.0 = Output
    Config Pinb.4 = Input                                       ' wejście krańcówki
    
    Portb = &B10000
    
    '*********************************DEKLARACJA ZMIENNYCH*******************************
    Dim Czas As Byte
    Dim A As Byte
    Dim Licz As Byte
    Dim Zawon As Byte
    Dim Zawoff As Byte
    Dim K As Byte
    Dim Stopt As Byte
    Dim Flaga As Bit
    
    Zawon = 222
    Zawoff = 55
    Stopt = 44
    Licz = 0
    
    '*************************************************************************************
    Wait 2
    For A = 1 To 255
    Portb = Lookup(licz , Tab)
    Waitms 1
    Incr Licz
    If Licz = 4 Then
    Licz = 0
    End If
    If Pinb.4 = 0 Then
    Exit For
    End If
    Next
    
    Portb = &B10000
    
      Print Zawoff ; Chr(13);
    Powrot:
    
    '******************************PETLA GŁOWNA******************************************
    Do
    
    
    If Flaga = 1 Then
      Input K
     If K = 55 Then
     Gosub Otwieranie
     End If
    End If
    
    Loop
    End
    
    
    
    Otwieranie:
    Licz = 1
    For A = 1 To 160
    Portb = Lookup(licz , Tab)
    Waitms 2
    Decr Licz
    If Licz = 255 Then
    Licz = 3
    End If
    Next
    Portb = &B10000
    Print Zawon ; Chr(13);
    K = 0
    
    
    Do
    If Flaga = 1 Then
    Input K
     If K = 60 Then
     Print Stopt ; Chr(13);
     Gosub Zamykanie
     End If
    End If
    Loop
    
    
    Zamykanie:
    Licz = 3
    For A = 1 To 160
    Portb = Lookup(licz , Tab)
    Waitms 2
    Incr Licz
    If Licz = 4 Then
    Licz = 0
    End If
    If Pinb.4 = 0 Then
    Exit For
    End If
    Next
    Portb = &B10000
     Print Zawoff ; Chr(13);
    K = 0
     Clear Serialin
    Goto Powrot
    
    
    Tab:
    Data &B11001 , &B11100 , &B10110 , &B10011
    
    Serial0charmatch:
    Set Flaga
    Return
  • REKLAMA
  • Pomocny post
    #2 8048320
    ololukiXP
    Poziom 19  
    Po 1. Zlikwiduj GOTO
    Po 2. Zrób jedną pętlę główną DO-LOOP i w niej umieść odbieranie obu komend. Za pętlą i END umieść podprogramy otwieranie i zamykanie zakończone komendą RETURN.
  • REKLAMA
  • #3 8048636
    adamus202
    Poziom 13  
    Wielki dzięki, po twoich zaleceniach zmodyfikowałem kod i działa tak jak powinno.
    Poniżej obecna wersja kodu:
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $baud = 2400
    Echo Off
    
    
    Config Serialin = Buffered , Size = 3 , Bytematch = 13
    Config Serialout = Buffered , Size = 3
     Config Input = Cr , Echo = Off
    
     Enable Interrupts
    Config Pinb.3 = Output                                      'cztery wyjścia na krokowca
    Config Pinb.2 = Output
    Config Pinb.1 = Output
    Config Pinb.0 = Output
    Config Pinb.4 = Input                                       ' wejście krańcówki
    
    Portb = &B10000
    
    '*********************************DEKLARACJA ZMIENNYCH*******************************
    Dim Czas As Byte
    Dim A As Byte
    Dim Licz As Byte
    Dim Zawon As Byte
    Dim Zawoff As Byte
    Dim K As Byte
    Dim Stopt As Byte
    Dim Flaga As Bit
    Dim Blokada As Bit
    
    Zawon = 222
    Zawoff = 55
    Stopt = 44
    Licz = 0
    
    '*************************************************************************************
    Wait 2
    For A = 1 To 255
    Portb = Lookup(licz , Tab)
    Waitms 1
    Incr Licz
    If Licz = 4 Then
    Licz = 0
    End If
    If Pinb.4 = 0 Then
    Exit For
    End If
    Next
    Blokada = 1
    Portb = &B10000
    
      Print Zawoff ; Chr(13);
    
    
    '******************************PETLA GŁOWNA******************************************
    Do
    
    
    If Flaga = 1 Then
     Input K Noecho
     Clear Serialin
    
     If K = 55 And Blokada = 1 Then
     Gosub Otwieranie
     End If
    
     If K = 60 And Blokada = 0 Then
     Gosub Zamykanie
     End If
    End If
    
    Loop
    End
    
    Tab:
    Data &B11001 , &B11100 , &B10110 , &B10011
    
    Otwieranie:
    Licz = 1
    For A = 1 To 160
    Portb = Lookup(licz , Tab)
    Waitms 2
    Decr Licz
    If Licz = 255 Then
    Licz = 3
    End If
    Next
    Portb = &B10000
    Print Zawon ; Chr(13);
    K = 0
     Blokada = 0
    Return
    
    
    Zamykanie:
    Licz = 3
    For A = 1 To 160
    Portb = Lookup(licz , Tab)
    Waitms 2
    Incr Licz
    If Licz = 4 Then
    Licz = 0
    End If
    If Pinb.4 = 0 Then
    Exit For
    End If
    Next
    Portb = &B10000
     Print Zawoff ; Chr(13);
    K = 0
    Blokada = 1
    Return
    
    Serial0charmatch:
    Set Flaga
    Return


    I przy okazji, czy takie połączenie pokazane na rysunku ma szansę działać. Linie Tx i Rx bezpośrednio z mikrokontrolerów bez układów typu max232.
    Bascom attiny2313 problem z komunikacją UART
  • Pomocny post
    #4 8061492
    Maciekqbn
    Poziom 15  
    Cytat:
    I przy okazji, czy takie połączenie pokazane na rysunku ma szansę działać. Linie Tx i Rx bezpośrednio z mikrokontrolerów bez układów typu max232.


    Stan spoczynkowy na lini TX to stan wysoki a linia TX jest ustawiona jako wyjście, więc nie można jej "bezkarnie" zwierać do masy. Gdy mikrokontroler (attiny nr 1) nadaje (zmienia stan na niski) jednocześnie przywiera wyjście TX drugiego mikrokontrolera (attiny nr 2).
    Może i będzie działać, ale żeby było tak do końca prawidłowo, to na wyjściach TX attiny2313 daj jakieś bufory OC (np. HCT07) i dopiero ich wyjścia łącz razem do wejścia RX atmegi.

    Transmisja w drugą stronę (z atmegi do obu mikrokontrolerów attiny) jest OK.
REKLAMA