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

[Atmega32] [BASCOM] Odbieranie danych, przez rs232

klops_mops 14 Lut 2009 17:30 5866 5
REKLAMA
  • #1 6149758
    klops_mops
    Poziom 17  
    Witam!

    Dziś walczę z komunikacją rs232.

    Posiadam dwie Atmegi jedna 32, druga 16 - odbiornik.
    W nadajniku nadaję string
    
    001100.110011.001100.110011.001100.110011.001100.110011......
    

    przez
    
    Do
    Print "001100"
    Waitms 500
    Print "110011"
    Waitms 500
    loop
    


    Odbieram to:
    a) przez komputer - transmisja idealna
    
    001100.110011.001100.110011.001100.110011.001100.110011......
    

    b) przez uC mega16 - pierwsza transmisja ok, kolejne tak jakby przesunięte
    
    coś w stylu
    ##001100
    


    Kod, w odbiorniku:
    
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 19200
    
    
    Config Porta.0 = Output
    Set Porta.0
    Config Porta.1 = Output
    Set Porta.1
    Config Porta.2 = Output
    Set Porta.2
    Config Porta.3 = Output
    Set Porta.3
    Config Porta.4 = Output
    Set Porta.4
    Config Porta.5 = Output
    Set Porta.5
    Config Porta.6 = Output
    Set Porta.6
    Config Porta.7 = Output
    Set Porta.7
    
    Cls
    Cursor Off
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7
    
    
    Dim Akey As Byte
    Dim Liczba As String * 8 , Cyfra As String * 1
    Dim Pierwsza As Byte , Druga As Byte , Trzecia As Byte , Czwarta As Byte , Piata As Byte , Szosta As Byte , Siodma As Byte , Osma As Byte
    Dim Inputstring As String * 12
    Dim Cyfra2 As String * 1
    Dim Cyfra3 As String * 1
    Dim Cyfra4 As String * 1
    Dim Cyfra5 As String * 1
    Dim Cyfra6 As String * 1
    Dim Cyfra7 As String * 1
    Dim Cyfra8 As String * 1
    
    Cls
                                    'Here we declare a byte variable
    Do
    Liczba = ""
    Do
    Akey = Waitkey()
    If Chr(akey) = "." Then Goto Vv                             'On enter key goto thanks
       Liczba = Liczba + Chr(akey)
    Loop
    
    
    
    Vv:
    Locate 1 , 1
    Lcd Liczba
    Cyfra = Mid(liczba , 1 , 1)
    Pierwsza = Val(cyfra)
    
    Cyfra2 = Mid(liczba , 2 , 1)
    Druga = Val(cyfra2)
    
    Cyfra3 = Mid(liczba , 3 , 1)
    Trzecia = Val(cyfra3)
    
    Cyfra4 = Mid(liczba , 4 , 1)
    Czwarta = Val(cyfra4)
    
    Cyfra5 = Mid(liczba , 5 , 1)
    Piata = Val(cyfra5)
    
    Cyfra6 = Mid(liczba , 6 , 1)
    Szosta = Val(cyfra6)
    
    Cyfra7 = Mid(liczba , 7 , 1)
    Siodma = Val(cyfra7)
    
    Cyfra8 = Mid(liczba , 8 , 1)
    Osma = Val(cyfra8)
    
    
    Locate 2 , 1
    Lcd Pierwsza ; "." ; Druga ; "." ; Trzecia ; "." ; Czwarta
    
    Locate 2 , 10
    Lcd Cyfra ; "." ; Cyfra2 ; "." ; Cyfra3 ; "." ; Cyfra4
    
    
    If Pierwsza = 1 Then
    Reset Porta.0
    Else
    Set Porta.0
    End If
    
    If Druga = 1 Then
    Reset Porta.1
    Else
    Set Porta.1
    End If
    
    If Trzecia = 1 Then
    Reset Porta.2
    Else
    Set Porta.2
    End If
    
    If Czwarta = 1 Then
    Reset Porta.3
    Else
    Set Porta.3
    End If
    
    
    If Piata = 1 Then
    Reset Porta.4
    Else
    Set Porta.4
    End If
    
    
    If Szosta = 1 Then
    Reset Porta.5
    Else
    Set Porta.5
    End If
    
    
    If Siodma = 1 Then
    Reset Porta.6
    Else
    Set Porta.6
    End If
    
    
    If Osma = 1 Then
    Reset Porta.7
    Else
    Set Porta.7
    End If
    Loop
    
    
    End
    


    Otrzymuję tak jakby przesunięty wynik o 2 pola w prawo na wyświetlaczu..

    Gdy zamiast nadajnika podłączę komputer i tam nadam string:
    
    001100.110011.
    

    To odbiornik odbiera wszystko elegancko i zapala odpowiednie diody.

    Wydaję mi się, że nie tak jest coś z tą ".", tzn. komuter nada w ASCI. Nie wiem dokładnie co jest przyczyną i jak to rozwiązać - proszę o pomoc.

    Pozdrawiam
  • REKLAMA
  • #2 6149955
    wader_669
    Poziom 28  
    Mialem podobny problem. Wydaje mi sie, ze rozwiazaniem jest wlaczenie przerwania uart wtedy kiedy ci jest potrzebne. Nie jestem pewien co do rozwiazania, bo czekam na nowa plytke testowa jak bede ja mial tez bede z tym walczyc

    i dlaczego robisz print a nie printbin?

    _____________________________________________________________
    teraz dopiero przejzalem twoj kod i jednak chyba moje rozwiazanie tobie duzo nic nie da
  • REKLAMA
  • #3 6150034
    klops_mops
    Poziom 17  
    Tylko, że mi Uart jest ciągle potrzebny. Ale pokombinuję..

    Nie znam funkcji printbin, ale zaraz poznam :)
  • REKLAMA
  • #4 6151231
    elektryk
    Poziom 42  
    Co oznaczają te ## w tym przykładowym przesuniętym programie? Spróbuj:
    1. zsynchronizować zegary (może problemem jest różna częstotliwość taktowania
    2. skrócić program odbierający znaki o czasożerne procedury, jeśli to pomoże to trzeba zaprojektować programowe FIFO po stronie odbiorczej koniecznie na przerwaniach.
  • REKLAMA
  • #5 6151325
    zumek
    Poziom 39  
    klops_mops napisał:
    ... b) przez uC mega16 - pierwsza transmisja ok, kolejne tak jakby przesunięte
    
    coś w stylu
    ##001100
    


    A słyszałeś kiedyś o takich dziwadłach jak CR i LF :?:
    ATMega32 wysyła te "krzaczki" , a ATMega16 je odbiera, upycha w zmiennej Liczba i to Twój cały problem :-P
    Pozbądź się tych kodów sterujących z nadajnika i masz kłopot z głowy ;)
REKLAMA