Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Lanos - komunikacja z ECU

Dawid_20 06 Gru 2010 19:16 1247 0
  • #1 06 Gru 2010 19:16
    Dawid_20
    Poziom 17  

    Witam, posiadam lanosa 1,5 16V rocznik '99. Chciałem skomunikować się z komputerem pokładowym, lecz niestety nie osiągnąłem sukcesu (układ testowy na avr-ku z lcd). To co do tej pory robiłem:

    Atmega8, wewnętrzne 8MHz, prędkość USART 8192 (UBRRH=0, UBRRL=60)

    -pierwsze podejście: RX i TX zwarte ze sobą, podłączenie do linii M ECU,masy wspólne, podczas wysyłania wyłączałem odbiornik, po zakończeniu włączałem go
    -drugie podejście:
    Lanos - komunikacja z ECU
    Zastosowałem takie połączenie (użyte PNP to BC557). Kawałek kodu:

    Code:
    #include <avr/io.h>
    
    #include <util/delay.h>
    #include "uart.h"
    #include "lcd.h"
    #include "lcd_digit.h"

    #define ODB_OFF      PORTD |= _BV(6);
    #define ODB_ON      PORTD &= ~_BV(6);

    #define DataStreamSize   68

    uint8_t DEF_BATT=0;

    void GetCarData(void);
    void Calculate_CarData(void);

    uint8_t DataStream[DataStreamSize];
    uint8_t FrameError;

    void UART_init(void)  // inicjalizacja UART
    {   
       UBRRH=0;
       //UBRRL=51; //9600
       UBRRL=60; //8192

       UCSRB = (1<<TXEN)|(1<<RXEN);  // włącz odbiór i nadawanie
       UCSRC = (1<<UCSZ0)|(1<<UCSZ1);
    }

    unsigned char UART_getc (void)  // odbiera znak z UART
    {
       while ( !(UCSRA & (1<<RXC)) );
       return UDR;
    }

    void UART_putc(uint8_t c)    // wysyła znak c na UART
    {   
          while ( !( UCSRA & _BV(UDRE)) );
          UDR = c;   
          while (!(UCSRA & _BV(TXC)));
    }

    void GetCarData()
    {
       uint8_t i;
       uint16_t timeout;
       
       ODB_OFF; //zablokowanie odbiornika
       UART_putc(0xF4); UART_putc(0x57); UART_putc(0x01); UART_putc(0x00); UART_putc(0xB4);
       ODB_ON; //odblokowanie odbiornika
       
       for(i=0;i<DataStreamSize;i++)
       {
          timeout=0;
          while( !(UCSRA & (1<<RXC) )  && (timeout < 40000) ) timeout++;      




          if(timeout == 40000) DataStream[i]=0;
          else  DataStream[i]=UDR;
           
       }
       ODB_OFF;
    }

    void Calculate_CarData()
    {
       lcd_clear();
       lcd_dec(DEF_BATT); lcd_putc('-');
       lcd_dec(DataStream[DEF_BATT]);
    }

    int main(void)      //funkcja glowna
    {
       DDRC &=~_BV(2);   PORTC |= _BV(2);   DDRD |=_BV(6);
       lcd_init();    UART_init();
       
       while(1)
       {
          GetCarData();   Calculate_CarData();      
          if(!(PINC & _BV(2))) DEF_BATT++;
          _delay_ms(500);
       }
    }

    Podglądając poszczególne bajty z tablicy, większość to 0, na dwóch lub trzech pozycjach jest jedna ta sama liczba różna od zera (zawsze ta sama).

    Linki do materiałów na których się opierałem:
    Link
    Link
    Link

    Ktoś jest w stanie mi pomóc jak to ruszyć?? A druga sprawa (jak już uporam się z samą komunikacją), niestety co źródło to inny sposób dekodowania ramki, nie wiem pod którym bajtem co się znajduje. Głównie zależy mi na prędkości i obrotach.

    0 0