CAN-Shield: Mask und Filter

Hallo,

ich habe nun schon sehr sehr viel über die CAN Masken und Filter gelesen und bin leider immernoch nicht ganz schlau :)

Aus diesem Grund muss ich leider einen Beitrag eröffnen, normal kann ich mir schon sehr viel ersuchen aber ich verstehe es noch nicht ganz.

Was ich verstehe bei den CAN Bus Masken und Filtern ist folgendes: Bei einem großen CAN-"Netzwerk" mit vielen IDs will ich lauschen und auf diverse IDs reagieren. Da der mcp2515 wohl schon hardwareseitig aussortieren kann hilft das dem Arduino ungemein. Durch die 2 verfügbaren Masken kann man entscheiden was durch kommen soll zu den eigentlichen Filtern. Das passiert über die Bits. Eine 1 in der Maske bedeutet auch für den Filter das es relevant ist. Z.B. 1111 1111 lässt alles durch und die Filter entscheiden. Richtig soweit?

Dann kommt der Filter ins Spiel.

Nehmen wir an ich habe folgende Hex / Dec Node-IDs die ich bekommen will:

A8 / 168 AA / 170 CE / 206 1D0 / 464 380 / 896

Das ganze in Bin umwandeln und "übereinander" legen, damit man eine Maske erhält oder?

Da man 2 Masken hat wobei Maske 1 zwei Filter zustehen und Maske 2 dann 4 Filter würde ich das so machen:

Mask1:

11 1101 0000 3D0

Filter: 01 1101 0000 1D0 11 1000 0000 380

Mask2:

0011101110 EE

Filter 00 1010 1000 A8 00 1010 1010 AA 00 1100 1110 CE

Also die 1er in der Mask auch überall dort wo eine 1 in der Node ID steht.

Habe ich das soweit richtig verstanden? Ich habe wie gesagt schon viel gelesen und auch die Beispiele kapiert aber da geht es meist nur um eine ID die gefiltert werden soll.

Vielen Dank

Gruß Alex

hi,

hab’ mit CAN (noch) nichts am hut, aber wenn ich mir das datenblatt ansehe, ist es eher so:

das bit in der maske entscheidet, ob die bits der ID und des filters verglichen werdensollen.

wenn also das dritte bit der maske 0 ist, ist egal, ob die dritten bits des filters und der ID übereinstimmen.

und wenn das dritte bit der maske 1 ist, müssen die dritten bits des filters und der ID übereinstimmen.

ich hab’ jetzt nur aus interesse 5 minuten investiert, hab’ es mir also nicht genau angesehen, aber so lese ich das auch aus der tabelle.

CAN.gif

gruß stefan

Hallo Stefan,

vielen Dank.

Genau das ist es, es will nicht in meinen Kopf :)

Aber wenn ich das doch richtig verstehe geht das in meinem Fall. Klar es kommen sicher weit mehr IDs durch, aber eben nicht mehr alle was das ganze schon leichter macht. mal umgestellt auf die Tabelle aus dem Bild:

Mask1 Filter1 ID Result 1 0 0 Accept 1 1 1 Accept 1 1 1 Accept 1 1 1 Accept 0 X 0 Accept 1 1 1 Accept 0 X 0 Accept 0 X 0 Accept 0 X 0 Accept 0 X 0 Accept

Mask1 Filter2 ID Result 1 1 1 Accept 1 1 1 Accept 1 1 1 Accept 1 0 0 Accept 0 X 0 Accept 1 0 0 Accept 0 X 0 Accept 0 X 0 Accept 0 X 0 Accept 0 X 0 Accept

Somit lässt die Mask1 meine IDs durch die gleich sind mit dem Filter. Man müsste sich jetzt wirklich was ausarbeiten um ein perfektes Ergebnis zu bekommen, sodass man Filter und Mask für mehrere IDs erstellen kann. Einen "Mask und Filter Calculator" habe ich nicht gefunden, sowas wäre super, IDs eintragen und man bekommt die Lösung :D Ich will es aber schon auch verstehen und nicht nur die Lösung präsentiert ;)

Gruß

hi,

ich verstehe das mit den 2 masken und dann unterschiedlich vielen filtern nicht, aber falls das ganze "gleichwertig" ist, würde ich bei 5 IDs, die durchkommen sollen, beide masken auf 111111111111 setzen und die IDs dann in den filtern prüfen. so kommt nur durch, was Du willst.

ein wenig sinn macht die maske bei

00 1010 1000 A8 00 1010 1010 AA

wenn Du da die maske auf

11 1111 1101

setzt, reicht ein filter, um beide zu erschlagen. im endeffekt bringt das in Deinem fall nichts. wirklich sinn machen diese masken (nach meinem bescheidenen verständnis) nur, wenn man beim vergeben der IDs im fahrzeug gruppiert, also zb. bei allen komponenten des klimasystems IDs in der form 01 0xxx 10 verwendet.

dann kann man mit der maske 11 1000 11 und dem filter 01 0yyy 10 alle (bis zu 8 ) geräte dieses systems einfangen. wobei y egal ist...

gruß stefan

Ja genau, Filter auf FFF bzw 111111111111 sollte alles durchlassen.

Und dann eben noch der Filter zu den passenden IDs.

Das muss ich mal testen.

Dennoch steige ich nicht so ganz dahinter :)

Vielen Dank trotzdem, ich werde mich da weiter einarbeiten.