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] Komunikacja UART między Atmega16 i Atmega328 - zamiana zmiennych i transmisja dwukierunkowa

dam23 22 Maj 2024 07:27 327 2
REKLAMA
  • #1 21091464
    dam23
    Poziom 10  
    Witam
    Panowie mam problem mianowicie z komunikacją UART 2 AVR .Jeden z nich to Atmega16(odbiornik) a drugi Atmega328(Nadajnik) i tak:
    Nadajnik wysyła 2 zmienne do odbiornika na którym jest wyświetlana wartość na LCD i wszystko działa poprawnie ale zdarza się tak że zmienne lubią zamienić się miejscami tzn, "Znak" dostaje wartość "Znak_1" i odwrotnie. Najczęściej dzieje się to podczas resetu odbiornika lecz zdążyło się tak ze po paru godz. pracy też zamieniły się miejscami. To jeden problem, a drugi to w jaki sposób wykonać transmisje 2kierunkową tzn. jeżeli w odbiorniku zostanie np. wciśnięciu przycisk to w nadajniku zapali się LED.
    'Nadajnik
    $regfile = "m328def.dat"
    $crystal = 16000000
    $baud = 9600


    Dim Znak As Byte
    Dim Znak_1 As Byte
    Dim Led_state As Byte

    Znak_1 = 193
    Config Portb.0 = Output
    Led Alias Portb.0
    'Config Printbin = Extended

    Do
    Waitms 100
    Incr Znak
    If Znak >= 100 Then
    Znak = 0
    Incr Znak_1
    End If

    'If Led_state = 0 Then Led = 1
    'If Led_state = 1 Then Led = 0
    'Inputbin Led_state
    Gosub Wysli

    Loop
    End
    Wysli:
    Printbin Znak_1 ; Znak
    'Inputbin Led_state
    Return

    'Odbiornik
    $regfile = "m16adef.dat"
    $crystal = 16000000
    $baud = 9600

    Config Printbin = Extended
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Cursor Off
    Cls

    Dim Znak As Byte
    Dim Znak_1 As Byte
    Dim Led_on As Byte

    Do
    'Znak = Inkey()
    'Znak_1 = Inkey()

    Inputbin Znak , Znak_1

    'Printbin Led_on

    Locate 1 , 2
    Lcd " " ; Znak ; " "
    Locate 2 , 2
    Lcd " " ; Znak_1 ; " "
    If Znak = 20 Then
    Led_on = 1

    End If
    If Znak = 70 Then
    Led_on = 0
    End If
    Loop
    End
  • REKLAMA
  • #2 21091593
    ZbeeGin
    Poziom 39  
    Myślę, że źle podszedłeś do tematu. Wypadałoby wykorzystać przerwania z UARTu i zrobić sobie jakąś ramkę wymiany danych z sumą kontrolną by wiedzieć, że odebrane dane są poprawne, a jeśli nie to żądać powtórki lub je odrzucić.
  • #3 21093912
    bart-projects
    Poziom 29  
    Do Autora tematu.
    Jeśli to maja być tylko dwie zmienne przesyłane pomiedzy układami to to jest klasyka i opisane wielokrotnie.
    Jeśli jednak to, że nie udaje się przesłać dwóch zmiennych ma być tylko wstępem do rozbudowanej transmisji ... to naprawdę trzeba do tego podejść inaczej od razu.
REKLAMA