Guten Morgen, eine Nachricht mit gesetztem RTR darf keine Daten besitzten. Vielmehr ist doch diese Nachricht eine Aufforderung zu antworten. Die Antwort ist eine normale CAN Nachricht mit gleicher ID und nicht gesetztem RTR. Damit kann man z.B. einen Sensor pollen, falls man keine regelmäßigen Updates der Meßwerte braucht. Das RTR Bit gilt als gesetzt, wenn es den Wert 1 hat. Also das verstehe ich unter REMOTE FRAME. Jetzt möchte ich aber mit dem XC888 Starter Kid Board eine definierte Nachricht senden, sobald eine Aufforderung (RTR Bit gesetzt) vom CAN Dongle (MASTER) empfangen wird. Wie ist da das Handling auf der Mikrocontroller seite? CAN Dongle sendet Aufforderung: CAN-ID=0x002, DLC=1, RTR-Bit=1 XC888 Board: wartet auf Aufforderung (CAN-ID=0x002, RTR-Bit=1) Wenn Aufforderung empfangen wurde, sende eine NAchricht mit der CAN-ID=0x005, DLC=1, DatenByte=0x55
Wie kann ich die Aufforderung vom CAN Dongle zyklisch im XC888 überprüfen? Muss ich den Status abfragen?
Wie kann in DAVE ein Message Objekt für dem Empfang angelegt werden, so dass das REMOTE Bit aktiv ist?
Hey, nicht jeder hier im Forum hat Ahnung vom CAN-Bus und dessen Programmierung. Ich leider auch nicht. Deine Fragen sind ja dahingehend ziemlich speziell. Also Geduld...
Ich habe mir mal eine Funktion geschriben mit der ich die Daten vom Remote Frame erhalte. Zuerst lade ich den ganzen Code in den XC888, anschließend starte ich den Dongle auf dem PC und sende von dort aus eine CAN Nachricht. Danach sehe ich auf dem Empfangsfenster vom Dongle ein Remote Request. Also ich komme mit dem ganzen Remote Zeugs ´nicht so recht auf einen grünen Zweig. Benötige dringend hilfe!!!!!
Das gibt es doch nicht. Es müsste doch jemand geben der hiermit Erfahrung hat. Ich komm da nicht weiter!
Wenn schon niemand diesen Mikrocontroller kennt, kann mir wenigstens jemand genauer erklären wie der REMOTE Betrieb unter CAN funktioniert?
Ich möchte ein Master/Slave-System aufbauen. Der PC ist der Master (CAN Dongle). Der Master liest Daten vom XC888 Board aus und überträgt an die Slaves (weitere XC888 Boards). Dies bedeutet doch, dass ich eine Anfrage mit CAN realisieren muss. Bin total planlos. Die Doku vom XC888 ist nicht gerade so toll.
Da ich zur Zeit kein zweites Board habe, kann ich die Funktionalität des REMOTE Betriebes nicht ganz testen. Mit dem CAN Dongle starte ich eine Anfrage. Der SLAVE 0 zum Beispiel sendet dann daraufhin eine CAN Anchricht. Diese CAN NAchricht soll dann zum Beispiel der SLAVE 1 empfangen und auswerten. Hiemit sende ich eine Anfrage (CAN Dongle): Das MO3 habe ich als Transmit konfiguriert. Dazu habe ich noch das Remote Monitoring aktiviert. CAN_vGetMsgObj(3, &canTransmitObject); canDataObject.ubDB[3] = 0x88; canTransmitObject.ulDATAL = canDataObject; CAN_vConfigMsgObj( 3, &canTransmitObject ); Hat jemand damit schon Erfahrungen gemacht?
Mit dem REMOTE Betrieb habe ich noch so meine Schwierigkeiten. Und zwar funktioniert das Senden von einer Anfrage und anschließend das Empfangen nur mit einem Message Objekt richtig. REMOTE Anfrage starten, warten, Daten dann abholen: char GetDatenRemoteFrame( char cMONr, char cDataByte ) { pdata stCAN_SWObj canTransmitObject; if( CAN_ubNewData(cMONr) ) { CAN_vReleaseObj(cMONr); } CAN_vTransmit(cMONr); Warten(500); CAN_vGetMsgObj(cMONr, &canTransmitObject); CAN_vReleaseObj(cMONr); return canTransmitObject.ulDATAL.ubDB[cDataByte]; } void main(void) { .... while(1) { P3_DATA = GetDatenRemoteFrame( 2, 3 ); P3_DATA = GetDatenRemoteFrame( 3, 3 ); } } REMOTE FRAME senden: canDataObject.ubDB[3] = 0x01; canTransmitObject.ulDATAL = canDataObject; CAN_vConfigMsgObj( 2, &canTransmitObject ); Sobald ich dies mit einem weiteren MO realisieren möchte, ändern sich auch die Nutzdaten von diesem MO, anhängig was ich bei MO2 eingestellt habe. In Dave habe ich weitere Funktionen entdeckt. CAN_ubRequestMsgObj CAN_vLoad... Muss ich wahrscheinlich beim senden der Nachricht statt die Funktion CAN_vConfig.... die Funktion CAN_vLoad... verwenden?
Sorry hab mich vertippt. Kann ich überhaupt mehrer Remote Frames anfordern?
Also Remoteframes haben wir noch nie benutzt. Der eine Teilnehmer schickt ne Anfrage und der andere dann die Antwort. Beides sind ganz normale Daten. Wußte bisher garnicht, daß es überhaupt Remoteframes gibt. Wozu sollen die gut sein ? Peter
Hallo Peter, vielleicht sollte ich vorsichtig sein mit dem Begriff Remoteframe. Ich meine damit, dass eine Teilnehmer eine Anfrage sendet und der andere kann dann darauf antworten. Der Begriff Remoteframe sollte man streichen. Kansst du mir zu dem obigen Beitrag "10.07.2007 08:35" helfen?
Die CAN-Bibliothek von DAVE kenne ich nicht. Wenn Du zu der CAN-Bibliothek keine ausführliche Beschreibung hast, würde ich sie nicht benutzen. Ich benutze den AT89C51CC03 und programmiere ihn direkt in C (Keil C51), also ohne irgendwelche fremden Bibliotheken. Peter
Also Dave ist schon ein super Programm, das von der Firma Infineon entwickelt wurde. Mir geht es primär darum, wer schon mit dem XC888 den Remote Betrieb verwendet hat und wofür die Funktionen CAN_ubRequestMsgObj , CAN_vLoad... eingesetzt werden.
Vergiß die Remoteframes. Das ist eine Merkwürdigkeit des CAN-Protokolls, dass kaum jemand benutzt (auch dein CANOpen nicht). Vielleicht solltest du dich auch mal von DAVE losreißen und versuchen, dass was du da machst, auch zu verstehen. Dazu gehört die Erkenntnis, dass es im CAN-Protokoll per se keine Master oder Slaves gibt. Der CAN-Bus arbeitet Ereignisorientiert. Natürlich kann man sich ein Protokoll ausdenken, das einen Master-Slave Betrieb implementiert. Macht aber nur in bestimmten Situationen Sinn. Um dir mal ein Beispiel zu geben, wie ich mein Protokoll aufgebaut habe: Die CAN Extended ID ist aufgebaut als Bit | Funktion =========================== 0-4 | Nicht benutzt 5-12 | MsgTyp (Art der Message, z.B. Action, Event, Firmwareupdate etc.) 13-20 | AbsenderID (jeder Teilnehmer hat eine eigene, einmalige ID) 22-29 | EmpfängerID oder 0 für Alle (bei 0 entscheidet der Empfänger, ob er die Message verwerten kann oder nicht). Der MsgTyp entscheidet darüber, wie der Datenblock (8 Bytes) aufgebaut ist. Ich beobachte deine Versuche schon eine Weile, und habe nicht den Eindruck, das du wesentlich weiterkommst. Es gab in deinen vielen Threads immer wieder wichtige Hinweise, die du mal etwas weiter verfolgen solltest. Möglicherweise solltest du auch mit etwas trivialerem anfangen, als dem Entwurf eines CAN-Protokolls (ein paar LEDs blinken lassen z.B.). Gruß, Matthias
Hallo, CAN Nachrichten kann ich senden und empfangen. Das tut prima. Deinen Aufbau der CAN-ID entspricht aber nicht dem CANOPEN Protokoll, oder sehe ich dies falsch. Du hast für dich eine eigenständige CAN-ID Zuordnung definiert. So sehe ich dies.
Meines Wissens nach rät CANOpen von der Verwendung von Remote Frames ab. Natürlich hat mein Protokoll nichts mit CANOpen zu tun, warum auch? Für meine Zwecke (Homeautomation) wäre CANOpen absoluter Overkill.
Ja wie sieht dann bei dir der Empfangsmechanismus aus? Tust du die ganze Zeit nach vorhandenen Nachrichten pollen?
Nein, ich benutze dafür natürlich den Empfangs-Interrupt. Was anderes würde auch keinen Sinn machen.
Hab da noch ein Verständnisproblem. Die Message Objekte werden für jeden Teilnehmer zuerst angelegt. Wie tust du dann in der ISR prüfen, ob die Nachricht, die auf dem Bus liegt, auch für diesen Teilnehmer bestimmt ist? Zum Beispiel: Nachricht mit ID 0x101 liegt auf dem Bus. Der Teilnehmer 2 soll diese Nachricht empfangen. leider hat dieser Teilnehmer kein Message Objekt mit der Nummer 0x101. Dies ist ja auch logisch. Muss dann jeder Teilnehmer ein Message Objekt besitzen, indem man alles empfangen kann?
Was ist ein Message-Objekt? Wenn eine Nachricht auf den Bus geht, empfangen alle Knoten die Nachricht (ich habe keine Filter aktiviert). Jeder Knoten prüft nun, ob die Nachricht für ihn relevant ist. Da überall die gleiche Software läuft, geschieht das über Konfigurationen im Knoten. Ein Beispiel: Ich drücke eine Taste eines Knotens. Dieser sendet eine Nachricht mit dem Typ "SENSOR" und seiner KnotenId im CAN Extended Id, und der ID der Taste im Datenbereich. Jeder Knoten prüft nun, ob er die Kombination aus KnotenId und TastenId in seiner Konfiguration hat, und wenn ja, löst den zugehörigen Aktor aus (schaltet ein Relais oder eine LED oder einen Motor etc.). Das ist etwas vereinfacht dargestellt, aber das Prinzip sollte klar werden.
Bei diesem Mikrocontroller XC888 ist es so, dass man mit einem Tool (Infineon) die Message Objekte jeweils nach Wunsch konfigurieren und erstellen kann. Dort kann ich auch den Filter einstellen und auch z.B. die ID Nummer. Ich müsste dann ein Message Objekt anlegen, das alle Nachrichten empfangen kann oder? Ich muss ja zuerst prüfen, ob die Nachricht auch für diesen Teilnehmer relevant ist. Das ist mein Problem.
Das hab ich ja auch schon zum Teil gemacht. Also so ist das nicht, dass ich nur das Tool Dave verwende.Ich glaub mich versteht keiner so richtig. 1.Muss ich bei allen Teilnehmern zuerst die Message Objekte definieren und erstellen? 2.Muss das Abitration Register permanent überprüfen werden, ob eine Nachricht anliegt oder nicht? 3.Hat die Nummer vom Message Objekt was mit der Nummer vom CAN-ID zu tun? Ich meine nein.
1. Ja, mind eines. Je mehr man hat, desto mehr kann man die Nachrichten in Hardware "vorselektieren" -> weniger Softwareaufwand, was bei einem 8-Bitter von Bedeutung sein kann 2. Ja, aber das macht es in Hardware 3. Nein, die Nummer deines MO hat nichts mit den zu empfangenden Messages (IDs) zu tun, dafür hast du ja das "Arbitration Register" + "Acceptance Mask"
Mit alles von Hand programmieren meinte ich, Datenblatt vom XC888 nehmen, lesen, und das senden und empfangen von CAN Messages in C von Grund auf implementieren. Dabei lernst du auch, wie das alles funktioniert und zusammenspielt. Alternativ kannst du auch den gesamten Quellcode deines von Dave erzeugten Programmes analysieren. Dieser Weg ist meistens steiniger als alles selber machen.
Damit Du was empfangen kannst, muß mindestes ein Object auf Empfang konfiguriert werden. Dazu gehört auch den ID und die ID-Maske entsprechend einzustellen, entweder nur auf einen ID, auf eine Gruppe oder alle. Je nach Chip (den XC888 kenne ich nicht) kann man nun mehrere Nachrichten puffern lassen, dann reicht ne Abfrage im Polling, ob was angekommen ist. Ohne Pufferung sollte man einen Interrupthandler mit Softwarepuffer (FIFO) aufsetzen. Nach dem Auslesen eines Objectes ist es automatisch wieder empfangsbereit, wenn man das entsprechende Bit zurückgesetzt hat. Peter
Ich werde zunächst erstmal ein Message Objekt für den Empfang anlegen. Den Filter verwende ich nicht. In diesem Message Objekt werde ich auch zuerst mal keine ID zuweisen (Abitration Register 0x000). Mit der Funktion GetMsg kann ich dann die Information während des Betriebes abfragen. z.B. die Daten, ID, DLC usw.
Gestern bin ich noch bis in die Nacht hinein am PC gesessen. Ich hab es nicht geschafft, welche Nachricht genau empfangen wurde. Bei der Konfiguration des Empfangs-Message-Objektes muss ich ja zuerst das Arbitration Register setzen und dann das Acceptance Mask Register. Für meine Anwendung möchte ich, dass wenn eine Nachricht auf dem BUS anliegt zuerst prüfen ob ich die Nachricht mit der ID empfangen möchte oder nicht.
Gibt es hier niemand der sich mit dem XC888 auskennt? Ich komme da nicht weiter.
Hallo Peter, ich kann das Message Objekt so konfigurieren, dass ich eine ID, eine Gruppe oder auch alle empfangen kann. Aber ich kann jetzt nicht explizit eine ID prüfen. Wenn ich alle ID's durchlasse, dann weiss ich ja nicht ob die ID z.B. 0x101 oder 0x005 ist. Das weiss ich halt nicht , wie man dies auf dem XC888 realisieren könnte.
Patrick wrote: > Aber ich kann jetzt nicht explizit eine ID prüfen. Wenn ich alle ID's > durchlasse, dann weiss ich ja nicht ob die ID z.B. 0x101 oder 0x005 ist. > Das weiss ich halt nicht , wie man dies auf dem XC888 realisieren > könnte. Also beim AT89C51CC03 besteht ein Message Object aus mehreren Feldern, dem Längenbyte, dem ID und dem Datenfeld. Würde mich wundern, wenn es beim XC888 nicht so ist. Ich hab gerade mal bei Infineon geguckt, hätte nicht gedacht, daß die auch endlich mal 8051-er mit Flash bauen. Dürfte allerdings schwer werden, sich gegen die vielen bereits etablierten Flash-8051-Hersteller durchzusetzen. Das Datenblatt ist allerdings ein Witz, da sind nur 2 Seiten zum CAN drin, damit kann man überhaupt nichts anfangen. Beim Atmel sinds 44 Seiten. Ohne vernünftiges Datenblatt können se den Chip gleich wieder einstampfen. Peter
Hallo Peter, da muss ich dich leider korrigieren. Im UsersManual stehen ca. 100 Seiten zum Thema CAN. Des weiteren gibt es mehrer AppNotes dazu und im asiatischen Raum ist dieses Device der absolute Renner. In der deutschen Automobil-Industrie wird er ebenfalls in sehr großen Stückzahlen eingesetzt. @Patrick: Wenn du alle IDs zulässt, dann steht die ID der empfangenen Nachricht in dem MOAR-Register
CAN-Busfahrer wrote: > Hallo Peter, > da muss ich dich leider korrigieren. Im UsersManual stehen ca. 100 > Seiten zum Thema CAN. Dann wäre es vielleicht keine blöde Idee, dieses Manual auch auf der Webseite zum Download anzubieten. Die Infineon-Webseite ist grauenvoll. NXP ist aber auch nicht besser. Atmel ist ganz gut, da findet man alles. Peter
Ich hab mal dieses MOAR-Register ausgelesen. Da sehe ich immer die ID die ich auch im MOAR-Register eingestellt habe. Das Acceptance Mask Register steht bei mir auf 0x000. Damit kann ich alle ID's durchlassen. Also das mit dem XC888 macht macht mich noch ganz wahnsinnig.
Da ich die ID und die Datenlänge schon bei der Planung (z.B. mit DAVE) des CAN-Netzwerkes festlege, bringt das Auslesen der ID und Datenlänge ja gar nichts. Die ID wird bei der Initialiserung (vom DAvE) festgelegt und danch nicht mehr verändert. Vorher habe ich den CAN Controller SJA1000 verwendet. Da war es wirklich anders. Ich konnte mit dem die CAN-ID's herausfinden die auf dem BUS aktuell liegen.
Mit dieser Funktion kann ich die Daten von einem angelegten Message Objekt auslesen. Id kann ich zwar lesen, allerdings wurde diese ID schon bei der konfiguration des Message Objektes angelegt. Bin für jede Hilfe sehr dankbar.
Sehen ja ganz nett aus, die Daten des XC888 und da es ein 8051 ist, könnt ich ihn auch ganz easy mit dem ollen Keil C51 programmmieren. Bloß leider kommt er viel zu spät, bei uns werkeln überall schon T89C51CC01 und AT89C51CC03 rum und ein funktionierendes System wechselt man nicht gerne. Peter
Patrick wrote: > Mit dieser Funktion kann ich die Daten von einem angelegten Message > Objekt auslesen. Id kann ich zwar lesen, allerdings wurde diese ID schon > bei der konfiguration des Message Objektes angelegt. ??? Also Du setzt die Maske auf 0, dann kommt alles durch, der ID ist wurscht. Dann wartest Du, bis ne Nachricht empfangen wurde, d.h. das entsprechende Bit im Message Objekt gesetzt wurde. Nun kannst Du den ID und die Nachricht auslesen. Peter
Guten Morgen Peter, ok die Maske habe ich ja schon auf 0x00 gesetzt. Da kommen dann auch alle CAN ID's durch, nur kann ich nicht expliziet herausfinden welche Nachricht mit welche ID gerade durchkommt.
Patrick wrote: > Guten Morgen Peter, > > ok die Maske habe ich ja schon auf 0x00 gesetzt. Da kommen dann auch > alle CAN ID's durch, nur kann ich nicht expliziet herausfinden welche > Nachricht mit welche ID gerade durchkommt. Was meinst Du damit ? Du schickst eine Nachricht hin, das Datenfeld und die Länge ist richtig, aber der ID ist falsch ? Das glaub ich Dir nicht. Peter
Ich muss doch unter anderem beim Konfigurieren des MO die ID ja festlegen, von 0x000 bis 0x7FF. Die Acceptance Maske setze ich dann logischerweise auf 0x000. Damit kann ich alle Nachrichten empfangen. Nur die ID, ist die, die ich zuvor auch eingestellt hatte. Genau das check ich nicht ganz!
Hier müsste es doch Leute geben, die sich etwas genauer mit dem XC888 auskennen. Wharscheinlich müsste ich es so machen, dass ich beim Start des XC888 die MO's mit definierten ID's anlegen muss. Danach kann ich dann prüfen ob eine Nachricht anliegt. Aber ich denke auch, das es gehen müsste, das ich die ID bei einem Acceptance Mask von 0x000 auslesen müsste.
Von einer anderen Quelle habe ich erfahren, dass man nur die ID's auslesen kann, die man auch bei der Konfiguration der MO's vergeben hat. Sobald ich das Arbitration Register auf 0x005 und das Acceptance Mask Register auf 0x000 einstelle, dann kann ich auch nur die ID 0x005 auslesen. Es wird so sein dass, die Hardware dies dann so veranlasst. Trotzdem, finde ich das komisch.
Somit habe ich ein großes Problem. Wie kann ich dann damit ein CAN Protokoll (Schicht 7) aufbauen? Es sollen insgesamt 5 Busteilnehmer an einem CANBUS angeschlossen angeschlossen werden. Wie könnte man da das Protokoll aufbauen? Ich kann ja nicht explizit eine CAN ID abfragen.
Patrick wrote: > Hier müsste es doch Leute geben, die sich etwas genauer mit dem XC888 > auskennen. Wie es scheint, eben nicht. Es ist immer ein Risiko, brandneue Chips zu nehmen. Besonders, da es schon jahrelang andere Flash-MCs mit CAN gibt. Die Atmel (vormals Themic) Chips haben sich jedenfalls ziemlich gut etabliert, da findet man viele Informationen. Da hilft wohl nur, Kontakt mit dem Hersteller aufzunehmen. Peter
Endlich habe ich es herausgefunden. Das Message Objekt Nr. 0 lässt alle CAN-Nachrichten durch. Dies bedeutet ich kann endlich nach der gewünschten CAN-ID filtern.
Patrick wrote: > Endlich habe ich es herausgefunden. Das Message Objekt Nr. 0 lässt alle > CAN-Nachrichten durch. Dies bedeutet ich kann endlich nach der > gewünschten CAN-ID filtern. Na super, erst großkotzig 32 Message Objekte einrichten und dann ist nur eines mit Klimmzügen nutzbar. Beim AT89C51CC03 hab ich nur 15, aber die können verschiedene Gruppen filtern und ich muß nicht alles empfangen und umständlich per Software ausfiltern. Erinnert mich stark an die NXP LPC2xxx, die haben auch ein CAN mit nem Haufen "Bells and Whistles", die total buggy sind, nur ne Grundfunktionalität ist nutzbar. Peter
Ich habe noch folgendes Problem mit dem XC888. In einer Interruptroutone wird immer das Message Objekt 0 ausgelesen. Wenn ich jetzt keine CAN Nachricht vom CAN Dongle auf den CANBUS versende, enthält das Message Objekt 0 noch die letzten Daten. Wie kann man nun den XC888 dazu veranlassen, dass nachdem die Daten vom Message Objekt 0 abgeholt wurden, zu löschen? Es gibt zwar noch die Funktionen: ..ReleaseMsg.. ..RequestMsg.. ..DelMsg.. usw. Ich weiss nicht genau was diese Funktionen machen.
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.