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

Odbiór danych RSem (atmega16, BASCOM)

karolczyzycki 23 Wrz 2009 13:14 1991 9
REKLAMA
  • #1 7048869
    karolczyzycki
    Poziom 20  
    Witam.
    Mam TV LG, steruje nim za pomocą RSa
    Jeśli robię to za pomocą komputera i wysyłam kod:

    TV ustawia pozim dzwięku na 32%, jeśli się uda tyo w terminalu otrzymuję potwierdzenie w postaci:

    Zrobiłem takie samo sterowanie za pomocą atmegi16
    Wysyłam kod:

    TV zmienia poziom głosu (więc wszystko OK)
    Ale nie otrzymuję potwierdzenia, albo nie umiem go zinterpretować

    Mój kod programu:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7       'standard
    Config Lcd = 16 * 2
    Config Portc = Input
    Config Portd = Output
    Config Porta = Output
    Config Portb = Output
    Cursor Off
    
    Portc.0 = 1
    
    Dim T As Integer
    Dim S As String * 10
    T = 800
    Cls
    
    Do
    Start3:
    Portc.0 = 1
    
       If Pinc.0 = 0 Then
          Waitms 50
          Porta.7 = 0
          Goto Glos
       End If
    
    Loop                                                                                       
    End
    
    Glos:
    Lcd "glos"
    Waitms 500
    Cls
    Print "kf 0 20" ' wysyłam komendę 
    ' TV reaguje poprawnie
    ' w tym momencie TV powinien zwrócić "f 01 OK 20x (w terminalu pokazuje)"
    S = Inkey()              ' odbieram zwróconą komendę
    Locate 1 , 1               
    Lcd S                     ' wyświetlam ją na ekranie za pomocą tej komendy (nie działa)
    Print Chr(s);            ' wyświetlam ją na ekranie za pomocą tej komendy (nie działa)
    Print S                   ' wyświetlam ją na ekranie za pomocą tej komendy (nie działa)
    Goto Start3


    S - deklaruje jako 10 znakowy string.
    Żadna komend: LCD, Print, Print Chr - nie wyświetla pobranych danych
    Gdzie może być błąd? Może procesor nie odczytuje zwróconej komendy poprawnie?
  • REKLAMA
  • #2 7048998
    arnoldziq
    VIP Zasłużony dla elektroda
    Czy INKEY() nie zwraca przypadkiem tylko jednego znaku , zamiast całego ciągu ?
  • #3 7049009
    karolczyzycki
    Poziom 20  
    a tego nie wie... powiem szczerze że sciągnąłem to z przykłądowego programu... nawet o tym nie pomyślałem
    Ale jeśli tak, to powinna sięwyświetlić chodziaż ta pierwsza literka

    W takim razie jakiej komendy muszę użyć? instr lub input?
    input - program się zatrzymuje (jakby się zawiesił i czekał na jakieś dane)
    instr - wyskakuje błąd
  • REKLAMA
  • #4 7049128
    M. S.
    Poziom 34  
    A jeśli pierwsza litera to spacja? Spróbuj Input. Powinno działać o ile TV wysyła znak CR na końcu danych. Bez znaku CR Input zawiesi program w AVR.
  • #5 7049147
    karolczyzycki
    Poziom 20  
    Wygląda to tak:
    Odbiór danych RSem (atmega16, BASCOM)
    Odbiór danych RSem (atmega16, BASCOM)
    nie wiem co wysyła na końcu.
    W transmisji to komputer wysyła CR
    Nie bardzo to rozumiem...
  • #6 7049152
    arnoldziq
    VIP Zasłużony dla elektroda
    Może spróbuj w ten sposób :
    Do
    K = Inkey();                    ' pobranie jednego znaku
    Lcd Chr(k);                     ' wyświetlenie jednego znaku
    Loop Until K = 13              ' zakończ pętlę wraz ze znakiem CR 0x0D 


    No i przydała by się jakaś jasna definicja UART-u, np:
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

    Po chwili nasunęło mi się coś jeszcze :
    Definiujesz cały port D jako output, to jak chcesz coś odczytać z UART-u jeżeli na tym porcie masz zarówno RX jak i TX ?
  • REKLAMA
  • #7 7049217
    karolczyzycki
    Poziom 20  
    Racja... (bez tego nie miało prawa działać)
    Zmieniłem RXD ustawiłem jako INPUT, TXD jako OUTPUT
    Ale to dalej nie pomaga...
  • #8 7049428
    arnoldziq
    VIP Zasłużony dla elektroda
    Nie mam dostępu do żadnego układu testowego, ale na symulatorze działa to bardzo ładnie.
    Dim K As Byte
    Do
    K = Waitkey()
    Lcd Chr(k);
    Loop Until K = 13
    End

    Oczywiście istnieje możliwość, że jak nic nie dostaniesz z powrotem, to ta pętla zamieni się w nieskończoną.
  • #9 7049601
    karolczyzycki
    Poziom 20  
    Do
    A = Waitkey(#2)
    B = Waitkey(#2)
    C = Waitkey(#2)
    D = Waitkey(#2)
    E = Waitkey(#2)
    F = Waitkey(#2)
    G = Waitkey(#2)
    H = Waitkey(#2)
    I = Waitkey(#2)
    J = Waitkey(#2)
    
    N = Chr(a) + Chr(b) + Chr(c) + Chr(d) + Chr(e) + Chr(f) + Chr(g) + Chr(h) + Chr(i) + Chr(j)
    Lcd N
    Loop
     End

    Można taki kod zastąpić jakąś komendą, któa przypisuje kolejno odebrane znaki do stringa?
  • REKLAMA
  • #10 7108166
    levi_pl
    Poziom 11  
    karolczyzycki napisał:

    [...]
    nie wiem co wysyła na końcu.
    W transmisji to komputer wysyła CR
    Nie bardzo to rozumiem...


    Ze specyfikacji wynika że w odpowiedzi nie dostajesz na końcu znaku CR.
    Wg. specyfikacji ASCII CR to szesnastkowa wartość 0x0D.

    Aby sprawdzić do dostajesz w odpowiedzi to po wysłaniu kodu zrób pętlę, która odbierze ileśtam znaków i wyświetli każdy w następnym polu wyświetlacza. Lepiej jednak napisać procedurę podpiętą pod przerwanie , która zrobi to sama i nie zablokuje głównego kodu programu jeśli nic nie dostaniesz w odpowiedzi.

    Najlepiej jednak gdybyś zaprogramował to porządnie tzn:

    - zadeklarował odpowiednio duży bufor aby móć odebrać najdłuższą odpowiedź
    - zadeklarował drugi bufor do przechowywania całkowicie odebranej wiadomości
    -zadeklarował zmienną - flagę oznaczającą gotową do analizy odpowiedź
    - stworzył procedurę obsługi przerwania, która:
    * wpisywałaby do bufora poszczególne bajty odbierane przez rs
    * na podstawie warunków określała czy odpowiedź, która jest odbierana jest już kompletna, sprawdzała flagę, kopiowała wiadomość do drugiego bufora i przestawiała flagę

    Z obrazka wynika że na końcu odpowiedzi zawsze ląduje znak 'x' = 0x78

    *musi też sprawdzać czy nie przepełnił się bufor, etc
    - w kodzie głównym w pętli sprawdzałbym flagę i jeśli jest ustawiona to analizowałbym komunikat wykonywał akcję (wyświetlenie komunikatu) i kasował flagę.

    Oczywiście procedurę da się uprościć jeśli poczynisz pewne założenia.

    Niestety jestem niekompatybilny z BASCOMem więc przykładowego kodu nie jestem w stanie napisać.
REKLAMA