Mehrere ID auf CAN-Bus hören

Gast #969110
Lesenswert?

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
Angehängte Dateien:
Gast #969138
Lesenswert?

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
Gast #969239
Lesenswert?

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.
Gast #969671
Lesenswert?

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.
Gast #972571
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren