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

[ATTiny][Bascom] Wysyłanie i odbieranie pojedynczych bajtów

tzok 17 Mar 2010 20:24 2292 2
REKLAMA
  • #1 7844205
    tzok
    Moderator Samochody
    Potrzebuję napisać program na ATTiny2313 który emulowałby centralkę IAW 16F - chodzi o sam protokół komunikacyjny. Nie potrafię jednak w BASCOMie zrobić tak prostej rzeczy jak wysyłanie/odbiór pojedynczych bajtów (znalazłem tylko print).

    Cały program ma działać następująco:
    inicjuje UART na 1200bps i wysyła kod ISO (6 bajtów), a następnie czeka na sekwencję bajtów 0F-AA-CC, gdy ją otrzyma przełącza prędkość transmisji na 7812bps i oczekuje na pojedynczy bajt. Gdy otrzyma bajt (00h - FFh) odsyła jeden bajt odpowiedzi i czeka na kolejny bajt zapytania... i tak w nieskończoność.
  • REKLAMA
  • Pomocny post
    #2 7844215
    Konto nie istnieje
    Poziom 1  
  • #3 7844994
    tzok
    Moderator Samochody
    Dzięki, napisałem coś takiego:
    ' WEBER-MARELLI IAW 16F Diagnostic Protocol Simulator
    ' (c) 2010 by Tomasz Orczyk
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $baud = 1200
    
    Dim Init As Bit                                             ' Init complete
    Dim Iso(6) As Byte                                          ' ECU ISO Code
    Dim Diag(3) As Byte                                         ' Diagnostic init sequence
    Dim Req As Byte                                             ' Request byte
    Dim Resp As Byte                                            ' Response byte
    Dim Buff(3) As Byte                                         ' Response buffer
    Dim I As Byte
    
    Restore Isod
    For I = 1 To 6
       Read Iso(i)
    Next I
    
    Restore Diagd
    For I = 1 To 3
       Read Diag(i)
    Next I
    
    ' Send ISO sequence
    Printbin Iso(1)
    
    Waitms 500
    
    Do
       ' wait until receive 0F-AA-CC sequence
       Init = 1
       Inputbin Buff(1) , 3
       For I = 1 To 3
          If Buff(i) <> Diag(i) Then Init = 0
       Next I
    Loop Until Init = 1
    
    ' UBRR = 63, U2X = 0
    Baud = 7812.5
    
    Do
       ' wait for query and respond
       Inputbin Req
       Resp = Lookup(req , Respd)
       Printbin Resp
    Loop
    
    End
    
    Isod:
    Data &H55 , &HD0 , &H85 , &H00 , &H00 , &H00
    
    Diagd:
    Data &H0F , &HAA , &HCC
    
    ' Responses for diagnostic codes - 00h - 3Bh
    Respd:
    Data 000 , 000 , 000 , 000 , 000 , 000 , 250 , 062 , 062 , 007
    Data 230 , 000 , 000 , 002 , 002 , 127 , 000 , 000 , 000 , 000
    Data 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000
    Data 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000
    Data 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000
    Data 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000 , 000


    Kod jest poprawny, program działa.
    Sprawdziłem z oprogramowaniem diagnostycznym do FIATa i udaje się nawiązać połączenie oraz są prawidłowo odczytywane parametry "Live Data" :)
    Jedyny problem na jaki się natknąłem, to gdy podłączałem procesor przez przejściówkę na USB, to po przełączeniu prędkości na 7680bps leciały "krzaki", po podłączeniu do fizycznego portu RS-232 wszystko zaczęło działać.
REKLAMA