Guten Morgen zusammen. Ich versuche, die Kommunikation zweier AT90CAN32 über CAN aufzubauen. Einer ist der Sender und der andere der Empfänger. Der Sender soll auf Tastendruck eine CAN-Nachricht verschicken und der Empfänger dann die gewünschte Aktion ausführen. Die ID ist immer die gleiche. Nun habe ich folgendes Problem: Ich debugge live mit AVR-Studio über den Atmel JTAGICE MKII und beobachte, was beim Empfänger ankommt. Sobald ich beim Sender die Taste drücke, wird beim Empfänger ein Interrupt ausgelöst. Ursache: Bit-Stuffing Error. Was kann die Ursache dafür sein? Wer hat Erfahrungen damit? Die Baud-Rate ist bei beiden auf 100kb/s eingestellt. Die Verbindung zwischen den Controllern erfolgt über ein geschirmtes Kabel mit der Länge von ca. 0.5m. Muss ich im Kabel vielleicht ein Abschlusswiderstand einlöten? Oder liegt die Ursache beim Sender? Für Eure Antworten wäre ich sehr dankbar.
CAN funktioniert ohne mindestens einem Abschluss nicht. Egal wie kurz das Kabel ist. Grund: Den dominant state (Pegeldifferenz) erzeugt der Treiber aktiv. Den recessive state (Pegelgleichheit) erzeugt der Abschlusswiderstand.
Hast du denn überhaupt Transceiver dran? Und ja, die Leitung muss terminiert sein. Üblicherweise macht man das aber direkt am Transceiver. Wo hast du den CAN32 her? Ist bei mir auch vorgesehen, ist im Moment der CAN128 drin, weil die kleineren Brüder nicht erhältlich waren. Habe mich aber schon 1 Jahr nicht mehr drum gekümmert.
Als Tranceiver verwende ich PCA82C251T. Die CAN32 hatten wir noch auf Lager. Ich werd mal nen 120 Ohm Widerstand zwischen CAN-H und CAN-L hängen und sehen was passiert. Danke schonmal für die Antworten.
Der Abschlusswiderstand hat nichts gebracht. Hat sonst noch jemand eine Idee?
Bitstuffing error klingt nach Kabel oder Bitrate. Mehr lässt sich aufgrund des immensen Übermasses an Information schlecht sagen.
Die Bitrate ist bei beiden auf 100kb/s eingestellt. Könnte es vielleicht ein Problem sein, dass der Sender einen 12MHz und der Empfänger einen 8MHz Oszillator hat? Welche Informationen brauchst Du noch? Etwa ein Code-Schnippsel?
Wenn die Bitratenparameter entsprechend angepasst sind... Wenn die aber auf beiden Nodes gleich sind, können nicht auf beiden Nodes gleichermassen 100Kbps rauskommen.
Ich initialisiere bei beiden Controllern den CAN so:
1 | CAN128_Init(0x0a, 0x0e, 0x4b); |
In der entsprechenden Routine wird dann ausgeführt:
1 | extern void CAN128_Init (uint8_t bt1, uint8_t bt2, uint8_t bt3) |
2 | {
|
3 | ...
|
4 | CANBT1 = bt1; |
5 | CANBT2 = bt2; |
6 | CANBT3 = bt3; |
7 | ...
|
8 | }
|
Müssen die Parameter bt1, bt2 und bt3 auf den Oszilator abgestimmt werden?
Was machst Du mich jetzt so blöd an? Es sind eben nicht alle so super Intelligent wie Du, Du Superhirn. Es gibt eben immer noch solche, die noch nicht lange mit Mikrocontrollern arbeiten und denen solche Sachverhalte nicht ganz klar sind. Da sollte man doch etwas Verständnis zeigen können und nicht gleich beleidigend werden.
Du bist seit Wochen in dem CAN Thema drin, stellst eine Frage nach der anderen (ok) und hast es in der ganzen Zeit geschafft, um das grundlegende Thema Bitraten/Samplepoint/... von CAN herum zu kommen (nicht ok, gibt genug Doku dazu, schau dich beispielsweise mal bei Microchip um). Und dann weise ich darauf hin, dass es ein Bitratenproblem sein kann und kriege die Antwort, nein, es seien auf beiden Seiten 100Kbps. Sorry, aber da komme ich mir verarscht vor. Bei einer UART würdest du ja auch nicht den Bitratenteiler (baud rate) eines 8MHz AVR unverändert auf einem 12MHz AVR verwenden.
dann überlege mal selber: -alle internen Takte werden vom Haupttakt abgeleitet und sind demzufolge ganzzahlige Teile davon -um auf einen identischen Takt für die Peripherie zu kommen, müssen bei unterschiedlichen Quarzfrequenzen unterschiedliche Teiler benutzt werden. -oft genug muss man dabei einen Spagat machen, nicht alles lässt sich perfekt unter einen Hut bringen -> Kompromisse.
Hier liegt ein Missverständnis vor. Ich habe mit keinen Worten gesagt, es sei kein Bitratenproblem. Ich wollte Dir nur zeigen, wie ich in meiner Routine die Bitrate einstelle und habe anschliessend gefragt, ob ich die Werte auf die Oszillatoren abstimmen muss. Vielleicht brauchst DU eine Brille.
Ich werde Euch nicht mehr mit dem Thema belästigen. Ich habs hingekriegt. Trotzdem Danke.
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.