Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega32] [BASCOM] Odbieranie danych, przez rs232

klops_mops 14 Lut 2009 17:30 5419 5
  • #1 14 Lut 2009 17:30
    klops_mops
    Poziom 17  

    Witam!

    Dziś walczę z komunikacją rs232.

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

    Code:

    001100.110011.001100.110011.001100.110011.001100.110011......

    przez
    Code:

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


    Odbieram to:
    a) przez komputer - transmisja idealna
    Code:

    001100.110011.001100.110011.001100.110011.001100.110011......

    b) przez uC mega16 - pierwsza transmisja ok, kolejne tak jakby przesunięte
    Code:

    coś w stylu
    ##001100


    Kod, w odbiorniku:
    Code:

    $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:
    Code:

    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

    0 5
  • #2 14 Lut 2009 18:08
    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

    0
  • #3 14 Lut 2009 18:23
    klops_mops
    Poziom 17  

    Tylko, że mi Uart jest ciągle potrzebny. Ale pokombinuję..

    Nie znam funkcji printbin, ale zaraz poznam :)

    0
  • #4 14 Lut 2009 22:02
    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.

    0
  • #5 14 Lut 2009 22:26
    zumek
    Poziom 39  

    klops_mops napisał:
    ... b) przez uC mega16 - pierwsza transmisja ok, kolejne tak jakby przesunięte
    Code:

    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 ;)

    0
  • #6 16 Lut 2009 15:06
    klops_mops
    Poziom 17  

    Tak - bardzo dziękuję poczytałem o tym - wystarczyło po print zmienna dodać ";", tj.:

    Code:

    print wartosc;

    Bardzo dziękuję

    0