LIN BUS MONITOR/SLAVE z AVRX albo XTINY

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1221
Rejestracja: 17 sie 2015, 12:13
Kontakt:

LIN BUS MONITOR/SLAVE z AVRX albo XTINY

Post autor: niveasoft » 27 wrz 2022, 18:07

Jeśli ktoś ma Addon do Xtiny to może się pobawić.
Napisałem sobie monitor sieci LIN który może też pracować jako SLAVE.
Ramka LIN wygląda tak, że na początku nadawane jest 13 bitów o wartości zero i to normalnie w UART jest ciężko obsłużyć bo to jest typowy błąd (za długo stan niski).
Jednak w procesorach Xtiny i AVRX do UARTu dodano tryb LINAUTO który sam to sprzetowo obługuje.
Można więc podsłuchac swoje autko (nie wszędzie jest CAN) lub nawet coś sobie z tego zbudować.

W załączniku opis który stworzyłem na potrzeby forum MCS więc po angielsku. W razie pytań można pisac ;)
  1. $regfile = "AVRX128db32.dat"                                          'FLASH 128KB | SRAM 16KB | EEPROM 512B | USER 32B
  2. $crystal = 24000000                                                   '1xTCA|3xTCB|1xTCD
  3. $hwstack = 64
  4. $swstack = 40
  5. $framesize = 128
  6.  
  7. '############################################
  8. '#  LIN MONITOR/SLAVE with AVRX or XTINY    #
  9. '#            by BARTek EDC                 #
  10. '#         www.bart-projects.pl             #
  11. '#       bartek.niveasoft@gmail.com         #
  12. '############################################
  13. '       BASCOM 2085 with Xtiny Addon
  14.  
  15. Debug On
  16.  
  17. $projecttime = 507
  18.  
  19. Config Vregpwr = Auto
  20.  
  21. Config Osc = Enabled , Frequency = 24mhz
  22.  
  23. Config Sysclock = Int_osc , Prescale = 1
  24.  
  25. Config Submode = New
  26.  
  27.  
  28. '*******************************************************
  29. '*                CONSTANS SETTINGS                    *
  30. '*******************************************************
  31.  
  32.   Const Lin_baud = 19200
  33.  
  34.   '2x time for one byte at given baudrate (not next byte means end)
  35.   Const Fr_timeout = _xtal /(lin_baud / 8) * 2                        ' (lin_baud/8)=Bytes\s
  36.  
  37.   Const Only_answered = 1
  38. '*******************************************************
  39. '*                   I/O CONFIG                        *
  40. '*******************************************************
  41.  
  42.   Config Porta.3 = Output : Led Alias Porta.3
  43.  
  44. '-------- TQFP32 ------------- ALTERNATIVE-
  45. 'COM1 TXD-PA0-30, RXD-PA1-31 (PA4-26/PA5-27)
  46. 'COM2 TXD-PC0-6 , RXD-PC1-7  (  NO REMAP   )
  47. 'COM3 TXD-PF0-20, RXD-PF1-21 (PF4-24/PF5-25)
  48.  
  49. '*******************************************************
  50. '*      CONFIG COM1 BUFFERED USART FOR LIN             *  'COM1 TXD-PA0-30, RXD-PA1-31 (PA4-26/PA5-27)
  51. '*******************************************************
  52. Config Com1 = Lin_baud , Mode = Asynchroneous , Parity = None , Databits = 8 , Stopbits = 1
  53.  Open "COM1:" For Binary As #1
  54.   Config Serialin0 = Buffered , Size = 100 , Bytematch = All
  55.    Const Lin = 1
  56.     Config Porta.2 = Output : Lin_en Alias Porta.2 : Set Lin_en       'enables L9631 transceiver
  57. '*******************************************************
  58. '*      CONFIG COM2 BUFFERED USART FOR PC              *  'COM2 TXD-PC0-6 , RXD-PC1-7  (PC4-14/PC5-17)
  59. '*******************************************************
  60.  Config Com2 = 115200 , Mode = Asynchroneous , Parity = None , Databits = 8 , Stopbits = 1
  61.   Open "COM2:" For Binary As #2
  62.    Config Serialin1 = Buffered , Size = 100
  63.     Const Usb = 2
  64. '*******************************************************
  65. '*          TIMER SETTINGS FOR TIME BASE               *
  66. '*******************************************************
  67.   Config Tca0 = Normal , Prescale = 8 , Run = On
  68.    Tca0_per = 29999                                                   '10ms @24MHz/8
  69. '*******************************************************
  70. '*          TIMER SETTINGS FOR LIN TIMEOUT             *
  71. '*******************************************************
  72.   Config Tcb0 = Periodic_int , Run = On , Prescale = Off
  73.    Tcb0_ccmp = Fr_timeout
  74.     Enable Tcb0_capt
  75.      On Tcb0_capt Tcb0_isr Nosave
  76.      Config Portd.6 = Output : Pulse Alias Portd.6
  77. '*******************************************************
  78. '*             MULTIPURPOSE VARIABLES                  *
  79. '*******************************************************
  80.   Dim Helpb As Byte , N As Byte
  81.   Dim Helpw As Word
  82.   Dim Runonce As Byte
  83. '*******************************************************
  84. '*                PROGRAM VARIABLES                    *
  85. '*******************************************************
  86.  'time
  87.  Dim Miliseconds As Byte
  88.  'programm
  89.  Dim Char As Byte
  90.  Dim Tflag As Byte
  91.  Dim Raw_buff(10) As Byte , Idx As Byte
  92.  Dim Id As Byte , Parity As Byte , Chck As Byte , Bcnt As Byte
  93. '*******************************************************
  94. '*                  ERAM VARIABLES                     *
  95. '*******************************************************
  96.  
  97. '*******************************************************
  98. '*                   PROGRAM SUB`s                     *
  99. '*******************************************************
  100.    Const Mian = _xtal * 64                                            'freq shifted left 6 bits (datasheet formula)
  101.  
  102. Function Calc_2x_speed_baud(byval New_baud As Dword)as Word
  103.   Local Tmian As Dword
  104.   Local Result As Word
  105.   Shift New_baud , Left , 3                                           'multiply by 8 samples per bit
  106.   Tmian = Mian / New_baud
  107.   Result = Tmian                                                      'cast
  108.   'Debug #usb , "2xSpeed BAUDH=" ; Hex(high(result)) ; " BAUDL=" ; Hex(low(result))
  109.   Calc_2x_speed_baud = Result
  110. End Function
  111.  
  112. Function Calc_normal_speed_baud(byval New_baud As Dword)as Word
  113.   Local Tmian As Dword
  114.   Local Result As Word
  115.   Shift New_baud , Left , 4                                           'multiply by 16 samples per bit
  116.   Tmian = Mian / New_baud
  117.   Result = Tmian                                                      'cast
  118.   'Debug #usb , "Normal BAUDH=" ; Hex(high(result)) ; " BAUDL=" ; Hex(low(result))
  119.   Calc_normal_speed_baud = Result
  120. End Function
  121.  
  122. Sub Enable_linauto
  123.  Debug #usb , "->Reconfiguring USART..."
  124.  Debug #usb , "Actual USART0_CTRLB  &B" ; Bin(usart0_ctrlb)           'RXEN,TXEN,U2X
  125.  Debug #usb , "@" ; Lin_baud ; " ACTUAL USART0_BAUD=&H" ; Hex(usart0_baud)
  126.   Helpb = Usart0_ctrlb And &B1111_1001
  127.  'Helpb = Helpb Or Bits(usart_rxmode1_bp)                          'GENAUTO
  128.   Helpb = Helpb Or Bits(usart_rxmode1_bp , Usart_rxmode0_bp)          'LINAUTO
  129.   Usart0_ctrlb = Helpb
  130.  Usart0_ctrld = Bits(usart_abw1_bp , Usart_abw0_bp)                   '25% tolerance
  131.  Debug #usb , "New USART0_CTRLB  &B" ; Bin(usart0_ctrlb)              'RXEN,TXEN,U2X
  132.   Usart0_baud = Calc_normal_speed_baud(lin_baud)
  133.  Debug #usb , "@" ; Lin_baud ; " NORMAL USART0_BAUD=&H" ; Hex(usart0_baud)
  134. End Sub
  135.  
  136. '################# START ################
  137.  
  138.  
  139. Debug #usb , "{010}Program started"
  140.  
  141.  
  142.  Call Enable_linauto()
  143.  
  144. Enable Interrupts
  145.  
  146. Do
  147.  
  148. '-[10ms]-
  149.  If Tca0_intflags.tca_single_ovf_bp = 1 Then
  150.   Tca0_intflags.tca_single_ovf_bp = 1
  151.  
  152.   If Miliseconds < 49 Then
  153.    Incr Miliseconds
  154.   Else
  155.    Miliseconds = 0
  156.  
  157.     Toggle Led
  158.   End If
  159.  
  160.  
  161.  End If
  162.  
  163.  If Tflag = 1 Then
  164.    If Ischarwaiting(#lin) > 0 Then
  165.     Idx = 0
  166.      Do
  167.       If Idx < 10 Then
  168.        Incr Idx : Raw_buff(idx) = Inkey(#lin)
  169.       End If
  170.      Loop Until Ischarwaiting(#lin) = 0
  171.  
  172.      Id = Raw_buff(1) And &B0011_1111
  173.      Parity = Raw_buff(1)
  174.      Shift Parity , Right , 6                                         'only two most significant bits
  175.  
  176.      #if Only_answered = 1
  177.        If Idx > 2 Then                                                'filter for terminal
  178.      #endif
  179.  
  180.         Print #usb , "ID=" ; Hex(id) ; "    ";                        '" P" ; Parity ;
  181.  
  182.         If Idx > 2 Then
  183.          Bcnt = Idx - 1                                               ' -CRC
  184.          For N = 2 To 9
  185.           If N <= Bcnt Then
  186.            Print #usb , Hex(raw_buff(n)) ; " ";                       'two hex chars and space
  187.           Else                                                        'equal columns
  188.            Print #usb , "   " ;                                       'two hex chars and space
  189.           End If
  190.          Next N
  191.          Decr Bcnt
  192.          Print #usb , "Len " ; Bcnt ; "  CRC=" ; Hex(raw_buff(idx))
  193.         Else
  194.          Print #usb , " No Answear!"
  195.         End If
  196.  
  197.      #if Only_answered = 1
  198.        End If
  199.      #endif
  200.  
  201.    End If
  202.   Tflag = 0
  203.  End If
  204.  
  205. Loop
  206.  
  207. Serial0bytereceived:
  208.  Pushall
  209.  Set Pulse
  210.  Tcb0_cnt = 0                                                         'prelonge timeout
  211.  Tcb0_ctrla.tcb_enable_bp = 1                                         'Start Timer
  212.  Popall
  213. Return
  214.  
  215. Tcb0_isr:
  216.  Reset Pulse
  217.  Tcb0_ctrla.tcb_enable_bp = 0                                         'Stop Timer
  218.  Tcb0_intflags.tcb_capt_bp = 1                                        'reset INT flag
  219.   Tflag = 1
  220. Return
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ODPOWIEDZ