Forum: Mikrocontroller und Digitale Elektronik CANBus mit dsPIC30F4011 und MCP2551


von Lorenz (Gast)


Lesenswert?

Hallo,

ich bin Neuling auf dem Gebiet der Controller-Programmierung, bitte also 
um Nachsicht.
Ich möchte ein CAN-Bus mit den oben genannten Bausteinen realisieren. 
Als Entwicklungsumgebung habe ich PIC C Compiler. Die Taktfrequenz des 
Oszilators beträgt 6MHz mit PLL8(clock=48MHz). Als Prototype-Llibrary 
verwende ich die mitgelieferte can-dsPIC30.c und can-dsPIC30.h.
Ich möchte eine Baudrate von 500kbit/s einstellen und habe mir mit Hilfe 
von dem Bit Timing Calculator von Microchip die BitTimings berechnen 
lassen.

Der Calculator berechnet folgende Werte(Tq=24):
BRP-1 1
Propagation Delay  7
Phase Segment 1          8
Phase Segment 2   8
Syncronization Jump Width (SJW)  1

In der Headerdatei setze ich die neuen Werte ein (Tq=24):
CAN_BRG_SYNCH_JUMP_WIDTH  1
CAN_BRG_PRESCALAR  1
CAN_BRG_PHASE_SEGMENT_1  8
CAN_BRG_PHASE_SEGMENT_2  8
CAN_BRG_PROPAGATION_TIME 7

Leider funktioniert der CAN-Bus mit diesen Einstellungen nicht. Was 
mache ich falsch?

Gruß Lorenz

von (prx) A. K. (prx)


Lesenswert?

orenz schrieb:

> Leider funktioniert der CAN-Bus mit diesen Einstellungen nicht. Was
> mache ich falsch?

Funktioniert der Loopback-Test?

von Lorenz (Gast)


Lesenswert?

Was ist ein loopback test? und wie kann ich den durchführen?

von (prx) A. K. (prx)


Lesenswert?

CAN Controller auf "Kurzschluss" schalten, Frame senden, sehen ob er 
wieder reinkommt. Wenn das auch nicht geht, dann kämpft man nicht (nur) 
mit der Bitrate. Weil kein Bus beteiligt.

Siehe CiCTRL.REQOP=010 und Kap 23.5.3.

von Lorenz (Gast)


Lesenswert?

ich habe gerade einen Link im Netz gefunden der die Problematik 
beschreibt.
http://www.ccsinfo.com/forum/viewtopic.php?t=43384
könnte das der Fehler bei mir sein?

wieso wird im code SJW auf null gesetzt, obwohl nach default 1 x Tq sein 
sollte?
---CAN_BRG_SYNCH_JUMP_WIDTH  0  //synchronized jump width (def: 1 x 
Tq)---
@A.K. Könnten Sie mir das erklären!

von (prx) A. K. (prx)


Lesenswert?

Lorenz schrieb:

> wieso wird im code SJW auf null gesetzt, obwohl nach default 1 x Tq sein
> sollte?

Ich habe den Thread nicht gelesen, erlaube mir aber drauf hinzuweisen, 
dass es einen Unterschied zwischen dem Wert der SJW und der Codierung im 
Register gibt. Als Wert ergibt 0 keinen Sinn, als Codierung schon.

Was den Rest angeht: Wenn der Loopback funktioniert, dann können wir 
weiter über die Bitratendefinition philosophieren. Solange der nicht 
funktioniert ist das sinnlos.

von Lorenz (Gast)


Lesenswert?

Danke für die schnelle Antwort. Also das Senden funktioniert, habe den 
CanTx mit einem Osziloskop geplottet und die Signalfolge scheint richtig 
zu sein. Ich sende eine Botschaft und die Signalfolge läuft periodisch 
weiter!

Eine Frage noch:
Entspricht die Codierung "0" dem SJW =1, oder z.B die Codierung des BRP 
"4" einem Prescaler von 5?

von (prx) A. K. (prx)


Lesenswert?

Lorenz schrieb:

> Entspricht die Codierung "0" dem SJW =1,

Ja.

> oder z.B die Codierung des BRP "4" einem Prescaler von 5?

Nein. Da steckt ein Faktor 2 mit drin.

Solltest du es so weit geschafft haben, ohne einen Blick ins 
Referenzhandbuch des Controllers zu riskieren? Das steht da nämlich 
drin.

Auch ganz nützlich: Die AN754 von Microchip. Die Register dort sehen 
nicht exakt so aus wie beim PIC30, aber ähnlich genug.

von (prx) A. K. (prx)


Lesenswert?

Ach ja, beliebter Fehler bei anfänglichen Tests: Ein CAN Bus mit nur 
einer Node, nämlich der sendenden, läuft unweigerlich auf einen Fehler 
beim Sender (ausser im sowieso busfreien Loopback-Mode). Mindestens eine 
zweite funktionsfähige Node muss aktiv(!) zuhören und bestätigen, dass 
was fehlerfrei vorbeikam, was sie auch dann tut, wenn nicht adressiert.

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.