Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Бортовой комп через K-line....


Бортовой комп через K-line....

Сообщений 31 страница 47 из 47

31

Ну да, ты же коды в порт кидаешь, вот их ASCII в симуляции и видишь.
10400 выставляется без проблем:
Config Com1 = 10400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

0

32

Хорошо.
Допустим я передал PRINTBINом 82 10 F1 21 01 A5 (запрос параметров) в ответ мне пришло 80 F1 10 26 61 01 3B…… бла бла бла , как мне собрать то что пришло , INPUTBINом или INPUTа хватит?

0

33

Здравствуйте всем. А на индикатор для модинга приборной доски в идеале бы выводить не толко обороты но и скорость и температуру. Останется только уровень топлива например как здесь  http://www.club.azlk.ru/index.php3?mode … p;id=55565  получилась бы прекрасная альтернатива дорогим платным приборкам , для тех кто умеет паять.

0

34

доброго времени суток ! объяснити пожалуста как получить данные inputbin-ом,ответ эбу по длине на разные запросы разный...

0

35

Доброго времени суток!
Вторые сутки не сплю :) может кто подскажет как на C# реализовать:
исходя из того что ТxD это PORTА.1
porta.1 = 1
waitms 300
porta.1 = 0
waitms 25
porta.1 = 0
waitms 25

Адаптер спаял, проверил, рабочий.
Сторонняя программа (ECU Editor) работает. Ошибки сбрасывает, картинку показывает :)
Надо дальше двигаться  :)  а я застрял :(
Не обязательно на С# можно на C подобном языке. Или на ассемблере.
Заранее спасибо!!!!!!

Отредактировано Panda (2014-03-10 18:01:34)

0

36

Panda написал(а):

Вторые сутки не сплю  может кто подскажет как на C# реализовать:

Это вопрос к Radan

Чего не на Bascom?

Отредактировано sasha_1973 (2014-03-11 07:43:43)

0

37

Panda написал(а):

Вторые сутки не сплю  может кто подскажет как на C# реализовать:
исходя из того что ТxD это PORTА.1

Как то так.

Код:
#include <avr/io.h>
#include <util/delay.h>

#define PORT_A       PORTA
#define DDR_A         DDRA
#define BIT_A           (1<<PA1)

int main(void)
{
    DDRA |= BIT_A;
    while (1) 
	{
               PORT_A ^= BIT_A; 
_delay_ms(300);
               PORT_A ^= BIT_A; 
_delay_ms(50);
    }
}

Отредактировано sva-don (2014-03-11 09:32:20)

0

38

Не пойму я, каким боком C# относится к внутреннему коду микроконтроллера?

0

39

и к сайту/бэйсику

0

40

Прошу прощение, если не туда написал.
И в мыслях не было обидеть коллег пишущих на бэйсик :)
Это единственное место в инете, где упоминается что на TxD необходимо перед StartComunication подать такие сигналы.
Осциллограф тоже это показал.
Подумал, что все мы люди..... как то так :-)
Спасибо за ответ, буду пробовать с этой стороны.

0

41

Давайте более полную информацию.
У вас есть программа на C#, с помощью которой вы хотите общаться с контроллером?
И для начала вам нужно подать определённую логику на TxD, чтобы он вошёл в режим?

0

42

Главное надо понять, какие сигналы получить, а на каком языке дальше писать - вторично. По этому изначально возник вопрос о "некорректности" подхода к ресурсу. ;)

0

43

Давайте более полную информацию.
У вас есть программа на C#, с помощью которой вы хотите общаться с контроллером?


Собрал K-line адаптер на микросхеме FT232RL
Проверил, подключил к диагностическому разъему своего мотоцикла. Подключил осциллограф, Запустил программу ECUEditor.
Наблюдаю картину, перед тем как отправить последовательность байт 81 10 f1 81 03 это приложение выставляет 0 на 25 м.с., потом 1-у на 25 мс., и только потом последовательность на коммуникацию.
Начал разбираться и попал к вам :-)

И для начала вам нужно подать определённую логику на TxD, чтобы он вошёл в режим?


Да, именно так.

Споткнулся на том что. Общение организовал через виртуальный com порт
port4 = new SerialPort(myPortSelect, 10400, Parity.None, 8, StopBits.One);
port4.Write(data_write, 0, data_write.Length);

Так вот, если просто послать 0 как байт, а потом sleep на 25 мс, то на TxD наблюдаю именно передачу байта т.е _____--_____

Как заставить сигнал продержаться 25 мс не понимаю пока.
Подозреваю что проблема в стоповом бите. Вот изучаю потихоньку вопрос......
Прежде чем к адаптеру K-Line, прикрутить AVR (это в планах), мне необходимо разобраться в сути вопроса, на простом примере.

Еще раз извините, если не в той ветке.

Отредактировано Panda (2014-03-11 13:17:38)

0

44

Попробуйте напрямую дёргать TxD, не используя Write.
Я думаю это можно сделать через любую библиотеку для управления портами IO, предварительно узнав адрес TxD.
А уже затем предавать данные с помощью Write.

0

45

Кто может поделится рабочим исходным кодом инициалзации, обмена данными по k-line?

0

46

ECUtest написал(а):

Кто может поделится рабочим исходным кодом инициалзации, обмена данными по k-line?

тебе для какого авто надо-то?
есть куски экспериментов с ВАЗовским KWP-2000, алгоритм такой: шлём статком, ждём ответ, нету - повторяем через определённое время. если ошибка - посылаем разрыв связи и повторяем попытку соединиться. если есть положительный ответ - посылаем rli ass, читаем переменные методом выколупывания нужных байтов из буфера, после этого чистим буфер и повторяем запрос. контрольную сумму тут не считал, код пробный.  время между попытками по таймеру, ибо проц в реальном времени занимается графикой, задержками делать нельзя. куча переменных нарастающих по таймеру E_cntr  это скажем так - универсальные "счётчики". код - бардак, но в сути разобраться можно. исходник комбинации приборов пока выкладывать не буду, ибо проект пока что коммерческий )

из интересного - адов древний ВОШЬ 1.5.4 вывозит практически любую наглость во временных пределах, отвечает на команды через 100мс после предыдущей, инициализация тупо "статком", никаких закидонов с 0-1 перед инитом ему не надо. января под руками сейчас нету. протокол тут Е2, у Е3 ответ на RLI_ASS длиннее, но это всё можно вычитать в документухе по KWP2000 от ВАЗа.

вообще суть проекта - приборка на дешманской меге с диагностикой, цветным дисплеем и стрелочными указателями на шаговиках. коммер делал на stm32f103 и qvga дисплее, с дурью ARMa просто сказка, после него это повторить на AVR - это как пытаться подбить танк чайной ложкой, в принципе возможно, но выглядит смешно  :crazyfun:

Код:
$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 , 18
         'Lcd "CN"
         Ecu_mode = 2
         Clear Serialin
         Recieved_data = 1
         Readmode = 1
      End If

      If _rs232inbuf0(ex + 5) = &H61 Then                   ' если ответ 61 - То данные по переменным пошли
         'Locate 1 , 18
         'Lcd "RD"
'         Ecu_mode = 1
         Gosub Conversion
         Recieved_data = 1                                  '
         Clear Serialin
      End If

      If _rs232inbuf0(ex + 4) = &H58 Then                   ' если ответ 58 - То данные по ошибкам пошли
         'Locate 1 , 18
         'Lcd "RE"
'         Ecu_mode = 1
         Recieved_data = 1
         Clear Serialin
      End If

      If _rs232inbuf0(ex + 4) = &H54 Then                   ' если ответ 54 - То ошибки сброшены
         'Locate 1 , 18
         'Lcd "CE"
         Readmode = 1
         Recieved_data = 1
         Clear Serialin
      End If

      If _rs232inbuf0(ex + 4) = &H7F Then                   ' если ответ 78 - То отказ, будем рестартить
         'Locate 1 , 18
         'Lcd "ER"
 '        Ecu_mode = 0
'         Readmode = 0
         Recieved_data = 1
         Clear Serialin
      End If

If Recieved_data = 0 Then
   'Locate 1 , 18
   'Lcd "D0"
   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

Отредактировано phantom36 (2014-09-16 04:59:47)

0

47

http://autoelectric.by/index.php/progra … vag-kw1281
Вот разобрался с инициализацией на VAG Bosch дизель 1.9 проверено работает. Шнурок - простой без контроллера K-line
На C# Sleep работает нормально

Отредактировано sanyagans (2015-05-11 19:23:56)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Бортовой комп через K-line....