Forum: Mikrocontroller und Digitale Elektronik PIC18 CAN Filter/Masken


von Ben H. (powerun)


Lesenswert?

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