HTL

Atmega Работа С K-Line

5 сообщений в этой теме

HTL    0

Выбирал между несколькими разделами, решил что этот подходит больше всех.

Всем, здравствуйте!

Недавно у меня появилась идея сделать немольшой бортовой компьютер, состоящий из дисплея, пару кнопок и связаный с ЭБУ машины (ЭБУ Вроде Январь 7,2, машина производства АвтоВАЗ, не очень важно)

Решил что все это будет базироваться на "Макетная плата AVR-USB-MEGA16" (http://microsin.ru/c...nt/view/605/44/) смог подключить дисплей и пару кнопок, все работает, все отлично. Но вот не знаю как подключить к ниму ЭБУ по K-Line, поиск в интернете сводится к схемам с разделением на Rx и Tx, а как с этим работать внутри микроконтролерра, либо не описывается, либо нет примеров. Самое лучшие что я нашел это http://cxem.net/avto...onics/4-116.php, но здесь я не смог понять зачем +12 вольт подходит к LM293 и как проходит обмен командами (в коде) между ЭБУ и AVR

Как работать с ЭБУ, часть из "Бортовой компьютер для ВАЗ с цветным дисплеем и тачскрином"

Запрос startCommunication:

81 10 F1 81 03

Ответ:

83 F1 10 C1 6B 8F 3F

В ответе C1 означает, что ЭБУ готов с нами работать (на связи).

После этого мы можем запросить у него параметры, отправив запрос:

82 10 F1 21 01 A5

ЭБУ моей машины отвечает:

80 F1 10 26 61 01 3B 90 41 04 00 00 00 00 47 80 00 00 00 52 52 80 18 00 8E 00 5C 00 00 00 00 00 00 00 00 00 FF FF DD A4 47 02 CE

Что обозначают все эти цифры, понятно и все описанно в документах, с этим проблем нету

Помогите новечку, составить схему для подключение K-Line и пример небольшой программки на Си которая бы димонстрировала работу с k-line

Опыта только: i/o у Raspberry Pi, кнопки, светодиоды и меганием светодиодов с помощью "Макетная плата AVR-USB-MEGA16"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    218

Все там разжеванно понятно! А подключение делаешь через диагностический разьем ОБД2

вот назначение выводов:

02 - J1850 Bus+

04 - Chassis Ground

05 - Signal Ground

06 - CAN High (J-2284)

07 - ISO 9141-2 K-Line

10 - J1850 Bus-

14 - CAN Low (J-2284)

15 - ISO 9141-2 L-Line

16 - Battery Power (напряжение АКБ)

post-106461-0-34336600-1357620663.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
HTL    0

Все там разжеванно понятно!

Мне не понятно зачем на LM293 используется 12 вольт? Можно ли 5? Что измениться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    218

Бортовая сеть автомобиля 12в думаю поэтому! на 16 ноге разьема возьми и запитай свой адаптер и никаких проблем и 5в через ЕН-ку получишь для контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
korsaj    34

Уровни обмена данными ЭБУ автомобиля через клайн - лог 1 = 12В, лог 0 = 0 В.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: forestdozor
      Здравствуйте!

      Мне нужно измерить длительность импульса. Для этого сначала применял внешнее прерывание, а теперь перешел на режим захвата таймера в Atmega 328.
      Однако сейчас происходит странное: Через определенное таймер просто останавливается. Гугл результатов не дает, ни у кого захват таймера 1 не останавливается.
      Подскажите пожалуйста, что делать?
      Среда разработки CodeVisionAVR v3.12. Сейчас попробовал версию 3.3, толку нет. Не работает. Код максимально упростил, но по прежнему толку ноль.
      Переполнение таймера 0 так же работает отлично, до тех пор, пока что-то не произойдет с прерыванием по захвату. Как только что-то произошло - мк останавливается...
      Может немножко подождать, и увеличить значение счетчика current_timp еще на пару значений... Совсем не знаю что делать.
       
       
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      TCNT1H = 0x00;
      TCNT1L = 0x00;
      }
      // Timer1 input capture interrupt service routine
      interrupt [TIM1_CAPT] void timer1_capt_isr(void)
      {
       
             TCNT1H = 0x00;
             TCNT1L = 0x00;           // Это уже уровень танцев с бубном "авось поможет" - не помогает.
         
              current_timp++;          // Все упрощено до максимума. Мне бы он хоть количество периодов для начала...
              
        //  }
      }
      // Прерывание по переполнению первого таймера
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Обнуление счетного регистра.
      TCNT0=0x00;

          
          counter ++;
          if (counter > 10)
          {
                  lcd_clear();
                  sprintf(buffer,"%d us", current_timp);
                  lcd_gotoxy(0,0);
                  lcd_puts(buffer);
                  counter = 0;
          }
          
          
      }

      // Главный цикл программы
      void main(void)
      {

      #pragma optsize-
      CLKPR=(1<<CLKPCE);
      CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
      #ifdef _OPTIMIZE_SIZE_
      #pragma optsize+
      #endif

      // Port B initialization
      // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
      // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
      // Port C initialization
      // Function: Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
      DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
      // State: Bit6=T Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
      PORTC=(0<<PORTC6) | (1<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);
      // Port D initialization
      // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
      // State: Bit7=1 Bit6=1 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
      // Делители таймера 0 рассчитаны таким образом , что его тактовая частота = 15,625 КГц. Расчет был на применение в схеме семисегментников, но с LCD индикатором будет информативнее.
      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
      TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
      TCNT0=0x00;
      OCR0A=0x00;
      OCR0B=0x00;
       
      // Настройка таймера 1
      TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
      TCCR1B=(1<<ICNC1) | (1<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;
      // Разрешение прерывания по переполнению таймера 0
      TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
      // Timer/Counter 1 Interrupt(s) initialization
      TIMSK1=(1<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);
    • Автор: Trute
       Цена 650р.
       Продаётся Плата в Сборе с Прошитым Микроконтроллером.
      ОПИСАНИЕ.
      Это устройство запитывается от любого источника питания 5 вольт, например, USB порт ПК или ноутбука, зарядка для телефона и т. п..., и не нуждается в подключении к источнику 12 вольт, в отличии от других прототипов.
      Предназначено для восстановления "убитых" микроконтроллеров AVR ATmega и ATtiny путем записи в них корректных значений бит фьюзов.
      Atmega Fusebit Doctor исправит Ваши брикнутые микроконтроллеры за доли секунды.
      Поддерживаемые контроллеры:
       



    • Автор: voltex
      Всем привет! Подскажите, пожалуйста, как правильно считать данные с внешней eeprom по шине spi, в данном случае 25LC256.
      Написал код ссылаясь на даташит. Собрал схему в протеусе, подключил spi отладчик и вот что получил в итоге. Так же не могу проверить получается записать данные в память или нет. Весь код прикрепил.
       

      main.c
    • Автор: Роман Ермоленко
      Знающие люди, пожалуйста, подскажите в чем проблема. Вот код в AVR Studio
      while(1){ /* It's also possible to control a single or a set of pins on a port. * * Setting pin PD0 high in order to turn off LED0. */ PORTD |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7); // Setting pin PD1 low in order to turn on LED1. PORTD &= ~((1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7)); } Устанавливаю 2 брекпоинта на командах, дабы просмотреть что будет в симуляторе на порту. Первая команда спокойно выставляет все биты порта D в лог. 1, а вторая ни в какую не хочет их сбрасывать в лог.0. При этом переход по циклу не происходит (будто бы зависает на последней команде), сколько F5 не нажимай.