Forum: Digitale Signalverarbeitung / DSP / Machine Learning Interrupt TMS320F2808


von Tim R. (mugen)


Lesenswert?

Mit der Auführung der Interrupts habe ich keine Probleme.
Zurzeit benutzte ich zu Testzwecken den Timer0 Interrupt und den 
SCIA-RECEIVE Interrupt. Eigentlich möchte ich, dass der Timer0 Interrupt 
den SCIA Interrupt unterbricht. Sprich der Timer0 hat immer die höchste 
Priorität. Laut Docu müsste dies auch so sein, allerdings zweifle ich 
daran. Entweder eine Unterbrechung durch einen anderen Interrupt ist 
nicht möglich, oder die Interrupts werden nacheinander abgefertigt. 
Letzteres ist nicht erwünscht. Hat jemand evtl. einen Tipp?

Source-Auszug:
1
EALLOW; 
2
PieVectTable.TINT0 = &cpu_timer0_isr;
3
PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
4
EDIS;  
5
//=================================================================
6
7
// Enable CPU INT1 which is connected to CPU-Timer 0:
8
// Enable SPIRXINTA:
9
IER = 0x101;
10
//=================================================================
11
// Enable TINT0 in the PIE: Group 1 interrupt 7
12
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
13
14
PieCtrlRegs.PIEIER9.bit.INTx1=1;     // PIE Group 9, INT1 --- SPIRXINTA
15
16
//=================================================================
17
// Enable global Interrupts and higher priority real-time debug events:
18
EINT;   // Enable Global interrupt INTM
19
ERTM; 
20
//=================================================================
21
22
interrupt void cpu_timer0_isr(void)
23
{
24
25
//Hier steht der Source
26
27
 // Acknowledge this interrupt to receive more interrupts from group 1
28
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
29
}
30
//=================================================================
31
interrupt void sciaRxFifoIsr(void)
32
{
33
PieCtrlRegs.PIEIFR1.bit.INTx7 = 0;
34
PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
35
36
for(;;){}  // Zu Testzwecken
37
}

von Tim R. (mugen)


Lesenswert?

In den letzten Zeilen befindet sich ein Fehler, daher der überarbeitete 
Source für den SCIA Interrupt:
1
interrupt void sciaRxFifoIsr(void)
2
{
3
4
5
6
  Uint16 i;
7
  Uint16 l_dummy[16];
8
9
  for(i=0;i<16;i++)
10
  {
11
     l_dummy[i]=SciaRegs.SCIRXBUF.all;   // Read data
12
  }
13
14
  SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
15
  SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
16
17
18
  PieCtrlRegs.PIEIFR9.bit.INTx1 = 0;
19
  PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
20
  for(;;){}
21
22
23
}

von Micha (Gast)


Lesenswert?

Ich würde sagen, dass du das entsprechende Interrupt-Flag löschen und 
den PIE-Ack durchführen musst und zwar am Anfang der SCI-ISR und nicht 
erst am Ende.

Also ungefähr so:
1
interrupt void sciaRxFifoIsr(void)
2
{
3
  Uint16 i;
4
  Uint16 l_dummy[16];
5
6
  SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
7
  SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
8
  PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
9
  /* ist 0x100 hier wirklich richtig? (siehe unten) */
10
11
  for(i=0;i<16;i++)
12
  {
13
     l_dummy[i]=SciaRegs.SCIRXBUF.all;   // Read data
14
  }
15
16
  for(;;){}
17
}

Übrigens:

<zitat spru712f, Seite 124>
Rule 1: Never clear a PIEIFR bit by software
</zitat>

<zitat spru712f, Seite 140>
Each bit in PIEACK refers to a specific PIE group. Bit 0 refers to 
interrupts in PIE group 1 that are MUXed into INT1 up to Bit 11, which 
refers to PIE group 12 that is MUXed into CPU INT12.
</zitat>

von Tim R. (mugen)


Lesenswert?

@Micha:

Auf Rule 1 bin ich auch schon gestoßen und habe dies kompensiert. 
Zurzeit kann ich den Interrupt durch einen anderen Interrupt 
unterbrechen, allerdings nutze ich dafür "EINT" - Maskierter Interrupt, 
was ja eigentlich richtig sein müsste. Wann die SCI-Flags gelöscht 
werden müssen ist vermutlich eine kleine Streitfrage. Ich kann aber 
sagen, dass ich nun keine Übertragungsfehler mehr habe und ein größerer 
Stream ohne Probleme zu empfangen ist.

Test-Source:
1
interrupt void sciaRxFifoIsr(void)     // SCI-A
2
{
3
  static Uint16 l_receive_index = 0;
4
  static Uint16 l_receive_start = 0;
5
  
6
     PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;   // Enable PIE interrupts  
7
  EINT;  // Enable Maskable Interrupt
8
9
  //==============================================================================================
10
  // Code zur Verarbeitung: SCIA-FIFO auslesen und flags löschen
11
  //==============================================================================================
12
  for(l_receive_index=l_receive_start;l_receive_index<16+l_receive_start;l_receive_index++)
13
  {
14
     ReceivedChar[l_receive_index]=SciaRegs.SCIRXBUF.all;   // Read data
15
  }
16
  l_receive_start = l_receive_start + 15;
17
  if(l_receive_start >= 100)
18
  {
19
  l_receive_start = 0;
20
  }
21
22
  SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
23
  SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
24
  //==============================================================================================
25
//  for(;;){}
26
27
  // Restore registers saved:
28
  DINT;  // Disable Maskable Interrupt
29
}

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.