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.
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
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
Hier mal die Konfig als PDF. Sollte eigentlich passen. Die Register-Konfiguration steht gleich drin.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.