Hallo.
Ich bin kompletter Neuling im Umgang mit CAN und auch meine Zeit als C
programmierer ist schon Jahre her.
Bei meinem momentanen Praktikum habe ich mit Geräten zu tun, die über
CAN bus kommunizieren und die einen PIC18 verbaut haben.
Man setzte mich an eine quasi fertige Firmware, um diverse Veränderungen
einzufügen.
Nachdem ich nun mehrere neue Rx messages definiert habe, habe ich
größere Probleme mit den Filtereinstellungen.
Zuvor waren die IDs 0x010 bis 0x016 definiert und mit folgenden
Filterregeln versehen:
1 | ...
|
2 | /* acceptance mask and filter registers */
|
3 | /* the messages 0x010...0x017 may pass thru the RX-buffer 0 */
|
4 | /* RX buffer0 */
|
5 | /* mask register */
|
6 | RXM0SIDL = 0x00; /* bits 2..0; ZERO ==> not relevant; always accepted! */
|
7 | RXM0SIDH = 0xFF; /* bits 11..3; ONE ==> relevant; must pass the filter value! */
|
8 |
|
9 | /* filter register */
|
10 | /* acceptance filter 0 */
|
11 | RXF0SIDL = 0x00; /* bits 2..0; ZERO ==> not relevant; always accepted because of the mask bits! */
|
12 | RXF0SIDH = 0x02; /* bits 11..3; 0x02 (000 0001 0; bit 11..3) ==> relevant; must be identical to the value! */
|
13 |
|
14 | /* acceptance filter 1 */
|
15 | /* use the same settings from filter 0 for the acceptance filter 1 */
|
16 | RXF1SIDL = 0x00; /* bits 2..0; ZERO ==> not relevant; always accepted because of the mask bits! */
|
17 | RXF1SIDH = 0x02; /* bits 11..3; 0x02 (000 0001 0; bit 11..3) ==> relevant; must be identical to the value! */
|
18 |
|
19 | ...
|
Ich habe mich jetzt schon etwas eingehend damit beschäftigt und dachte
auch ich würde es verstehen.
Nun habe ich die IDs für 16 mögliche Geräte definiert:
Gerät1: 0x010 - 0x016
Gerät2: 0x050 - 0x056
Gerät3: 0x110 - 0x116
Gerät4: 0x150 - 0x156
.
.
.
Gerät15: 0x710 - 0x716
Gerät16: 0x750 - 0x756
und folgende Filterregelungen getroffen:
1 | RXM0SIDL = 0x00;
|
2 | RXM0SIDH = 0x18;
|
und
1 | RXF0SIDL = 0x00;
|
2 | RXF0SIDH = 0x10;
|
dies funktioniert nicht.
selbstverständlich ist mir klar, dass wenn ich mask high ebenfalls mit
0x00 definiere, dass dann alle messages durchgehen.
Ich möchte aber eine funktionierende Filterung erreichen, bzw das
konzept komplett verstehen.
Kann mir jemand von euch bitte helfen?
MFG