Forum: Mikrocontroller und Digitale Elektronik Pic18f4580 OBD Canbus kommunikation


von mehmet c. (mscikar)


Lesenswert?

Hallo an alle.

Ich habe bereits öftersmal Can Bus kommunikation zwischen mehreren 
microcontroller aufgebaut.

Ich wollte jetzt Can Bus an OBD2 schnittstelle im Fahrzeug Testen. 
besser gesagt werte wie Drehzahl, Temp, etc. auslesen.

Dafür habe ich eine PIC18f4580 board mit MCP2551 aufgebaut inklusive LCD 
4x20.

Busgeschwindigkeit: 500 Kbps eingestellt.

Doch wenn ich jetzt meine Platine an Obd anschließe kriege ich Fehler 
meldung  "Motor Störung".

Was mache ich falsch?
Wieso kriege ich da Fehler meldung. Ich habe noch nicht mal irgend 
welche Daten gesendet oder empfangen. Mein code besteht aus:




#include "18F4580.h"
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

#include "can-18F4580.c"

#define CAN_USE_EXTENDED_ID FALSE

void main()
{
   int32 rx_id;
   int rx_len,i;
   struct rx_stat stat;
   int receive[8];

   Can_init();
   while(TRUE)
   {
      if(can_kbhit())
      {
         output_high(pin_a3);
         can_getd(rx_id,receive,rx_len,stat);

         printf("\n\rwas received with id %Lx\n\r\n\r",rx_id);
      }
   }
}






was mache ich Falsch?


Vielen Dank :(
#

von Robert F. (robert_f)


Lesenswert?

Hi,

mehmet cikar schrieb:
> Doch wenn ich jetzt meine Platine an Obd anschließe kriege ich Fehler
> meldung  "Motor Störung".

wo siehst du die Störung?

Allgemein, wenn deine Schaltung korrekt ist und die Abschlusswiderstände 
passen sollte es keine Fehler geben. Überprüfe Kurzschlüsse an deinem 
Anschluss. Betreibe deinen Transceiver erstmal passiv (Standby) um 
auszuschließen dass es ein Hardwarefehler ist.

von mehmet c. (mscikar)


Lesenswert?

Hallo nochmal,

Die Hardware Funktioniert ohne Probleme.
ich habe es mit 125 Kbps probiert und konnte mit anderen boards 
Kommunizieren.

Vielleicht mache ich beim bit time calcutator ein Fehler. ich habe den 
Can Bit timing Calculator benutzt.

Propagation delay 3
Phase segment1    8
Phase segment2    8
syncro Jump Width 1
baud rate prescaler 0


ich habe die Parameter  den Ordner " can-18F4580.h  " wie folgt 
geändert:


#IFNDEF CAN_USE_EXTENDED_ID
  #define CAN_USE_EXTENDED_ID         TRUE
#ENDIF

#IFNDEF CAN_BRG_SYNCH_JUMP_WIDTH
  #define CAN_BRG_SYNCH_JUMP_WIDTH        1
#ENDIF

#IFNDEF CAN_BRG_PRESCALAR
  #define CAN_BRG_PRESCALAR     0
#ENDIF

#ifndef CAN_BRG_SEG_2_PHASE_TS
 #define CAN_BRG_SEG_2_PHASE_TS   TRUE
#endif

#ifndef CAN_BRG_SAM
 #define CAN_BRG_SAM 0
#endif

#ifndef CAN_BRG_PHASE_SEGMENT_1
 #define CAN_BRG_PHASE_SEGMENT_1        8
#endif

#ifndef CAN_BRG_PROPAGATION_TIME
 #define CAN_BRG_PROPAGATION_TIME       3
#endif

#ifndef CAN_BRG_WAKE_FILTER
 #define CAN_BRG_WAKE_FILTER FALSE
#endif

#ifndef CAN_BRG_PHASE_SEGMENT_2
 #define CAN_BRG_PHASE_SEGMENT_2       8
#endif

#ifndef CAN_USE_RX_DOUBLE_BUFFER
 #define CAN_USE_RX_DOUBLE_BUFFER TRUE
#endif

#ifndef CAN_ENABLE_DRIVE_HIGH
 #define CAN_ENABLE_DRIVE_HIGH 0
#endif

#ifndef CAN_ENABLE_CAN_CAPTURE
 #define CAN_ENABLE_CAN_CAPTURE 0
#endif

#ifndef CAN_ENABLE_CANTX2
   #define CAN_ENABLE_CANTX2 0
#endif

#ifndef CAN_CANTX2_SOURCE
   #define CAN_CANTX2_SOURCE 0
#endif


mache ich da irgend was falsche?


Ich habe grade 2 Platinen zuhause die ich bisher mit 125kbs 
communication aufgebaut habe. eben habe ich mit 500 Kbs probiert hat 
leider nicht funktioniert. was mache ich Falsch?


Vielen Dank

von mehmet c. (mscikar)


Lesenswert?

Robert F. schrieb:

> wo siehst du die Störung?
>
> Allgemein, wenn deine Schaltung korrekt ist und die Abschlusswiderstände
> passen sollte es keine Fehler geben. Überprüfe Kurzschlüsse an deinem
> Anschluss. Betreibe deinen Transceiver erstmal passiv (Standby) um
> auszuschließen dass es ein Hardwarefehler ist.

Also ich probiere das ganze an einem Ford Fiesta. Sobald ich mein Box 
anschließe und Zündung Anmache, bekomme ich so ein Ton aus dem Fahrzeug 
und am Radio Bildschirm bekomme ich eine Fehler Meldung "Motor Störung"

Diese Fehlermeldung verschwindet wieder nach paar sek. aber ich habe 
keine Kommunikation.

von Robert F. (robert_f)


Lesenswert?

mehmet cikar schrieb:
> Also ich probiere das ganze an einem Ford Fiesta. Sobald ich mein Box
> anschließe und Zündung Anmache, bekomme ich so ein Ton aus dem Fahrzeug
> und am Radio Bildschirm bekomme ich eine Fehler Meldung "Motor Störung"
>
> Diese Fehlermeldung verschwindet wieder nach paar sek. aber ich habe
> keine Kommunikation.

Ich würde ein Hardwareproblem noch nicht ausschließen (Steckerbelegung, 
Abschlusswiderstände). Es macht einen Unterschied ob du eine 
Punkt-zu-Punkt-Verbindung aufbaust oder dich mit an den Fahrzeugbus 
hängst.

mehmet cikar schrieb:
> Propagation delay 3
> Phase segment1    8
> Phase segment2    8
> syncro Jump Width 1
> baud rate prescaler 0

Für FOSC 20 MHz sind diese Einstellungen sinnvoll.

: Bearbeitet durch User
von mehmet c. (mscikar)


Lesenswert?

> Ich würde ein Hardwareproblem noch nicht ausschließen (Steckerbelegung,
> Abschlusswiderstände). Es macht einen Unterschied ob du eine
> Punkt-zu-Punkt-Verbindung aufbaust oder dich mit an den Fahrzeugbus
> hängst.


Wie kann ich es Feststellen. ich habe den Widerstand zwischen Can 
H-->Can L am OBD stecker gemessen. und habe 60ohm abgelesen.
Da habe ich dann angenommen dass da bereits 2x 120ohm Widerstände 
parallel geschaltet sind. also bus Anfang und bus ende.

ich denke sonst würde ja Can Bus im Fahrzeug gar nicht funktionieren 
oder?

wie gesagt sowas probiere ich erste mal.

von Robert F. (robert_f)


Lesenswert?

mehmet cikar schrieb:
> Wie kann ich es Feststellen. ich habe den Widerstand zwischen Can
> H-->Can L am OBD stecker gemessen. und habe 60ohm abgelesen. Da habe ich
> dann angenommen dass da bereits 2x 120ohm Widerstände parallel
> geschaltet sind. also bus Anfang und bus ende.

Dann passt das. Du brauchst für deinen Stecker einen etwas höheren 
Abschlusswiderstand: 10k.

Wenn du denn Transceiver abschaltest (RS Pin > 75% VDD) und den Fehler 
nicht mehr bekommst, weißt du das es ein Software-Problem ist. Kannst du 
deine Schaltung posten? Zumindest den CAN relevanten Teil.

von mehmet c. (mscikar)


Angehängte Dateien:

Lesenswert?

Hier schonmal die Schaltung.

Transceiver abschalten probiere ich gleich.

Ich könnte genau so gut. Can Relatante Code wie Can_init(); 
auskommentieren oder?
 wenn ich doch dann (nach der Can_init auskommentieren) keine Fehler 
meldung kriege, bedeutet das ja auch dass es ein Softwareproblem ist 
oder?

von Rutzi (Gast)


Lesenswert?

Wo ist die CAN Schutzbeschaltung?
Gleichtaktdrossel, TVS,... ?

Da geht einiges ab.

Kann schon sein, das du beim Einschalten der Zündung ein Problem mit 
deiner Schaltung generierst.

von Robert F. (robert_f)


Lesenswert?

mehmet cikar schrieb:
> Hier schonmal die Schaltung.

Wenn die Schaltung so aufgebaut wurde hast du einen weiteren 120 Ohm 
parallel geschaltet. Das geht natürlich nicht. Setze dort einen größeren 
ein. Wenn du VDD an RS anschließt pass auf die 10 Ohm gegen Masse auf. 
Vielleicht wird der warm ;-)

mehmet cikar schrieb:
> wenn ich doch dann (nach der Can_init auskommentieren) keine Fehler
> meldung kriege, bedeutet das ja auch dass es ein Softwareproblem ist
> oder?

Das ist einen Versuch wert.

von mehmet c. (mscikar)


Lesenswert?

> Wenn die Schaltung so aufgebaut wurde hast du einen weiteren 120 Ohm
> parallel geschaltet. Das geht natürlich nicht. Setze dort einen größeren

Die Frage ist brauche ich überhaupt einen Abschlusswiderstand? Wenn ich 
OBD buchse am fahrzeug zwischen CanH und Can L messe ohne meine 120ohm 
widerstand.
Ich lese einen gesamtwiderstand von 60 ohm.

aktuell habe ich garkein widerstand drinnen weil OBD seite schon einen 
gesamt R von 60 ohm hat.

Was für einen Widerstand soll ich zwischen CanH ---> CanL anschließen?

von Robert F. (robert_f)


Lesenswert?

mehmet cikar schrieb:
> aktuell habe ich garkein widerstand drinnen weil OBD seite schon einen
> gesamt R von 60 ohm hat.
>
> Was für einen Widerstand soll ich zwischen CanH ---> CanL anschließen?

Das ist gut. Aus Erfahrung kann ich sagen dass ein 10k Ohm Widerstand 
nicht schaden kann.

von mehmet c. (mscikar)


Lesenswert?

> Das ist gut. Aus Erfahrung kann ich sagen dass ein 10k Ohm Widerstand
> nicht schaden kann.


würde es keine zusätzliche Probleme erzeugen wenn ich zu einem 
bestehenden bus widerstand  an meiner platine zusätzlich 10 k 
anschließe?




ich habe grade meine Platine ohne widerstand mit 125kbps an OBD 
angeschlossen.
habe keine Fehler meldung bekommen.

Die Fehlermeldung kriege ich nur wenn ich mein Software auf 500 kbps 
einstelle.


abgesehen von einem Fahrzeug kommunikation:

ich habe grade 3 knoten mit 125 kbit aufgebaut. Es funktioniert auch.
Wenn ich aber selbe aufbau mit 500kbps probiere funktioniert es nicht.

von Robert F. (robert_f)


Lesenswert?

mehmet cikar schrieb:
> abgesehen von einem Fahrzeug kommunikation:
>
> ich habe grade 3 knoten mit 125 kbit aufgebaut. Es funktioniert auch.
> Wenn ich aber selbe aufbau mit 500kbps probiere funktioniert es nicht.

Dann setze dort an. Welche Einstellungen (Propagation delay, Phase 
segment, syncro Jump Width, baud rate prescaler) nutzt du für 125kbps? 
Davon mal abgesehen dass du keine C-Dateien inkludieren sollst, kannst 
du diese bitte noch anhängen?

von mehmet c. (mscikar)


Lesenswert?

Erst habe ich versucht die Bus time Parameter zu ändern.

Propagation delay 3
Phase Segment_1   8
Phase Segment_2   8
SJW               1
BRP               0

Es hat nicht funktioniert. Dann habe ich den Tipp  bekommen es so 
einzustellen direkt in

//can-18F4580.c

void can_set_baud(void) {
// 20 MHz oscillator, 500 kbs
BRGCON1 = 0x01;
BRGCON2 = 0xA0;
BRGCON3 = 0x02;


und es hat funktioniert. Ich kann jede jetzt zwischen den 3 Platinen mit 
500kbps kommunizieren.

Ich habe es auch an OBD angeschlossen habe bisher keine Fehlermeldung 
bekommen.


Wie würdet ihr mir empfehlen, dass ich vorgehen sollte.
Ich will aus dem Fahrzeug Daten wie Drehzahl Drehmoment auslesen.

von Robert F. (robert_f)


Lesenswert?

mehmet cikar schrieb:
> Ich habe es auch an OBD angeschlossen habe bisher keine Fehlermeldung
> bekommen.

Glückwunsch :-)

mehmet cikar schrieb:
> Wie würdet ihr mir empfehlen, dass ich vorgehen sollte.
> Ich will aus dem Fahrzeug Daten wie Drehzahl Drehmoment auslesen.

Wenn du nicht irgendwoher eine CAN-Matrix Beschreibung für den CAN 
auftreiben kannst sieht es düster aus. Das wird ein Fischen im trüben. 
Mit viel Aufwand könntest du Aufzeichnungen anfertigen und die 
Nachrichten unter den verschiedenen Betriebspunkten beobachten. Z.B. 
sollte die Temperatur nach dem Einschalten des Motors steigen und nach 
Abschalten wieder fallen.

von mehmet c. (mscikar)


Lesenswert?

Hallo,
Ein oder andere IDs sidn mir bekannt.
Davon abgehesen gibts ja diese generische OBD IDs über den man Drehzahl 
drehmoment etc. ablesen kann.

nur habe ich grade noch ein Problem.
Meine Kommunikation auf 500KBPS funktioniert auch. Mit meinem Can 
sniffer kann ich auch alle nachrichten auf dem Bus sehen.

Auch wenn ich meinen Adapter an das OBD anschließe kriege ich keine 
Fehlermeldung.

ich versuche in Main funktion unter While
void main()
{
   int32 rx_id;
   int i, rx_len, buffer[];
   struct rx_stat rxstat;
   While(TRUE)
    {
      if(can_getd(rx_id, &buffer[0], rx_len, rxstat))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"%LX: (%U)", rx_id, rx_len);
      }
    }
}
ich will damit  alle IDs die über den Bus hin und her wandern Auf meinem 
LCD anzeigen lassen.

Bei der Kommunikation mit 3 Platinen funktioniert es funderbar.
ICh kann alle IDS sehen.

Doch wenn ich es an meinem auto anschließe passiert garnicht.

Wie kann ich es Feststellen ob überhaupt kommunikation da ist.

von Bad U. (bad_urban)


Lesenswert?

Hallo Mehmet,

ich beschäftige mich erst seit kurzem mit dem CAN-Controller der PIC18. 
Aber ich glaube ich habe Deinen Fehler bei 500k gefunden.

Bei 20 MHz und 500k kommst Du nur mit 10 bzw. 20 Zeitquanten auf ein 
ganzzahliges BRP, das ist klar.

hier schreibst Du:
mehmet cikar schrieb:
> Erst habe ich versucht die Bus time Parameter zu ändern.
>
> Propagation delay 3
> Phase Segment_1   8
> Phase Segment_2   8
> SJW               1
> BRP               0
>
> Es hat nicht funktioniert. Dann habe ich den Tipp  bekommen es so
> einzustellen direkt in

Du wolltest also mit 20 Quanten arbeiten.

Die Einstellungen hier sind für 10 ausgelegt.
> //can-18F4580.c
>
> void can_set_baud(void) {
> // 20 MHz oscillator, 500 kbs
> BRGCON1 = 0x01;
> BRGCON2 = 0xA0;
> BRGCON3 = 0x02;

Wenn man Sie zusammenzählt sind es aber nur 9. Wahrscheinlich hast Du 
bei denen Tests das Sync Segment vergessen und deshalb ein Qauntum zu 
viel. Bei hohen Raten macht das sicher mehr aus als bei niedrigen.

Bei der funktionierenden Einstellung ist auch der Abtastzeitpunkt 
(zwischen Phase Segment 1 und 2) später als bei Deinen Einstellungen. 
Lt. Datenblatt sollte diese so spät wie möglich so ca. bei 80% der 
Bitzeit sein. Das kann auch einen Einfluss haben.

Versuch doch mal bei Deinen ursprünglichen Einstellungen beim Phase 
Segment 2 ein Tq abzuziehen. Vielleicht läuft es ja dann.

: Bearbeitet durch User
von mehmet c. (mscikar)


Lesenswert?

Wenn ich ehrlich bin diese ganze Thematik mit dem SJW Phase1 etc. nicht 
so bewusst. Ich habe einfach die Werte die der Bit time Kalkulator 
ausgespuckt hat eingefügt.

Ich verstehe aber eins immer noch nicht. wieso funktioniert es während 
der Kommunikation zwischen den 3 Platinen mit

void can_set_baud(void) {
> // 20 MHz oscillator, 500 kbs
> BRGCON1 = 0x01;
> BRGCON2 = 0xA0;
> BRGCON3 = 0x02;

und wenn ich es an OBD anschließe geht garnicht. :(
ich habe auch schon mit

      if(can_kbhit()) probiert ( sobald irgend ein Can Kbhit kommt dass 
es Led angeht passiert auch wieder nichts.

Habe fast den ganzen Tag damit verbracht aber leider bin ich kein stück 
weiter gekommen.

von mehmet c. (mscikar)


Lesenswert?

Ich habe jetzt auch mit 20 Tq probiert
in can-18F4580.c

void can_set_baud(void) {

// 20 MHz oscillator, 500 kbs 20Tq
BRGCON1 = 0x00;
BRGCON2 = 0xBA;
BRGCON3 = 0x07;
/*
   BRGCON1.brp=CAN_BRG_PRESCALAR;
   BRGCON1.sjw=CAN_BRG_SYNCH_JUMP_WIDTH;


   BRGCON2.prseg=CAN_BRG_PROPAGATION_TIME;
   BRGCON2.seg1ph=CAN_BRG_PHASE_SEGMENT_1;
   BRGCON2.sam=CAN_BRG_SAM;
   BRGCON2.seg2phts=CAN_BRG_SEG_2_PHASE_TS;


   BRGCON3.seg2ph=CAN_BRG_PHASE_SEGMENT_2;
   BRGCON3.wakfil=CAN_BRG_WAKE_FILTER;
*/
}


Es hat wieder nicht funktioniert. Ich kriege keine kommunikation zum 
Fahrzeug Canbus.
Wenn ich aber mein Can sniffer an OBD anschließe sehe ich die ganze 
Signale. :(

Hat jemand eine ideee?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.