Hallo, Ich arbeite zur Zeit an einem Projekt, bei dem ein Embedded PC mehrere Microcontroller ( PIC 18f6585 ) von Microchip per CAN Bus steuert. Der Embedded PC ist über Lincan angebunden, die Microcontroller über ihr ECAN Modul. Leider schaffe ich es nicht, eine funktionierende Verbindung (trotz Terminierung mit 120Ohm etc) aufzubauen. Insbesonders habe ich folgende Probleme: - bei Lincan finde ich nur den "baudrate" Parameter, aber keine Möglichkeit um die Phasenlänge (Sampling Point, Synchronisationsbits etc) zu konfigurieren, die ja neben der Datenrate auch Bedeutung hat. Eine solche Konfiguration ist bei den PICs möglich. Ist jemandem eine solche Option bekannt, oder zumindest, wie Lincan da vorkonfiguriert ist? - dieses Problem hängt wahrscheinlich mit dem ersten zusammen. Meine PICs senden ( über die ECAN C-Routinen von Microchip) immer nur die ersten paar CAN Messages und bleiben dann beim versenden ( while( !ECANSendMessage(...) ); ) hängen. Ich denke, dass dann einfach die Sendebuffer im PIC voll sind nd der CAN Controller keine Messages versenden kann. Kann es sein, dass mindestens 2 CAN Devices benötigt werden, um Nachrichten zu senden? Ich konnte dazu keinerlei Infos finden. Ich bin für jeden Hinweis dankbar. Grüße Marius
Hi, versuch mal den CAN Bus mit 60 statt 120 Ohm abzuschliessen. Kann bei manchen CAN Bussen (z.B. in Kfz Netzen ) der richtige Wert sein. Möglich dass deine CAN Sender nicht ihre eigenen Frames zurücklesen können und deswegen auf Bus-Off gehen. Ein Oszilloskop ist ein verdammt guter Freund bei CAN Problemen. Die Ruhepegel des CAN sollten bei 2,2 - 2,4 V(L) und 2,6 - 2,8 V liegen. Aber für eine genauere Hilfestellung müsstest du ein wenig mehr Informationen bereitstellen: - CAN Identifier Länge bei allen Teilnehmern gleich, 11 oder 29 bit? - Hast die CAN Leitungen verdrillt? Alter Klassiker. - Welche CAN Physik? High Speed, Low Speed und verwendete Baudrate? - Hast du die Möglichkeit Error Frames festzustellen? Kann man aus vielen CAN Transceivern als Zählerwert auslesen wenn man nicht gerade den 15k€ CANalyzer zur Hand hat.
Wenn komplett garnichts tut kann das viele Ursachen haben. Ich zähle mal ein paar auf, die mir in der Vergangenheit schonmal das Leben schwer gemacht haben. Hardware: - CAN Transceiver: gleiche Typen? - CAN Transceiver: richtiger Pegel auf Enable Leitung? - CAN Transceiver: Vbat angeschlossen und >5V? - CAN Transceiver: Rx und Tx, bzw. BusHigh und BusLow nicht vertauscht? - Kabel verdrillt? - Terminierung passt? Software: - CAN controller im entsprechenden Register eingeschaltet? - Eingangsfilter komplett ausgeschaltet, oder entsprechend der Nachrichten IDs eingestellt - Bestätigen von Nachrichten eingeschaltet? Wie du schon erkannt hast, muss immer mindestens noch ein zweiter CAN Teilnehmer da sein, der den korrekten Empfang mit dem Acknowledge-Bit bestätigt. Sonnst kommt es zu einem Stau in den Tx-Buffern - Die Samplepoint Parameter haben mir bisher noch keine Schwierigkeiten gemacht, aber sie sind natürlich potentielle Fehlerquellen - Baudrate... Ein Oszilloskop hilft hier wirklich sehr, wie Mark schon schrieb. Falls du eines bekommen kannst, einfach mal zwischen Controller und Transceiver die Tx-Leitung messen, dann Die CAN-Leitungen nach dem Controller. Wenns bei beiden Leitungen zappelt ist das schon mal eingutes Zeichen :-) So weißt du schonmal, daß das Versenden klappt.
Meine Verkabelung sollte eigentlich in Ordnung sein, da mein Embedded PC zwei CAN Ports hat und diese problemlos miteinander kommunizieren können. Der Osci zeigt auch schönes zappeln mit den verschiedenen Bitflanken an. Ich hab mittlerweile den CAN Calculator von intrepidcs verwendet und sollte so auf jeden Fall auf eine Baudrate von 500 kBPS ( bei FOSC von 40 MHz) kommen. Nur leider tut das noch nicht so wie es soll. Ich werde mal weiter suchen... Grüße Marius
Der von dir genannte Controller ist bei Microchip nicht aufgeführt. Er ist also nicht existent oder alt. Da er ei0n ECAN Modul hat kann er nicht alt sein. Folglich hast du einen falschen Typ genannt. richtig? Marius schrieb: > Meine Verkabelung sollte eigentlich in Ordnung sein, da mein Embedded PC > zwei CAN Ports hat und diese problemlos miteinander kommunizieren > können. Die können auch miteinander kommunizieren wenn die Baudrate nicht passt, denn sie wird dann auf beiden Ports gleichweit daneben liegen. Das ist nicht unbedingt aussagekräftig. > Der Osci zeigt auch schönes zappeln mit den verschiedenen > Bitflanken an. Und welche Bitrate kannst du messen? Ich hab mittlerweile den CAN Calculator von intrepidcs > verwendet und sollte so auf jeden Fall auf eine Baudrate von 500 kBPS ( > bei FOSC von 40 MHz) kommen. Nur leider tut das noch nicht so wie es > soll. Den kenn ich nicht. Hast du dir mal das Datenblatt genommen und die Werte durchgerechnet ob die passen können. > Ich werde mal weiter suchen... Ja, und wenn du nix findest noch ein Tipp: Wenn du deinen Code hier reinstellst, brauchen die Leute nicht raten was du machst.
Leider hatte ich letzte Woche keinen Zugriff auf meine Hardware, deswegen kann ich erst jetzt antworten. @Willivonbienemaya: Seltsam, dass du den PIC nicht findest, ich habe noch einmal in die Doku gesehen, er heißt wirklich PIC18F6585. Zusätzlich verwende ich auch noch den PIC18F2685. Die Bitrate zu messen, ist mir leider mit dem Osci noch nicht gelungen, wie stelle ich das an? (An welchen Flanken muss ich mich orientieren?) Ich habe meine bestimmten Einstellungen auch via Datenblatt überprüft, ich sollte auf die gewünschte Bitrate kommen ( Ich habe bereits 125kbit, 250kbit und 1Mbit getestet ). @peterguy: Das ist leider ein Problem. Ich habe beide PICs mit der gleichen Software programmiert und die Signale (ohne dass die PICs verbunden waren) verglichen. Leider sehen die Bilder am Osci nicht gleich aus ( trotz gleicher Konfiguration, Quartz etc.) Der große PIC liefert untenstehendes Bild, also eine korrekte CAN message:
1 | ----| |--| |-| |-| |--- |
2 | |-| |--| |-| |-| |
Der kleine PIC liefert nur Spitzen:
1 | |
2 | ----|--|--|--||------ |
3 | | | | | |
Eigentlich sollte das gleich sein, oder? Beide PICs wurden mit diesem Programm geladen:
1 | void main( void ) { |
2 | |
3 | BYTE candata[4]; |
4 | unsigned long id; |
5 | BYTE dataLen; |
6 | ECAN_RX_MSG_FLAGS flags; |
7 | |
8 | ECANInitialize(); |
9 | memset(candata,0,8); |
10 | candata[0] = 1; |
11 | candata[1] = 2; |
12 | |
13 | while(1) { |
14 | |
15 | /* Some Signaling over other pins
|
16 | ...
|
17 | */
|
18 | |
19 | while ( !ECANSendMessage ( 0x778, candata, 8, 0 ) ); |
20 | //ECANReceiveMessage( &id, candata, &dataLen, &flags );
|
21 | |
22 | /* Some Signaling over other pins
|
23 | ...
|
24 | */
|
25 | }
|
26 | |
27 | }
|
Ich habe alle Verbindungen zigmal überprüft und durchgemessen, ich finde den Fehler einfach nicht :( Hilfe! Marius
Noch ein kleiner Nachtrag: Ich verwende ein 10Mhz Quartz im HSPLL Modus, in der ECAN def habe ich folgende Parameter geändert, der Rest ist original von Application Maestro: ECAN_SJW_VAL 2 ECAN_BRP_VAL 1 ECAN_PHSEG1_VAL 5 ECAN_PHSEG2_VAL 3 ECAN_PROPSEG_VAL 1 Rechnerisch komme ich damit auf 1Mbit/s baudrate. Danke für jede weitere Hilfe. Marius
Marius schrieb: > @Willivonbienemaya: Seltsam, dass du den PIC nicht findest, ich habe > noch einmal in die Doku gesehen, er heißt wirklich PIC18F6585. Ich glaubs. Nur hier ist er nicht dabei: http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1004&mid=10&lang=en&pageId=74 Das hat mich gewundert. > Zusätzlich verwende ich auch noch den PIC18F2685. Die Bitrate zu messen, > ist mir leider mit dem Osci noch nicht gelungen, wie stelle ich das an? Du suchst dir das kürzeste Bit im Datenwort und misst es idealerweise mit dem cursor des oszis. > (An welchen Flanken muss ich mich orientieren?) ist egal. hauptsache du nimmst zweimal die gleiche. > Ich habe meine > bestimmten Einstellungen auch via Datenblatt überprüft, ich sollte auf > die gewünschte Bitrate kommen ( Ich habe bereits 125kbit, 250kbit und > 1Mbit getestet ). "sollte" nützt hier nichts. Du musst alles prüfen was du prüfen kannst. > > @peterguy: Das ist leider ein Problem. Ich habe beide PICs mit der > gleichen Software programmiert und die Signale (ohne dass die PICs > verbunden waren) verglichen. Leider sehen die Bilder am Osci nicht > gleich aus ( trotz gleicher Konfiguration, Quartz etc.) Hast du vielleicht die Config bits anders gesetzt? Ansonsten mess mal die schaltung ob die an allen punkten gleich ist. Sind irgendwo kalte Löststellen? > Der große PIC liefert untenstehendes Bild, also eine korrekte CAN > message: > >
1 | > ----| |--| |-| |-| |--- |
2 | > |-| |--| |-| |-| |
3 | > |
> > > Der kleine PIC liefert nur Spitzen: > >
1 | > ----|--|--|--||------ |
2 | > | | | | |
3 | > |
> > Eigentlich sollte das gleich sein, oder? Ja das sollte in etwa gleich aussehen. Wo misst du genau? also welche Leitung? Mess mal alle Leitungen an deinem CAN Treiber und poste die Ergebisse. Hast du schon mal spasseshalber die Erratas durchgelesen? Vielleicht steht da ein Hinweis.
Yuhe Letzendlich hab ich das Ding zum Laufen gebracht! Das Problem war am Ende, dass zum einen der 18F6585 ( oder alle der Familie 18F6X8X) einen Hardware Bug haben, durch den unter Umständen die konfigurierte Bus Geschwindigkeit nicht richtig ausgewertet wird. Und außerdem müssen die CAN Ports ( Das ist nirgends dokumentiert!!! ) auf LOW und im TRIS auf HIGH gesetzt werden, um korrekt zu funktionieren. Danke an alle für Ihre Ideen und Hilfe! Marius
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.