www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN Kommunikationsproblem


Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

.

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: DIRK (Gast)
Datum:

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

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DIRK (Gast)
Datum:

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

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: DIRK (Gast)
Datum:

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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DIRK (Gast)
Datum:

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

Autor: DIRK (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DIRK (Gast)
Datum:

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

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallooooooo.....

Autor: Peter Mahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: DIRK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke das müsste so stimmen oder?

Autor: Atlan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sometimes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.