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