Forum: Haus & Smart Home Mehrere ID auf CAN-Bus hören


von gast (Gast)


Angehängte Dateien:

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

von tex (Gast)


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

von gast (Gast)


Lesenswert?

Hallo,
so habe ich initialisiert, kannst Du bitte das Programm genaue anssehen

von tex (Gast)


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.

von gast (Gast)


Lesenswert?

hallo,
aber es hilft mir nicht weiter.

von tex (Gast)


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.

von gast (Gast)


Lesenswert?

hallo tex
was soll das wenn du nicht eine Antwort hast, bitte erhalte deine Tip 
für dich

von Gast2 (Gast)


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

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.