Forum: Mikrocontroller und Digitale Elektronik CAN Kommunikationsproblem


von DIRK (Gast)


Lesenswert?

Hi!

Was ich wissen will ist, wie muss ich das Verbindungskabel terminieren?
Ich benutze jeweils den CAN Tranciever82C250 (Baudrate 50Kbit/s bzw.
100KBit/s, SJA1000).
Wenn ich ein Telegramm zur anderen Station sende, dann bleibt bei mir
das Programm hängen. Offensichtlich bleibt das Programm bei der Sende
Funktion hier stehen -->

do
   {
   }
while (((canreg_read(2))&0x08)== 0);    //warten bis Sendung fertig
                                          // Nachricht senden.
Was kann da die Ursache sein?

von Rufus T. Firefly (Gast)


Lesenswert?

Hast du auch die Abschlusswiderstände richtig berechnet.
Das war mal bei mir ein Problem.

von DIRK (Gast)


Lesenswert?

Ich habe jetzt mal zwei mal 120Ohm Widerstande zwischen CAN Low und CAN
High angeschlossen. In der Firma wo ich arbeite setzten wie eine CAN
Hardware von Vector Informatik ein. Da ist das CANCab für HighSpeed mit
zwei mal 120Ohm abgeschlossen.

Was kann das bedeuten wenn das Programm beim senden da hängen bleibt?

von DIRK (Gast)


Lesenswert?

Kannst du mir sagen wie ich diese berechnen kann?
(Baudrate habe ich bei mir auf 50KBit/s eingestellt)

Ich habe jetzt mal zwei mal 120Ohm Widerstande zwischen CAN Low und
CAN
High angeschlossen. In der Firma wo ich arbeite setzten wie eine CAN
Hardware von Vector Informatik ein. Da ist das CANCab für HighSpeed
mit
zwei mal 120Ohm abgeschlossen.

Was kann das bedeuten wenn das Programm beim senden da hängen bleibt?

.

von ---- (Gast)


Lesenswert?

> Was kann das bedeuten wenn das Programm beim senden da hängen bleibt?

Das bedeutet, daß diese Schleife hier:
> while (((canreg_read(2))&0x08)== 0);
nicht verlassen wird!
Oder wolltest du wissen was (((canreg_read(2))&0x08)== 0) bedeutet?

PS: DIRK==shazter?

----, (QuadDash).

von ---- (Gast)


Lesenswert?

> Kannst du mir sagen wie ich diese berechnen kann?
Die braucht man praktisch nicht zu berechnen - man nimmt einfach 2x 120
Ohm und gut is. Wert für Laboraufbauten/-kabellängen überhaupt nicht
kritisch!

----, (QuadDash).

von DIRK (Gast)


Lesenswert?

Danke für die Hilfe!

Was könnte noch dazu führen, das mein Programm hier nicht weiterkommt?
Die Initialisierung funktioniert auf beiden Seiten ohne Probleme. Dies
habe ich auch geteset indem ich die Register dann gleich wieder
auslese. Hmmm....
Ich komme da nicht weiter....

von DIRK (Gast)


Lesenswert?

Beide Schaltungen habe ich mit einem funktionierenden CAN Partner
getestet. Wie gesagt nur die beiden können nicht kommunizieren.

von DIRK (Gast)


Lesenswert?

Folgendes habe ich jetzt erfahren woran es bei mir liegen könnte:
Die Spielregel bei CAN lautet: mindestens ein Teilnehmer muss die
gesendete Nachricht im Acknowlege -Slot bestätigen.
Bisher hat das der PEAK-Dongle übernommen. Fehlt er, kommt von Ihm
keine Bestärigung und offenbar  wird Sie vom anderen Teilnehemr nicht
geschickt.

So jetzt weiss ich allerdings nicht wie ich bei mir per Software den
Acknowledge Slot bestätigen kann?
Kann ich dies überhaupt machen?

von ---- (Gast)


Lesenswert?

Nein, kannst du nicht. Wenn beide korrekt initialisiert sind und am Bus
hängen, dann wird das ACK-Bit auch automatisch von der CAN-Hardware
gesetzt (ohne SW-Einfluß).

Hast du mein Posting von: Datum: 15.04.2005 18:39 schon gelesen?
Was bedeutet denn das Bit3 in canreg_read(2)?

> mindestens ein Teilnehmer muss die gesendete Nachricht im
> Acknowlege-Slot bestätigen.
Hast du das aus dem Wiki gelesen? (Dann wars ja gut, daß ich gestern
die Anm. hinzugefügt habe :-)

----, (QuadDash).

von DIRK (Gast)


Lesenswert?

Das Bit3 in canreg_read(2) bedeutet:
Transmit Buffer Status(Durch dieses Bit wird gezeigt wie der Status im
Transmit Buffer gerade ist)
Aber warum die Frage?

Hmmm...was könnte noch die Ursache sein?

von DIRK (Gast)


Lesenswert?

Dieser Ausdruck bedeutet -->while (((canreg_read(2))&0x08)== 0);

VALUE 1= complete; the last requested transmission has been
successfully completed
VALUE 0= incomplete; the previously requested transmission is not yet
completed

von ---- (Gast)


Lesenswert?

> the previously requested transmission is not yet completed
weil: (z.B.)
- kein Zugang zum anderen Knoten (für die ACKs) - Kabelbruch?
- CAN-Leitungen vertauscht
- Verbindung zwischen CAN-Controller und CAN-Transceiver
unterbrochen/vertauscht/Kurzschluß?
- Baudrate falsch (dir ist schon klar, daß du alle Teilnehmer auf die
gleiche Baudrate einstellen mußt...)
- irgendwo Hardwaredefekt

Viel mehr kommt eigentlich nicht in Frage.

Deshalb: Oszi anschließen (Analogoszi reicht), wenn du ein stehendes,
ruhiges Bild bekommst und dich wunderst warum du jedes einzelne Bit der
CAN-Nachricht sehen kannst und alles sauber getriggert bekommst, dann
liegt das daran, daß der CAN-Teilnehmer kein ACK bekommt und dauernd
versucht seine Botschaft loszuwerden. :-)

----, (QuadDash).

von Stefan Kleinwort (Gast)


Lesenswert?

>> the previously requested transmission is not yet completed
>weil: (z.B.)
>- kein Zugang zum anderen Knoten (für die ACKs) - Kabelbruch?
>- CAN-Leitungen vertauscht
>- Verbindung zwischen CAN-Controller und CAN-Transceiver
>unterbrochen/vertauscht/Kurzschluß?
>- Baudrate falsch (dir ist schon klar, daß du alle Teilnehmer auf die
>gleiche Baudrate einstellen mußt...)
>- irgendwo Hardwaredefekt
>
>Viel mehr kommt eigentlich nicht in Frage.

Noch einen Grund könnte es geben: 2 CAN-Knoten senden exakt die gleiche
Botschaft -> Buskonflikt -> ständige Wiederholung der msg.
Kann z.B. vorkommen, wenn man auf mehrere Knoten dieselbe Testsoftware
spielt.

Viele Grüße, Stefan

von DIRK (Gast)


Lesenswert?

Hallo vielen Dank für die Tipps.
Die beiden Stationen habe ich folgendermaßen so verbunden:
CAN LOW  -------- CAN LOW
             |
             -
            | | 60 Ohm Widerstand
            | |
             -
             |
CAN HIGH -------- CAN HIGH

Das stimmt doch oder? Da ich eine kurze Verbindung habe, habe ich bei
einer Station gleich einen 60 OHM Widerstand eingelötet.

von ---- (Gast)


Lesenswert?

> ständige Wiederholung der msg. Kann z.B. vorkommen, wenn man auf
> mehrere Knoten dieselbe Testsoftware spielt.
Stimmt. Denn normalerweise wird eine CAN-Botschaft ja nur wiederholt,
wenn kein zweiter CAN-Teilnehmer am Bus ist (genauer: wenn es kein ACK
gibt). Da ja aber beide gleichzeitig senden, erwarten beide ein ACK von
außen und geben selbst keins. (Gleichzeitig bedeutet innerhalb einer
Bitzeit). Deshalb geht auch nicht der Tx-Errorcounter hoch und führt
auch nicht zum BusOff...

----, (QuadDash).

von DIRK (Gast)


Lesenswert?

Die eine Station habe ich den SJA1000 an einem AVR angeschlossen und die
andere Station, da habe ich den SJA1000 direkt an der Centronix
Schnittstelle angeschlossen. Das Programm dafür habe ich mit Borland
Builder C++ geschrieben. Definitiv sende ich "nicht" gleichzeitig die
gleichen Botschaften auf allen Stationen. Ich versuche die ganze Zeit
von PC auf Mikrocontroller eine Botschaft zu senden.

von ---- (Gast)


Lesenswert?

@DIRK: Geh mal auf die Punkte ein, die hier aufgezählt wurden, sonst
macht das keinen Sinn. So weiß keiner, ob du das verstanden hast und ob
das Problem evtl. woanders bzw. tiefer zu suchen ist... so kann nur
rumgeraten werden!
Und ja, deine Terminierung ist so in Ordnung.

----, (QuadDash).

von DIRK (Gast)


Lesenswert?

Folgende Punkte habe ich jetzt mal geprüft:
-Kabelbruch liegt nicht vor.
-Die Leitungen habe ich nicht falsch angeschlossen bzw. vertauscht.
-Beide Stationen habe ich mit 50kBit/s initialisiert.

von DIRK (Gast)


Lesenswert?

Und noch was. Ich sende nicht von allen beiden Stationen gleichzeitig
bzw die gleiche ID.

von ---- (Gast)


Lesenswert?

Aha, also die 2 Teilnehmer, die an unterschiedlicher Software/Hardware
hängen. Ich bin davon ausgegangen, daß beide Can-Teilnehmer identisch
aufgebaut sind, und davon nur einer funktioniert.
Aber jetzt kann der Fehler ja überall sein...
Du siehst, die Infos tröpchenweise zu liefern ist keine gute Idee.

----, (QuadDash).

von DIRK (Gast)


Lesenswert?

Nein, beide Teilnehmer habe ich zuvor mit dem CAN Dongle von PEAK
getestet. Funktionierte ohne Probleme. Leider habe ich den Dongle nicht
mehr.

von Stefan Kleinwort (Gast)


Lesenswert?

Die 60 Ohm sollten schon passen. Leider kann ich Dir keine weitere Idee
bieten. Hast Du ein Oszi? Tu sich überhaupt was auf dem Bus? Sind die
CAN-Treiber ordentlich eingeschaltet (nicht Standby, PWDN, etc.)?

Stefan

von DIRK (Gast)


Lesenswert?

Hmmm...leider habe ich kein Oszi! Ich wollte mir ein besorgen, aber die
sind halt sehr teuer.

von DIRK (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!!!!

Oh...hmmm...ich bin am verzweifeln. Ich kann noch als nichts empfangen
bzw. senden. Wenn ich vom PC aus zu der anderen Station sende, dann
bleibt mein Programm beim senden immer hängen. Misst misst. Der andere
Teilnehmer den ich mit dem AVR +SJA1000 realisiert habe, da sehe ich
das das Register SR(Steuergerregister) = 0x4C anzeigt.
Siehe Anhang.

Ich muss dies zum laufen bringen. Hmmm..leider habe ich kein Oszi. Was
kann ich noch benutzen, außer ein Oszi? Womöglich bleibt mir nichts
anderes übrig als ein Oszi zu beschaffen.

von DIRK (Gast)


Lesenswert?

Wie gesagt vor ein paar Wochen habe ich beide Teilnehmer an einem
funktionierenden CAN Dongle getestet. Ergebnis: i.O.
1. Teilnehmer AVR + SJA1000
2. Teilnehmer PC(Centronix Schnittstelle) + SJA1000

von DIRK (Gast)


Lesenswert?

Biite bitte helft mir. Ich weiss nicht was ich weiter tun kann, damit
meine beiden CAN Teilnehmer funktionieren.

von DIRK (Gast)


Lesenswert?

Hallooooooo.....

von Peter Mahler (Gast)


Lesenswert?

Hallo  Dirk,

Der Wert 0x4C interpretiere ich als Fehler in der Übertragung.
Kontrollier nochmal die Einstellung deiner Bit-Timing-Register, ob die
Wirklich gleich sind.


Denkbar wäre auch dass der eine im Pelican-Mode arbeitet und
Extendend-ID's sendet, das würde dir in Verbindung mit dem Peak-Dongle
u.U gar nicht auffallen.

Weiterhin solltest du die ACC-Mask- und ACC-Code-Register setzten
(..Wert 0, soweit ich weiss...) damit keine Botschaften gefiltert
werden.

Gruss,
Peter

von DIRK (Gast)


Lesenswert?

Das ist meine Initialisierung Routine für beide Teilnehmer.
(50KBit/s)
Ist da was falsch?

/*----Initialisierungsroutine für den CAN-Controller
SJA1000------------*/
void TForm1::can_init(void)
{
 do
  {
   canreg_write(0,0x01);
  }
 while (((canreg_read(0)) &0x01)==0);

 canreg_write(4,0xFF);
 canreg_write(5,0xFF);
 canreg_write(6,0x43);
 canreg_write(7,0x2F);
 canreg_write(8,0x1A);
 canreg_write(31,0x07);

 do
  {
   canreg_write(0,0x00);
  }
 while (((canreg_read(0))&0x01)== 1);
 //canreg_write(1,0x0C);
}

von DIRK (Gast)


Lesenswert?

Ich denke das müsste so stimmen oder?

von Atlan (Gast)


Lesenswert?

Die einstellung im Acceptance code Register ist egal (ACR) nur im
Acceptance Mask Register MÜSSEN alle Bits auf 1 gesetzt werden, damit
kein Filter aktiv ist.

von Sometimes (Gast)


Lesenswert?

Grüß dich,

also der Can-Bus muß links und rechts am Ende mit jeweils 120Ohm
abgeschlossen werden sonst wird das nix mit den Datenübertragen.

Ist die selbe Geschichte wie bei den alten Koax-Netzwerkkabeln.

lg,

Michael

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.