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
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
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
>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
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
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
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.