Forum: Mikrocontroller und Digitale Elektronik Automatic Reply auf Remote Frame


von Patrick (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Weiss denn wirklich niemand Rat?

von klodeckel (Gast)


Lesenswert?

..also ich weiß nix

ts

von Patrick (Gast)


Lesenswert?

Das hilft mir natürlich enorm weiter.

von Peter D. (peda)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Mit dem Interrupt hat das nichts zu tun. Es geht mir nur darum, dass er 
die Nachricht automatisch nach einem Remote Frame sendet.

von Patrick (Gast)


Lesenswert?

Hat denn Niemand Erfahrung damit?

von guido (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Sag mir etwas, was ich noch nicht weiss. Es geht um die Automatic Reply 
Funktion des AT90CAN128.

von guido (Gast)


Lesenswert?

Die ist einfach das Remote-Objekt. Anlegen und bei Nachfrage wird es
automatisch gesendet.

guido

von Klaus Falser (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

>Anlegen und bei Nachfrage wird es automatisch gesendet.
Und wie anlegen? Kann ich da die Daten aktualisieren lassen, oder geht 
das nur einmal?

von guido (Gast)


Lesenswert?

>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

von Patrick (Gast)


Lesenswert?

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.

von guido (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

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?

von Patrick (Gast)


Lesenswert?

Ich werde eben aus Absatz 19.5.1.4 (Automatic Reply) nicht ganz schlau. 
Wie funktioniert das mit dem RPLV?

von Peter D. (peda)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Und wie kann ich vorher noch die Daten aktualisieren?

von Peter D. (peda)


Lesenswert?

Patrick wrote:
> Und wie kann ich vorher noch die Daten aktualisieren?

Garnicht, weil es ja automatisch gesendet wird. Du wolltest es ja so.


Peter

von Patrick (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Kann mir denn keiner von euch konkret sagen, wie man das macht?

von guido (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Hat denn wirklich noch niemand diese Funktion verwendet?

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.