Forum: Mikrocontroller und Digitale Elektronik CANBUS: Hilfe zu ISR


von Patrick (Gast)


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.

von Patrick (Gast)


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.

von Patrick (Gast)


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.

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Patrick (Gast)


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?

von Patrick (Gast)


Lesenswert?

Keiner hier der sich mit dem XC888 von infineon auskennt?

von Patrick (Gast)


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.

von Patrick (Gast)


Lesenswert?

Hallo Carsten St., du kennst dich doch gut mit dem XC888 Mikrocontroller 
aus oder?

von Patrick (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.