mikrocontroller.net

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


Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
so habe ich initialisiert, kannst Du bitte das Programm genaue anssehen

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, Du hast es in einer Sprache geschrieben, die ich nicht verstehe,
Darüber darf man getrennter Meinung sein, bei mir sieht soetwas
#define init_mob_rx_0 init_mob_rx(0,0,0);


void init_mob_rx (char nummob, long idtag, long idmask)
{
CANPAGE = (nummob << 4);                 // MOB anwählen
CANIDT4 = (uint8_t)((idtag<<3) & 0xFF);          // Tag setzen
CANIDT3 = (uint8_t)((idtag>>5) & 0xFF);
CANIDT2 = (uint8_t)((idtag>>13) & 0xFF);
CANIDT1 = (uint8_t)((idtag>>21) & 0xFF);
CANIDM4 = (uint8_t)((idmask<<3) & 0xFF);          // Maske setzen
CANIDM3 = (uint8_t)((idmask>>5) & 0xFF);
CANIDM2 = (uint8_t)((idmask>>13) & 0xFF);
CANIDM1 = (uint8_t)((idmask>>21) & 0xFF);
CANSTMOB = 0x00;
CANCDMOB = 0x98; // MOB in empfangsmodus
}

und die Auswertung sieht dann so aus

CANIE2 = 0x00; // sperre Interrupt MOB0 - 4


CANPAGE = 0x00;
  if(checkbit(CANSTMOB,RXOK))
    {
    for(int counter=0;counter != 7; counter++) 
      {buffer[counter] = CANMSG;}  
    for (counter = 0; counter < 7; counter++)
      {
        CANMSG = 0;
      }
    //CANSTMOB = 0x00;
    init_mob_rx_0;
    candriver_enable;
    }


...

Ich bin kein Programmierer, deshalb muss ich das Zeug so schreiben, dass 
ich es lesen kann.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
aber es hilft mir nicht weiter.

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

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

Autor: Gast2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.