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é
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
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é
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é
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
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.
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é
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.