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

[atmega16][bascom] Komunikacja UART

Snikers 12 Paź 2009 20:53 3617 11
REKLAMA
  • #1 7120659
    Snikers
    Poziom 24  
    Chciałem nawiązać komunikacje z urządzeniem, podszywając się pod przetwornicę. Posiadam listę komend i zapytań jakie obsługuje przetwornica. Jednak sprzęt wysyła do "przetwornicy" tylko komendę 3F [hex] (na wyświetlaczu jako 62 [dec], co oznacza "Enable Communication"). Powinienem na nią odpowiedzieć tym samym i chyba to robię, jednak sprzęt tego nie rozpoznaje, bo ciągle powtarza komendę. Nie mam rejestratora/oscyloskopu żeby sprawdzić jak odpowiada mój układ. Zamieszczam kod. Czy na TX wychodzi jest taki sam przebieg jaki przyszedł na RX?

    $regfile = "m16def.dat"
    $crystal = 7372800
    $baud = 9600
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portc.6
    Config Lcd = 16 * 4
    Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Echo Off
    Dim Akey As Byte
    Cls
    
    Do
    Akey = Waitkey()
    Locate 1 , 1
    Lcd "    "
    Locate 1 , 1
    Lcd Akey
    Print Akey
    Loop
    End

    Próbowałem też z Echo On, bez skutku.

    Elektrycznie jest wszystko OK, wzorowałem się na oryginalnym układzie przetwornicy którą steruje ATMEGA8 też przez UART.
  • REKLAMA
  • #2 7120781
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7120838
    mirekk36
    Poziom 42  
    Jeśli twój układ (przetwornicy) wysyła dokładnie tylko jeden bajt bez żadnego dodatkowego znaku końca linii typu CRLF

    to ty na pewno w tym kodzie nie odsyłasz dokładnie tego samego bajtu, ty odsyłasz ten bajt + znacznik końca linii CRLF (czyli jeszcze dwa dodatkowe bajty końca linii CR i LF)

    a wystarczy tylko napisać tak:

    PRINT Akey ;

    czyli podać na końcu średnik i wtedy Bascom nie wyśle CRLF tylko ten jeden dokładnie bajt

    teraz jaśniej ?
  • REKLAMA
  • #4 7120895
    Konto nie istnieje
    Poziom 1  
  • #5 7121078
    Snikers
    Poziom 24  
    Średnik nie za bardzo działa w moim wypadku, natomiast w manualu przetwornicy mam przebieg z początku komunikacji, czyli &H3F.
    [atmega16][bascom] Komunikacja UART
    zielony to odpowiedz przetwornicy, czarny to komenda urządzenia.

    Inputbin mi się nie kompiluje, doczytam w helpie, może ruszy.
    Ramka wygląda tak:
    [atmega16][bascom] Komunikacja UART

    Przetwornica powinna reagować:
    Komende => echem
    Zapytanie => echo + odpowiedz

    ====edit

    Ruszyło dostałem nową komende :)
  • REKLAMA
  • Pomocny post
    #6 7121191
    mirekk36
    Poziom 42  
    atom1477 napisał:
    Ale PRINT mimo wszysko skonwertuje zmienną na postać textową.
    To musi być PRINTBIN.


    ale co to wg ciebie znaczy, że skonwertuje zmienną na postać tekstową - może ja czegoś nie rozumiem.

    Przecież obojętnie czy napiszę tak:



    czy tak:



    czy tak:

    PRINT chr(65) ;


    to zawsze zostanie przesłany ten sam - jeden bajt o wartości 65 (dziesiętnie)

    jeśli moja zmienna będzie zdeklarowana tak

    Dim Abyte as Byte


    to jeśli wyślę tak:

    PRINT Abyte ;


    to nadal zostanie wysłany tylko jeden bajt o wartości 65 (dziesiętnie)

    więc o jakiej konwersji na tekst piszesz?

    Dodano po 6 [minuty]:

    Snikers --> a na pewno dobrze ustawiłeś parametry transmisji? mógłbyś pokazać kawałek(fragment) noty gdzie jest mowa o całym sposobie komunikacji? komendach itp ???
  • Pomocny post
    #7 7121271
    Konto nie istnieje
    Poziom 1  
  • #8 7121394
    Snikers
    Poziom 24  
    Teraz mam kolejny problem bo dostaje odpowiedzi których nie mam w manualu, może ramka się "źle" zapełnia?

    Kod wygląda tak:
    $regfile = "m16def.dat"
    $crystal = 7372800
    $baud = 9600
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portc.6
    Config Lcd = 16 * 4
    Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Echo Off
    Dim A As Byte
    Dim D As Byte
    Cls
    D = 1
    
    Do
    
      Inputbin A, 8
      If A = 62 Then Printbin A
    Locate 1 , D
    Lcd "    "
    Locate 1 , D
    Lcd A
    D = D + 4
    If D = 31 Then D = 1
    Loop
    End


    Obsługa LCD jest tymczasowa bo nie mam innego podglądu portu. Dodaje jeszcze zlepek z manuala.
    [atmega16][bascom] Komunikacja UART
  • Pomocny post
    #9 7121726
    Konto nie istnieje
    Poziom 1  
  • #10 7122233
    Snikers
    Poziom 24  
    Tak, 70h, ale przy opisie "Hardware Protocol" w dziale "Example of a single Byte command" jest ten oscylogram co wyżej i opis:
    Cytat:
    The command transmitted from the projector is an “Enable Communication” command, in this example by
    means of the command byte “3Eh”. The binary conversion of “3Eh” is 00111110, represented by the last
    signal in the figure above and with an enlarged scale in the first position: please note that the first bit, D0,
    is the least significant one.


    FuseBity ustawiłem na Low:0xEF High:0xD9 więc chyba jest dobrze.
    Wszystkie ustawienia są w tabeli, którą załączyłem 9600 Even 8bit 1bitstop 1bitstart. Może to o ten bitstartu chodzi? ale wtedy bym nie otrzymał tego 0x3E

    ====edit

    Poprawiłem wyświetlanie na LCD:
    otrzymuje 62d, odpowiadam tym samym, otrzymuje 3 ramki "na raz" 130d, 0d, 197d, i po chwili to samo. W manualu nie ma tej komendy więc nie wiem jak odpowiedzieć.

    Może załączę manual:
  • #11 7135910
    xury
    Specjalista automatyka domowa
    Ostatnio podobny temat był i się okazało, że po drodze był konwerter napięć. A autor się go tam nie spodziewał. Być może i tak jest w tym przypadku ?
    Co do komendy "Enable Communication" to wg mnie to też 70h.
    Ja bym na początek popróbował z przykladami ze stony nr 19 i 20.
  • #12 7136911
    Snikers
    Poziom 24  
    konwerterów nie ma. Całość jest separowana optotriakami, TX kontrolera jest podpięty przez opornik do portu, natomiast RX przez darlingtona za emiterem.

    Ogólnie już opanowałem. Na 62 odpowiadam 62, otrzymuje 130, 0, 197, odpowiadam 130, i otrzymuje "nastawy" jasności lampy, odpowiadam potwierdzeniem tylko, niezależnie od wartości i jest OK. Co ciekawe jasność lampy jest zależna od treści obrazu. Wartości odpowiedzi nie znalazłem w manualu, podstawiałem "na pałę" aż zaskoczy
REKLAMA