Hi, ich möchte eine funktion schreiben um die Register für Maske und
Filter beim CAN zu beschreiben.
1 | void CAN1_SetMask(unsigned int mask_no, unsigned int ID_structure)
|
2 | {
|
3 | unsigned int CAN1_RxSID = (ID_structure &= 0x1FFC0000) >> 16;
|
4 | unsigned int CAN1_RxEIDH = (ID_structure &= 0x0003FFC0) << 2;
|
5 | unsigned int CAN1_RxEIDL = (ID_structure &= 0x000000FF) << 10;
|
6 |
|
7 | switch(mask_no)
|
8 | {
|
9 | case 0:
|
10 | C1RXM0SIDbits.MIDE = 1;
|
11 | C1RXM0SID = (C1RXM0SID |= CAN1_RxSID);
|
12 | C1RXM0EIDH = CAN1_RxEIDH;
|
13 | C1RXM0EIDL = CAN1_RxEIDL;
|
14 | break;
|
15 | ...
|
Zum Testen rufe ich die Funktion mit
auf.
durch den Simulator kann ich mir die Register angucken. Dabei habe ich
gesehen, dass durch die Zeile
1 | unsigned int CAN1_RxEIDH = (ID_structure &= 0x0003FFC0) << 2;
|
0x000 raus kommt. Aber eigentlich sollte da meiner Meinung nach 0x3FC00
raus kommen.
0xFF00 & 0x3FFC0 -> 0xFF00
0xFF00 << 2 -> 3FC00
oder habe ich da einen Denkfehler drinne?