Hallo, ich programmiere mit dem Mikrocontroller at90can128 von Atmel. Ich versuche Daten auf dem CAN-Bus zu lesen. Im Datenblatt gibt es ein Beispiel über Acceptance Filter Block Diagram. Mit dem Beispiel habe ich so verstanden, dass man mit dem ID-Mask eine Reihe von ID empfangen kann. Ich habe ein kleines Programm geschrieben, das das Empfang von ID Z.B von 0X104 bis 0x304 ermöglichen soll. Das Problem ist: Ich bekomme nur die Nachrichten mit dem ID=0x104. Ich dachte mit dem ID-Mask, könnte ich alle ID des gegebenen Bereichs, die auf dem CAN-Bus vorhanden sind, empfangen. Kann jemanden mir erklären wie es funktioniert muss oder welche Fehler mache ich. Danke
ohne Dein Programm all zu genau gelesen zu haben 1. Nach dem Auslesen musst Du die Mailbox neu initialisieren 2. Es gibt einen ID-Tag und ein ID-Mask In der Mask legst Du fest, welche Bits des TAGs für den Vergleich relevant sind. Willst Du alle Nachrichten empfangen ist die Mask 0x0000
Hallo, so habe ich initialisiert, kannst Du bitte das Programm genaue anssehen
nein, Du hast es in einer Sprache geschrieben, die ich nicht verstehe, Darüber darf man getrennter Meinung sein, bei mir sieht soetwas
1 | #define init_mob_rx_0 init_mob_rx(0,0,0);
|
2 | |
3 | |
4 | void init_mob_rx (char nummob, long idtag, long idmask) |
5 | {
|
6 | CANPAGE = (nummob << 4); // MOB anwählen |
7 | CANIDT4 = (uint8_t)((idtag<<3) & 0xFF); // Tag setzen |
8 | CANIDT3 = (uint8_t)((idtag>>5) & 0xFF); |
9 | CANIDT2 = (uint8_t)((idtag>>13) & 0xFF); |
10 | CANIDT1 = (uint8_t)((idtag>>21) & 0xFF); |
11 | CANIDM4 = (uint8_t)((idmask<<3) & 0xFF); // Maske setzen |
12 | CANIDM3 = (uint8_t)((idmask>>5) & 0xFF); |
13 | CANIDM2 = (uint8_t)((idmask>>13) & 0xFF); |
14 | CANIDM1 = (uint8_t)((idmask>>21) & 0xFF); |
15 | CANSTMOB = 0x00; |
16 | CANCDMOB = 0x98; // MOB in empfangsmodus |
17 | }
|
und die Auswertung sieht dann so aus
1 | CANIE2 = 0x00; // sperre Interrupt MOB0 - 4 |
2 | |
3 | |
4 | CANPAGE = 0x00; |
5 | if(checkbit(CANSTMOB,RXOK)) |
6 | {
|
7 | for(int counter=0;counter != 7; counter++) |
8 | {buffer[counter] = CANMSG;} |
9 | for (counter = 0; counter < 7; counter++) |
10 | {
|
11 | CANMSG = 0; |
12 | }
|
13 | //CANSTMOB = 0x00;
|
14 | init_mob_rx_0; |
15 | candriver_enable; |
16 | }
|
17 | |
18 | |
19 | ...
|
Ich bin kein Programmierer, deshalb muss ich das Zeug so schreiben, dass ich es lesen kann.
vermutlich nicht mehr als das andere Codesegment, das Du aus einem anderen Forum abgekupfert hast, mit dem Unterschied, das dieses hier zum Teil in Deutsch kommentiert ist und auf ein paar hundert Systemen läuft. Diese CAN-Bus-Kiste erfordert etwas Zeit und Geduld sich darin einzuarbeiten. Kopiere Beispiele un Codeschnipsel so viel du willst. Etwas Eigenarbeit wirst Du nicht umgehen können. Kleiner Tip. Halte Dich von den AVR-Codeschnipseln fern.
hallo tex was soll das wenn du nicht eine Antwort hast, bitte erhalte deine Tip für dich
Hallo Gast! Hast du prinzipiel verstanden was auf dem CAN-bus abgeht und wofür die Filtermasken gut sind? Wenn du dich mit Computernetzwerken auskennst kannst du die Filtermasken mit der Subnetmask vergleichen. Der Vorteil der Masken, du kannst eine Vorselektion treffen welche Nachrichten für dein Modul wichtig sind und welche nicht. So das dein µc nicht damit beschäftigt ist Nachrichten auszuwerten welche nicht für ihn bestimtm sind. Was den At90can128 angeht steht eigentlich alles im Datenblatt...
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.