CANBUS: Hilfe zu ISR

Gast #623429
Lesenswert?

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.
Gast #624249
Lesenswert?

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.
Gast #631504
Lesenswert?

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.
Gast #632168
Lesenswert?

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?
Gast #634209
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren