Guten Morgen Ich benutze einen AT90CAN128 in einem CAN-Bus. Der soll von einem Master eine Nachricht mit Remote Frame erhalten und dann automatisch die gewünschte Antwort (mit gleicher ID) zurückgeben. Ich finde aber nirgends eine verständliche Beschreibung, wie man das in C implementieren kann. Aus dem Datenblatt des AT90 werd ich auch nicht ganz schlau. Die CAN-Nachricht empfangen ist kein Problem. Es geht nur um die Antwort. Wie könnte sowas aussehen? Danke für Eure Antworten Gruss Patrick
Patrick wrote: > Ich benutze einen AT90CAN128 in einem CAN-Bus. Der soll von einem Master > eine Nachricht mit Remote Frame erhalten und dann automatisch die > gewünschte Antwort (mit gleicher ID) zurückgeben. Die meisten Anwendungen haben ne Empfangsroutine und ne Senderoutine, fertich. Das empfangene Paket wird ausgewertet und dann ein Sendepaket zusammengebastelt. Daß man die Antwort auf ne Frage schon vorher weiß, dürfte ein seltener Spezialfall sein. Erzähl dochmal wozu Du diesen Spezialfall unbedingt brauchst. Außerdem müßte diese Antwort ja schon fix und fertig in einem Sendeobjekt stehen, d.h. den ID zu ändern geht eh nicht. Peter
Der AT90CAN128 wird verwendet, um einen Motor anzusteuern (Slave). Dabei empfängt er die Befehle für Vor, Zurück und Stop über CAN von einem anderen AT90CAN128 (2. Master). Gleichzeitig soll aber auch eine Controll Unit (1. Master) eine Statusanfrage senden können, die dann der AT90 ohne Interrupt mit "Motor vor" (1), "Motor zurück" (2), oder "Motor Stop" (0) beantwortet. Im Datenblatt des AT90 steht was von Automatic Reply (19.5.1.4) und nem RPLV-bit, aber irgendwie peil ich das nicht. Kannst Du mir helfen?
Ich habs noch nie gebraucht, kann also nichts dazu sagen. Ist denn der Interrupt so ein Problem ? Vielleicht solltest Du mal die Programmstruktur überdenken, wenn nicht mal mehr ein Interrupt bearbeitet werden kann. Peter
Mit dem Interrupt hat das nichts zu tun. Es geht mir nur darum, dass er die Nachricht automatisch nach einem Remote Frame sendet.
Hallo, der Remote-Frame ist ein Empfangsobjekt mit gesetztem Transmit-Request und Datenlänge 0 Byte. Das Remote-Objekt ist ein Sende-Objekt mit gelöschtem Transmit-Request. so einfach! guido
Sag mir etwas, was ich noch nicht weiss. Es geht um die Automatic Reply Funktion des AT90CAN128.
Die ist einfach das Remote-Objekt. Anlegen und bei Nachfrage wird es automatisch gesendet. guido
Ich kenne mich mit CAN nicht sehr aus, vor längerer Zeit habe ich das Datenblatt einmal kurz überflogen. Der Controller verfügt über 15 Message Objects, die für die Kommunikation benötigt werden. Wenn ich das richtig verstanden habe, musst Du so ein Object vorbereiten, welches dann vom Controller beim Eintreffen des Remote Frame automatisch verschickt wird. Das Vorbereiten wird ähnlich erfolgen wie beim interrupt-gesteuerten Versenden, man wird aber die entsprechenden Remote Frame Bits setzen müssen. Wenn Du einen Quellcode zum interrupt-gesteuerten Antworten hast, kannst du das sicher davon abkupfern. Das ganze nur als kurzen Hinweis, weil sonst kaum einer geantwortet hat. Klaus
>Anlegen und bei Nachfrage wird es automatisch gesendet.
Und wie anlegen? Kann ich da die Daten aktualisieren lassen, oder geht
das nur einmal?
>Und wie anlegen? Kann ich da die Daten aktualisieren lassen, oder geht >das nur einmal? Wie ein ganz normales Sendeobjekt anlegen, nur die Flags entsprechend Datenblatt anpassen. Wenn es abgerufen wird, wird nur das zugehörige Transmit-Flag gesetzt und dadurch ev. ein Int. augelöst, es bleibt aber gültig. Aktualisieren geht ganz normal: Objekt invalid erklären, Daten ändern und wieder valid erklären. guido
Aus dem Datenblatt werd ich eben nicht schlau. Ich hät vielleicht noch erwähnen sollen, dass das eins meiner ersten Projekte mit Mikrocontroller ist. Mein Wissen darüber ist dementsprechend (noch) etwas begrenzt. Die CAN-Routine hier zu veröffentlichen wird wahrscheinlich auch problematisch sein, da ich sie von meinem Arbeitgeber von einem früheren Projekt übernommen hab.
Anspruchsvolle Aufgabe für einen Anfänger! Naja, die CAN-Routine wird wohl was wie "int Create_MessageObject(..." sein. Die Flags müsste man am Namen erkennen, die Übersicht ist in der Tabelle 19.5.2 auf S. 244 im Datasheet. guido
Hier doch mal ein kleiner Auszug:
1 | CAN_TxNum = CAN128_CreateMOB(0, 0, 0, mmTxData); |
2 | |
3 | |
4 | |
5 | //--- Create new Message Object
|
6 | //--- id -> Message ID
|
7 | //--- ext -> TRUE = Extended ID (29Bits) , FALSE = Standard ID (11Bits)
|
8 | //--- dlc -> Data Length Code
|
9 | //--- mode -> Mode of Message Object (enum MOBMode in can128.h)
|
10 | extern uint8_t CAN128_CreateMOB (uint32_t id, uint8_t ext, uint8_t dlc, uint8_t mode){...} |
Ist das der RTRTAG, den ich setzen muss?
Ich werde eben aus Absatz 19.5.1.4 (Automatic Reply) nicht ganz schlau. Wie funktioniert das mit dem RPLV?
Patrick wrote:
> Ist das der RTRTAG, den ich setzen muss?
Würde ich auch so verstehen.
Es ist ein ganz normales Sendeobjekt mit gesetztem RTRTAG.
Der Interrupt kommt dann erst, nachdem es gesendet wurde.
Peter
Patrick wrote:
> Und wie kann ich vorher noch die Daten aktualisieren?
Garnicht, weil es ja automatisch gesendet wird. Du wolltest es ja so.
Peter
Guido hat da aber was anderes erzählt.? Guido wrote: >Aktualisieren geht ganz normal: Objekt invalid erklären, Daten ändern und wieder >valid erklären. Kannst Du mir das anhand der Flags erklären, die ich setzen oder löschen muss?
Patrick wrote: > Guido wrote: >>Aktualisieren geht ganz normal: Objekt invalid erklären, Daten ändern und wieder >>valid erklären. Ja, so gehts. Bloß wenn dann genau der Remote-Frame kommt, geht der ins Lehre. Wenn man das oft macht, können viele Remote-Frames verschwinden. Wenn man dagegen das Sendeobjekt reinstellt nach dem Empfang, klapts immer. Peter
Kann mir denn keiner von euch konkret sagen, wie man das macht?
Immer langsam, erstmal Objekt anlegen und solange probieren, bis dieses korrekt ankommt. Dann musst du die anderen Funktionen erforschen, z.B. wäre es sinnvoll vor CreateMob erstmal zu fragen ob noch ein Mob frei ist .... >Ja, so gehts. Bloß wenn dann genau der Remote-Frame kommt, geht der ins >Lehre. Möglich aber unwahrscheinlich, gemessen an CAN geht das ja rasend schnell. Ich wüsste auch ne grobe Methode das einfach zu umgehen. guido
>z.B. wäre es sinnvoll vor CreateMob erstmal zu fragen ob noch ein Mob frei ist
....
Das wird in der CreateMob-Routine erledigt. Meine Frage ist, ob ich beim
Tx-Objekt, das automatisch gesendet werden soll, irgendwelche bestimmte
Flags aktivieren muss.
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.