Forum: Mikrocontroller und Digitale Elektronik Can Baudrate 250kHz mit 8MHz Quarz


von Johannes (Gast)


Lesenswert?

Hallo, ich habe nochmal eine Frage zum CAN mit einem dspic30f6011a
ich habe ein 8MHz quarz angeschlossen und nehme ein PLL von 4. Daraus 
folgt
FCY = FOSC*PLL/4 = 8MHz*4/4 = 8Mhz
FCAN = 250kHz -> ein Bit=4us
BRP = 0
 -> TQ = 2*((BRP+2)/FCY) = 250ns
  -> NTQ = ((1/4us)/250ns)=16
diese 16 TQs habe ich wie folgt verteilt
SyncSeg - 1TQ
PropSeg - 4TQ
PhaseSeg1 - 4TQ
PhaseSeg2 - 4TQ
sprungweite - 3TQ

Wenn ich jetzt den CANalyzer anschliesse findet er die Baudrate nicht. 
Wenn ich ihn auf 250kHz anschliesse, gibt es nur ErrorFrames.
Aber eigentlich habe ich doch alles richtig eingestellt oder?

der Quarz läuft eigentlich richtig. Das habe ich mit einer LED getestet, 
die im Sekundentakt geblinkt hat.

von Johannes (Gast)


Lesenswert?

Hatte da eh einen Fehler drinne.
habe die TQs jetzt wie folgt aufgeteilt
SyncSeg - 1TQ
PropSeg - 4TQ
PhaseSeg1 - 6TQ
PhaseSeg2 - 5TQ
Sprungweite - 4TQ

So, dass ich mit SyncSeg, PropSeg, PhaseSeg1 und PhaseSeg2 auf 16 TQ 
komme. Aber auch da kann wird die Baudrate nciht mit 250kHz erkannt. 
auch wenn ich die Werte ändere findet er nichts. bei manchen 
kombinationen, z.B.
SyncSeg(1TQ), PropSeg(5TQ), PhaseSeg1(5TQ), PhaseSeg2(5TQ) und 
Sprungweite(4TQ) bekomme ihc Baudraten mit 83.3, 190.5, 228.6 und 285.7 
kHz. Also der CAN funktioniert ja anscheinend. Aber leider absolut nicht 
so wie ich möchte.

Gibt es da noch irgendwelche Regeln, die man beachten muss?
Im Datenblatt von Microchip sind nur die Regeln
PropSeg + PhaseSeg1 >= PhaseSeg2
PhaseSeg2 > Sprungweite
und die habe ich eingehalten

von otto (Gast)


Lesenswert?

Tq = 500ns.....

von codehamster (Gast)


Lesenswert?

Ich habe für einen PIC18FK80 dieses Tool verwendet um die Einstellungen 
zu ermitteln

http://www.intrepidcs.com/support/mbtime.htm

Gruss Codehamster

ev. nützt es dir auch was mit dem ds-pic

von codehamster (Gast)



Lesenswert?

Hier mal die Konfig als PDF.
Sollte eigentlich passen.

Die Register-Konfiguration steht gleich drin.

von Johannes (Gast)


Lesenswert?

Hatte mich ganz oben verschrieben. es ist
TQ = 2*((BRP+1)/FCY). Damit kommt man dann auf 250ns.
Das Programm hatte ich auch schon einmal gesehen. Wonach verteilt das 
Programm denn die anzahl der TQs in den einzelnen Phasen?
Komme leider erst Montag wieder dazu. Trotzdem schon einmal recht 
herzlichen dank.

von Thomas F. (igel)


Lesenswert?

Johannes schrieb:
> Wonach verteilt das
> Programm denn die anzahl der TQs in den einzelnen Phasen?

mbtimer zeigt dir mögliche Lösungen an und du kannst dir eine aussuchen.

von Bad U. (bad_urban)


Lesenswert?

Johannes schrieb:
> Wonach verteilt das
> Programm denn die anzahl der TQs in den einzelnen Phasen?

Das Programm kenne ich jetzt nicht. Ich habe die Einstellungen beim 
PIC18 von Hand gemacht. Schau Dir mal die AN754 an da ist es genau 
erklärt mit Beispielen.

So grob aus dem Kopf.... Die Länge des Prop-Seg ist abhängig von der 
Länge der Leitung und der Ausbreitungsgeschwindigkeit. Der 
Abtastzeitpunkt für ein Symbol solle nach der AN bei 80% der Bitzeit 
liegen. Das ist zwischen Phase-Seg. 1 und 2. Danach kannst Du die beiden 
Segmente aufteilen. Was mir komisch vorkommt ist die grosse SJW. Bei 
quarzgenauigkeit bin nich da nie über 1 gekommen. uns selbst bei einem 
Resonator, der ja Zehnerpotenzen schlechter ist, rechnerisch maximal auf 
3.

Schau Dir mal die AN an. Anhand der hatte es bei mir auf Anhieb 
funktioniert.

Was noch sein kann, dass bei Deiner Taktfrequenz in Verbindung mit der 
Baudrate und Anzahl TQ kein Ganzzahliges BRP rauskommt. Das könnte auch 
ein Grund sein, dass die Baudrate sich verschiebt.

Edit: Hab noch gesehen, dass Du die PLL verwendest. Die hat IMHO keine 
so große Genauigkeit. Dann kann das mit der SJW schon passen.

von Johannes (Gast)


Lesenswert?

So, ich verstehe es nicht. Zunächst schon einmal danke für die 
Antworten. Die AN754 habe ich mir auch schon vorher durchgelesen gehabt 
und da ist mir auch einiges klar geworden. Aber mich hat es halt 
gewunder, dass es nicht funktioniert hat.
Ich habe jetzt einen 6MHz Quarz genommen
1
_FOSC(CSW_FSCM_OFF & XT_PLL8);  //Run this project using an external crystal routed via the PLL in 8x multiplier mode
2
_FWDT(WDT_OFF);                 //Turn off the Watch-Dog Timer.
3
_FBORPOR(MCLR_EN & PWRT_OFF);   //Enable MCLR reset pin and turn off the power-up timers.
4
_FGS(CODE_PROT_OFF);            //Disable Code Protection
5
...
6
C1CFG2bits.SEG2PHTS = 1;
7
C1CFG1bits.BRP = 1;
8
C1CTRLbits.CANCKS = 0x01;
9
C1CFG1bits.SJW = 0x01;  // 2TQ
10
C1CFG2bits.SEG1PH = 0x03;  // 4TQ
11
C1CFG2bits.SEG2PH = 0x03;  // 4TQ
12
C1CFG2bits.PRSEG = 0x02;  // 3TQ
13
...

geht es. aber mit einem 8MZh Quarz und
1
_FOSC(CSW_FSCM_OFF & XT_PLL4);  //Run this project using an external crystal routed via the PLL in 4x multiplier mode
2
_FWDT(WDT_OFF);                 //Turn off the Watch-Dog Timer.
3
_FBORPOR(MCLR_EN & PWRT_OFF);   //Enable MCLR reset pin and turn off the power-up timers.
4
_FGS(CODE_PROT_OFF);            //Disable Code Protection
5
...
6
C1CFG2bits.SEG2PHTS = 1;
7
C1CFG1bits.BRP = 0;
8
C1CTRLbits.CANCKS = 0x01;
9
C1CFG1bits.SJW = 0x00;  // 1TQ
10
C1CFG2bits.SEG1PH = 0x07;  // 8TQ
11
C1CFG2bits.SEG2PH = 0x05;  // 6TQ
12
C1CFG2bits.PRSEG = 0x00;  // 1TQ
13
...
funktioniert es nicht.

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.