Forum: Mikrocontroller und Digitale Elektronik AT90CAN128, Empfang verschiedener Botschaften


von André (Gast)


Lesenswert?

Hallo zusammen,
ich bin absoluter Neuling auf dem Gebiet der µC-Programmierung. Ich will 
ein At90CAN als Gateway programmieren, um mit einem Diagnosetester an 
ein Modellfahrzeug eine Diagnoseanwendung zu simulieren. Es ist eine 
einfache Server-Client-Kommunikation, der At90CAN muss also nur auf 
eingehende Nachrichten antworten. Der µC muss dabei lediglich 2 
verschiedene IDs erkennen (die erste ID die den Beginn der Kommunikation 
angibt und eine zweite die den Tester kennzeichnet, die Ids kennzeichnen 
also nicht mehr den Botschafteninhalt sondern den Teilnehmer(der 
Botschafteninhalt wird innerhalb der Nutzdaten identifiziert) -> 
Transportprotokoll TP2.0 von VW).
Ich sitze jetzt schon einige Wochen daran, habe auch hier schon alle 
Foren zu diesem Thema durchgelesen, aber die zündende Idee war leider 
nicht dabei. Da es nicht zeitkritisch ist, muss ich nicht mit Interrupts 
arbeiten (was auch nicht geklappt hat, als ich die Bibliotheken von 
Marco Glietsch verwendet habe). Er soll einfach auf empfangene 
Botschaften reagieren und die IDs erkennen um danach mit der 
entsprechenden Abarbeitung zu beginnen.


Für Tipps und Ratschläge wäre ich wirklich sehr dankbar

Grüße, André

von Volker Z. (vza)


Lesenswert?

Ja, Ja so ein CAN-Kontrolle hat schon ein paar Register, die alle 
richtig gesetzt sein wollen.

Benutzt du eine Library?

Versuche erst mal das Senden. Dann kannst du mit einem Speicherossi 
wenigstens prüfen ob du die Übertragungsgeschwindigkeit richtig 
eingestellt hast.

Volker

von André (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Volker,
ja ich benutze eine lib, habe sie mit angehängt. Die Einstellungen im 
can_init() stimmen soweit. In beiden Funktionen zum Senden und Empfangen 
in can.c funktionieren einwandfrei. Mein Problem ist, dass ich nicht 
weiß wie ich vorher die ID erkenne bevor ich in die CAN_message_read 
gehe, also was ich in die main schreibe. Vielleicht funktioniert das mit 
den libaries ja auch garnicht, wie gesagt bin absoluter Anfänger. Danke 
für die schnelle Antwort. Vielleicht erkennst du ja auf einen Blick wie 
man das Problem sinnvoll lösen kann.

Grüße, André

von André (Gast)


Lesenswert?

achso: ich schicke bis jetzt über Canalyzer Botschaften an den AT90CAN 
auf die er reagieren soll. Das funktioniert auch, allerdings muss ich 
der Funktion can_message_read eine CAN_message mit msg.id übergeben, 
damit diese den Inhalt ausliest. Es funktioniert einwandfrei wenn ich 
das so mache, also in der main in die Funktion aufrufe und dieser eine 
ID übergebe auf die er dann eine Botschaft zurückschicken soll, habe ich 
jetzt aus der libary gelöscht, da ich zeigen wollte wie sie aufgebaut 
ist. Mein Problem ist, das ich vorher die ID erkennen muss, bevor ich in 
die Funktion gehe.

Vielen Dank schon mal...

Grüße, André

von Alex h. (dudeda)


Lesenswert?

Also ich benutze die lib von 
http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek 
kannste ja mal reinschauen. (Ähnliches Projekt auch mit dem AT90CAN128) 
Da kann man Filter setzten oder diese so konfigurieren, dass alle 
Nachrichten akzeptiert werden. Kannst ja mal schauen ob du davon was 
verwenden kannst.

Grüße
Alex

von Volker Z. (vza)


Lesenswert?

André schrieb:
> Mein Problem ist, das ich vorher die ID erkennen muss, bevor ich in
> die Funktion gehe.

Nein.  Du halbierst sozusagen die Funktion CAN_message_read(...)

Die erste Hälfte (bis Zeile 100) setzt die Empfangsbereitschaft für 
einen Mailslot.

Setze mit dieser Funktion deine Beiden IDs. (vor der Schleife in Main.

Jetzt musst du nur Prüfen ob deine Mailslots was empfangen haben. So wie 
in Zeile 107.

Wenn ja schreibe dir eine Funktion die die zweite Hälfte enthält. So wie 
in Zeile  111-118.

So in etwa sollte es funktionieren.

von André (Gast)


Lesenswert?

Hallo Volker,
ich habe das jetzt so realisiert:

  MOb_einstellen(0, msg);    //MOb 0 empfängt nur ID 200
  MOb_einstellen(1, msg1);  //MOb 1 empfängt nur ID 201

  do{

    if(CANSTMOB & (1<<RXOK))
    {
      if(msg.id==200){
      CAN_message_send(2, msg2);
      }
      if(msg.id==201){
      CAN_message_send(2, msg3);
      }

      clearbit(CANSTMOB,RXOK); //RXOK-Bit wieder auf "0" setzen und 
neuen Empfang ermöglichen
    }

  }while(1);

Ich will erst einmal nur Botschaften zurücksenden wenn eine der beiden 
IDs erkannt wurde. Es funktioniert aber so nicht. Kann es sein, dass die 
Abfrage if(CANSTMOB & (1<<RXOK) nur funktioniert wenn man schon vorher 
ein Message Object ausgewählt hat? Müsste man sozusagen in einer 
Schleife den Buffer der beiden MObs überprüfen? Besten Dank, ist 
wirklich eine große Hilfe!!!

Grüße, André

von Volker Z. (vza)


Lesenswert?

André schrieb:
> Kann es sein, dass die
> Abfrage if(CANSTMOB & (1<<RXOK) nur funktioniert wenn man schon vorher
> ein Message Object ausgewählt hat?

Nach deiner Quelle (can.c Zeile 74) sieht es danach aus.

Ich kenne den µP aber nicht. Ein Blick in das Datenblatt sollte Dir 
Gewissheit geben.

Danach musst du auch erstmals die Nachricht auslesen, bevor du die ID 
vergleichst. Die besagte zweite Hälfte.

volker

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.