Ich verwende den Mikrocontroller XC888 von Infineon. In der ISR kann ich maximal 3 Message Objekte empfangen. void SHINT_viXINTR5Isr(void) interrupt XINTR5INT { CAN_pushAMRegs(); // Push the CAN Access Mediator Registers IRCON2 &= ~(ubyte)0x01; // Clear CANSRC0 CAN_vWriteCANAddress(CAN_MSPND0); //Addressing CAN_MSPND0 CAN_DATA0 = ~(0x2E); // clear message pending register CAN_vWriteEN(D0_VALID); // bitposition ? (message object 1 2 5) CAN_vWriteCANAddress(CAN_MOCTR1); // Addressing CAN_MOCTR1 CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 1 CAN_vWriteEN(D0_VALID); CAN_vWriteCANAddress(CAN_MOCTR2); // Addressing CAN_MOCTR2 CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 2 CAN_vWriteEN(D0_VALID); CAN_vWriteCANAddress(CAN_MOCTR5); // Addressing CAN_MOCTR5 CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 5 CAN_vWriteEN(D0_VALID); CAN_popAMRegs(); // restore the CAN Access Mediator Registers CAN_vGetMsgObj(1,&stCAN); .... CAN_vGetMsgObj(2,stCAN); ... CAN_vGetMsgObj(5,stCAN); ... } // End of function SHINT_viXINTR5Isr Muss ich überhaupt in diesem Fall das Message Pending Register zurücksetzen oder nicht? Wenn ja woher weiss ich welches Bit ich genau zurücksetzen sollte? Das RxPND und das NEWDAT Flag sollte man dies auch immer wieder zurücksetzen.
void SHINT_viXINTR5Isr(void) interrupt XINTR5INT { CAN_pushAMRegs(); // Push the CAN Access Mediator Registers IRCON2 &= ~(ubyte)0x01; // Clear CANSRC0 CAN_vGetMsgObj(1,&stCAN); .... CAN_vGetMsgObj(2,stCAN); ... CAN_vGetMsgObj(5,stCAN); ... } // End of function SHINT_viXINTR5Isr Bin mir noch als nicht sicher ob ich das Message Pending Register löschen muss oder nicht. Für weitere Unterstützung bin ich sehr dankbar.
Ich verwende den Mikrocontroller XC888 von Infineon. In der ISR kann ich maximal 3 Message Objekte empfangen. void SHINT_viXINTR5Isr(void) interrupt XINTR5INT { CAN_pushAMRegs(); // Push the CAN Access Mediator Registers IRCON2 &= ~(ubyte)0x01; // Clear CANSRC0 CAN_vWriteCANAddress(CAN_MSPND0); //Addressing CAN_MSPND0 CAN_DATA0 = ~(0x2E); // clear message pending register CAN_vWriteEN(D0_VALID); // bitposition ? (message object 1 2 5) CAN_vWriteCANAddress(CAN_MOCTR1); // Addressing CAN_MOCTR1 CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 1 CAN_vWriteEN(D0_VALID); CAN_vWriteCANAddress(CAN_MOCTR2); // Addressing CAN_MOCTR2 CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 2 CAN_vWriteEN(D0_VALID); CAN_vWriteCANAddress(CAN_MOCTR5); // Addressing CAN_MOCTR5 CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 5 CAN_vWriteEN(D0_VALID); CAN_popAMRegs(); // restore the CAN Access Mediator Registers CAN_vGetMsgObj(1,&stCAN); .... CAN_vGetMsgObj(2,stCAN); ... CAN_vGetMsgObj(5,stCAN); ... } // End of function SHINT_viXINTR5Isr Muss ich überhaupt in diesem Fall das Message Pending Register zurücksetzen oder nicht? Wenn ja woher weiss ich welches Bit ich genau zurücksetzen sollte? Das RxPND und das NEWDAT Flag sollte man dies auch immer wieder zurücksetzen.
Hallo CarstenSt., du hast mir mal einen Programmauszug von der ISR gegeben: --> siehe Anhang Warum tust du das Message Pending Register beim Message Objekt 0 auf 0 zurücksetzen und bei den anderen nicht?
Hallo Carsten St., du hast mir mal einen Programmauszug von der deiner ISR gegeben: --> siehe Anhang Warum tust du das Message Pending Register sowie RxPND and NEWDAT beim Message Objekt0 auf 0 zurücksetzen und bei den anderen Message Objekten 1/2/3 nicht?
Ich verwende den Mikrocontroller XC888 von Infineon. In der ISR kann ich maximal 3 Message Objekte empfangen.
1 | void SHINT_viXINTR5Isr(void) interrupt XINTR5INT |
2 | {
|
3 | CAN_pushAMRegs(); // Push the CAN Access Mediator Registers |
4 | IRCON2 &= ~(ubyte)0x01; // Clear CANSRC0 |
5 | |
6 | CAN_vWriteCANAddress(CAN_MSPND0); //Addressing CAN_MSPND0 |
7 | CAN_DATA0 = ~(0x2E); // clear message pending register |
8 | CAN_vWriteEN(D0_VALID); // bitposition ? (message object 1 / 2 / 5) |
9 | |
10 | CAN_vWriteCANAddress(CAN_MOCTR1); // Addressing CAN_MOCTR1 |
11 | CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 1 |
12 | CAN_vWriteEN(D0_VALID); |
13 | |
14 | CAN_vWriteCANAddress(CAN_MOCTR2); // Addressing CAN_MOCTR2 |
15 | CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 2 |
16 | CAN_vWriteEN(D0_VALID); |
17 | |
18 | CAN_vWriteCANAddress(CAN_MOCTR5); // Addressing CAN_MOCTR5 |
19 | CAN_DATA0 = 0x09; // Reset RxPND and NEWDAT flag for object 5 |
20 | CAN_vWriteEN(D0_VALID); |
21 | |
22 | |
23 | CAN_popAMRegs(); // restore the CAN Access Mediator Registers |
24 | |
25 | CAN_vGetMsgObj(1,&stCAN); |
26 | ....
|
27 | CAN_vGetMsgObj(2,stCAN); |
28 | ...
|
29 | CAN_vGetMsgObj(5,stCAN); |
30 | ...
|
31 | } // End of function SHINT_viXINTR5Isr |
Muss ich überhaupt in diesem Fall das Message Pending Register zurücksetzen oder nicht? Wenn ja woher weiss ich welches Bit ich genau zurücksetzen sollte? Das RxPND und das NEWDAT Flag sollte man dies auch immer wieder zurücksetzen.
Hallo Carsten St., du kennst dich doch gut mit dem XC888 Mikrocontroller aus oder?
Wenn ich mit der Funktion CAN_vGetMsgObj in der ISR die CAN Nachricht empfangen möchte, was muss ich zusätzlich noch beachten?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.