Ребят есть такой вопрос. Имеется автомобиль ваз 2112 и ЭБУ январь 7.2+. Хочу собрать бортовой компьютер в панель приборов на atmega 32. общатся будут по к-линии по протоколу kwp2000. Программу пытаюсь писать на bascom avr. На сайте есть БК с дисплеем от сименса, но я в моем городке не смог найти такой телефон. Облазил все мастерские по ремонту телефонов. Там есть исходники на С, но я в С я не разбираюсь, хотел бы выводить данные на дисплее 1602 (можно и 0802) нашел исходники в просторах интернета в Bascom. Но по этому коду не хочет подключаться. Адаптер к-линии сделан на LM193.
Вставляю код:
$regfile = "m128def.dat"
'$crystal = 16000000
$crystal = 8000000
$hwstack = 512
$swstack = 512
$framesize = 512
$baud = 10400
' объявы порта
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 255 ', Bytematch = All
Declare Sub Ecu_data
Config Pinf.0 = Input
Config Pinf.1 = Input
Config Timer2 = Timer , Prescale = 8
On Ovf2 Tim2_isr
Enable Interrupts
' переменные работы мотора
Dim Temp As Byte
Dim Alf As Single
Dim Throttle As Byte
Dim Frx As Byte
Dim Wfrx As Byte
Dim Acc As Single
Dim Tinj As Single
Dim Tinjcorr As Single
Dim Rpm As Word
Dim Frpm As Word
Dim Wrpm As Word
Dim Uoz As Word
Dim Spd As Byte
' till here
' байт смещения данных в буфере от заголовка
Dim Ex As Byte
' доп.счёчики на таймере, пока без имян
Dim E_cntr1 As Word
Dim E_cntr2 As Word
Dim E_cntr3 As Word
Dim E_cntr4 As Word
Dim E_cntr5 As Byte
Dim Ecu_mode As Byte
'0 - очистка
'1 - тупняк
'2 - соединяемся
'3 - соединились
' режим чтения из ЭБУ
Dim Readmode As Byte
'0 - запрос характеристики работы
'1 - чтение ответа характеристики работы
'2 - запрос ошибок
'3 - чтение ошибок
Dim Recieved_data As Bit
Enable Timer2
Start Timer2
Do
'Incr Counter_z
' режим 0 - посылка разрыва связи, резерв, борьюа с глюками и отваливаниями связи
If Ecu_mode = 0 Then
If E_cntr2 => 3000 Then
Gosub _spc
E_cntr2 = 0
Ecu_mode = 1
' Readmode = 1
End If
End If
' режим 1 - посыл старткомма
If Ecu_mode = 1 Then
If E_cntr2 => 3000 Then
Gosub _stc
E_cntr2 = 0
' Ecu_mode = 1
' Readmode = 1
End If
End If
' опрос принятого
If E_cntr2 => 1000 Then
Recieved_data = 0
Call Ecu_data
End If
' если связь установлена
If Ecu_mode = 2 Then
' запросы 1 - перменные, 2 - ошибки, 3 - запрос сброса ошибок
If E_cntr1 >= 1000 Then
'If E_cntr1 >= 1500 Then
Clear Serialin
Select Case Readmode
Case 0
Case 1
Gosub _rdbli
Case 2
Gosub _rdtcbs
Case 3
Gosub _cdi
End Select
E_cntr1 = 0
E_cntr2 = 0
End If
End If
' кнопка переключение режимов чтения
If Pind.7 = 1 Then
Waitms 500
If Pind.7 = 1 Then
Incr Readmode
If Readmode > 3 Then Readmode = 1
End If
End If
Loop
Conversion:
' DOC +4
' ex - длина запроса, задаётся при посылке запроса
' температура
' толкаем в переменные то, что вычитали из буфера с положительным ответом по
Temp = _rs232inbuf0(ex + 15) - 40
' Е2 - соотношение воздух/топливо, Р83 - коэфф. коррекции CO
Alf = _rs232inbuf0(ex + 16)
Alf = Alf + 128
Alf = Alf * 14.7
Alf = Alf / 256
' дроссель
Throttle = _rs232inbuf0(ex + 17)
' положение РХХ
Frx = _rs232inbuf0(ex + 20)
' желаемое положение РХХ
Wfrx = _rs232inbuf0(ex + 21)
' напряжение бортсети
Acc = _rs232inbuf0(ex + 25) * 0.05
Acc = Acc + 5.2
' коэффициент коррекции времени впрыска
Tinjcorr = _rs232inbuf0(ex + 22) + 128
Tinjcorr = Tinjcorr / 256
' обороты
Rpm = _rs232inbuf0(ex + 18) * 40
' обороты на холостом ходу
Frpm = _rs232inbuf0(ex + 19) * 10
' желаемые обороты ХХ
Wrpm = _rs232inbuf0(ex + 26) * 10
' угол опережения зажигания
Uoz = _rs232inbuf0(ex + 23) / 2
' скорость
Spd = _rs232inbuf0(ex + 24)
' время впрыска
Tinj = _rs232inbuf0(ex + 29) ' * 256
'Tinj = Tinj + _rs232inbuf0(ex + 29)
Return
Sub Ecu_data:
If _rs232inbuf0(ex + 4) = &HC1 Then ' если ответ C1 - То подключились
Locate 1 , 1
Lcd "CN"
Ecu_mode = 2
Clear Serialin
Recieved_data = 1
Readmode = 1
End If
If _rs232inbuf0(ex + 5) = &H61 Then ' если ответ 61 - То данные по переменным пошли
Locate 1 , 1
Lcd "RD"
' Ecu_mode = 1
Gosub Conversion
Recieved_data = 1 '
Clear Serialin
End If
If _rs232inbuf0(ex + 4) = &H58 Then ' если ответ 58 - То данные по ошибкам пошли
Locate 1 , 1
Lcd "RE"
' Ecu_mode = 1
Recieved_data = 1
Clear Serialin
End If
If _rs232inbuf0(ex + 4) = &H54 Then ' если ответ 54 - То ошибки сброшены
Locate 1 , 1
Lcd "CE"
Readmode = 1
Recieved_data = 1
Clear Serialin
End If
If _rs232inbuf0(ex + 4) = &H7F Then ' если ответ 78 - То отказ, будем рестартить
Locate 1 , 1
Lcd "ER"
' Ecu_mode = 0
' Readmode = 0
Recieved_data = 1
Clear Serialin
End If
If Recieved_data = 0 Then
Locate 1 , 1
Lcd "Data0"
E_cntr1 = 0
Ecu_mode = 0
Clear Serialin
End If
End Sub
' чтение ошибок
' 88 F1 10 58 02 04 43 E0 14 26 E0 24
' 02 - количество, E0 - разделители
_rdtcbs:
Ex = 8
Printbin &H84
Printbin &H10
Printbin &HF1
Printbin &H18
Printbin &H00
Printbin &H00
Printbin &H00
Printbin &H9D
Return
' старткомм
_stc:
' ответ на стартком 83 F1 10 C1 6B 8F 3F
Ex = 5
Printbin &H81
Printbin &H10
Printbin &HF1
Printbin &H81
Printbin &H03
Return
' стопкомм
_spc:
'Ответ на стопком 81 F1 10 C2 44 / C2 = 7F - отказ
Ex = 5
Printbin &H81
Printbin &H10
Printbin &HF1
Printbin &H82
Printbin &H04
Return
' переменные работы мотора
' 80 f1 10 24
_rdbli:
Ex = 6
Printbin &H82
Printbin &H10
Printbin &HF1
Printbin &H21
Printbin &H01
Printbin &HA5
Return
' сброс ошибок
_cdi:
Ex = 7
Printbin &H83
Printbin &H10
Printbin &HF1
Printbin &H14
Printbin &H00
Printbin &H00
Printbin &H98
Return
Tim2_isr:
Portg.1 = Not Portg.1
Portg.1 = Not Portg.1
Incr E_cntr1
Incr E_cntr2
Incr E_cntr3
Incr E_cntr4
Incr E_cntr5
Return
Обмен БК (бортового компьютера ,ноутбука AVR-контроллера и проч.) начинается так см картинку
startCommunication БК startCommunication ЭБУ
__________>300mC___________ <------25mC------------><-------25mc---------> _______________ ___
|____________________| ||||||||||| |||||||||||||
Интервары 25мС с точностью +-1мс !
После подключения к диагностической линии (у меня раз'ем ODB-II) надо выждать не менее 0.3 сек
потом подать "0"-на 25мС потом "1"-на 25мС и тут-же (+-1мС) такую посылку HEX кодов ----> 81 10 f1 81 03
которая означает СООБЩЕНИЕ начала соединения с ЭБУ "startCommunication".
Эбу в ответ присылает свое СООБЩЕНИЕ (у меня такое)---> 83 f1 10 c1 6b 8f 3f -называется положительный ответ
Подкорректировав код под Дисплей1602 выводил данные ecudata выводит Data0, мне кажется что чтото с таймерами не так, вместо таймеров вставлял waitms10, то БК то подключается, то нет, т.е. работает с перебоями.
Заранее спасибо, кому не сложно было взглянуть на код