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
orenz schrieb: > Leider funktioniert der CAN-Bus mit diesen Einstellungen nicht. Was > mache ich falsch? Funktioniert der Loopback-Test?
Was ist ein loopback test? und wie kann ich den durchführen?
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.
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!
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.