Forum: Digitale Signalverarbeitung / DSP / Machine Learning Interrupt mit TMS320F2806


von Student (Gast)


Lesenswert?

Hallo zusammen,

ich wollte die Interrupts aktivieren. Habe den Beispielcode von TI 
benutzt.
http://blog.21ic.com/uploadfile-/2008-1/51217.78775422.pdf

habe einfach den C-Code für TMS320C25 übernommen, benutze Code Composer 
Studio mit C2000 Mikrocontroller Familie für die Programmierung.
Ich bekomme einen Fehler in der Funktion "void initInts(void)" in der 
Zeile
1
globalEnableInt();

und zwar, "Expected an asm string, unrecognized token"

Habe mich außerdem bei der Definition gewundert, dass ich im C-Code auf 
einmal Teile des Assmebler Codes benutze,
1
#define globalEnableInt() asm(”\t EINT”);

muss ich hier was beachten??

Wäre für nen Tipp dankbar.

von ./. (Gast)


Lesenswert?

Der selige TMS320C25 hast ausser der Zeichenkette "TMS320"
nicht viel mit einem TMS320F2806 gemein.

Such Dir was aktuelleres...

von Christian W. (chrisw84)


Lesenswert?

Das hier: http://focus.ti.com/docs/toolsw/folders/print/sprc191.html 
runterladen, installieren und die Beispiele ins CCS importieren (SPRC191 
- Header Files & Beispielprogramme).
Beispiele durchgehen und verstehen.
Ein Blick ins Datenblatt unter dem Stichwort PIE könnte auch sehr 
hilfreich sein! :)

Viele Grüße

von Student (Gast)


Lesenswert?

Hallo,

danke euch für die Tipps. Muss zugeben, dass ich nicht so viel Erfahrung 
mit embedded Programmierung habe. Hatte bisher nur ein bisschen mit 
ATmega uC gearbeitet, der von TI ist aber ein ganz anderes Kaliber.

Ich werd mir erstmal die Beispiele reinziehen.

Grüß

von Student (Gast)


Lesenswert?

Hallo nochmals, hab immer noch n paar Schwierigkeiten mit dem Interrupt,

habe folgenden Code für die Initialisierung, größtenteils von der TI 
homepage,
1
void DeviceInit(void)
2
{
3
  WDogDisable();   // Disable the watchdog initially
4
  DINT;      // Global Disable all Interrupts
5
  IER = 0x0000;  // Disable CPU interrupts
6
  IFR = 0x0000;  // Clear all CPU interrupt flags
7
8
// SYSTEM CLOCK speed based on Crystal = 20 MHz
9
// 0xA =  100  MHz    (10)
10
// 0x9 =  90  MHz    (9)
11
// 0x8 =  80  MHz    (8)
12
// 0x7 =  70  MHz    (7)
13
// 0x6 =  60  MHz    (6)
14
// 0x5 =  50  MHz    (5)
15
// 0x4 =  40  MHz    (4)
16
// 0x3 =  30  MHz    (3)
17
// 0x2 =  20  MHz    (2)
18
19
  PLLset(0xA);  // choose from options above
20
21
// Initialise interrupt controller and Vector Table
22
// to defaults for now. Application ISR mapping done later.
23
  PieCntlInit();    
24
  PieVectTableInit();
25
26
   EALLOW; // below registers are "protected", allow access.
27
28
// HIGH / LOW SPEED CLOCKS prescale register settings
29
   SysCtrlRegs.HISPCP.all = 0x0002;    // Sysclk / 4 (25 MHz)
30
   SysCtrlRegs.LOSPCP.all = 0x0002;    // Sysclk / 4 (25 MHz)
31
   SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;
32
.
33
.
34
.
35
}

Vektor initialisierung,
1
// This function initializes the PIE control registers to a known state.
2
//
3
void PieCntlInit(void)
4
{
5
    // Disable Interrupts at the CPU level:
6
    DINT;
7
8
    // Disable the PIE
9
    PieCtrlRegs.PIECTRL.bit.ENPIE = 0;
10
11
  // Clear all PIEIER registers:
12
  PieCtrlRegs.PIEIER1.all = 0;
13
  PieCtrlRegs.PIEIER2.all = 0;
14
  PieCtrlRegs.PIEIER3.all = 0;  
15
  PieCtrlRegs.PIEIER4.all = 0;
16
  PieCtrlRegs.PIEIER5.all = 0;
17
  PieCtrlRegs.PIEIER6.all = 0;
18
  PieCtrlRegs.PIEIER7.all = 0;
19
  PieCtrlRegs.PIEIER8.all = 0;
20
  PieCtrlRegs.PIEIER9.all = 0;
21
  PieCtrlRegs.PIEIER10.all = 0;
22
  PieCtrlRegs.PIEIER11.all = 0;
23
  PieCtrlRegs.PIEIER12.all = 0;
24
25
  // Clear all PIEIFR registers:
26
  PieCtrlRegs.PIEIFR1.all = 0;
27
  PieCtrlRegs.PIEIFR2.all = 0;
28
  PieCtrlRegs.PIEIFR3.all = 0;  
29
  PieCtrlRegs.PIEIFR4.all = 0;
30
  PieCtrlRegs.PIEIFR5.all = 0;
31
  PieCtrlRegs.PIEIFR6.all = 0;
32
  PieCtrlRegs.PIEIFR7.all = 0;
33
  PieCtrlRegs.PIEIFR8.all = 0;
34
  PieCtrlRegs.PIEIFR9.all = 0;
35
  PieCtrlRegs.PIEIFR10.all = 0;
36
  PieCtrlRegs.PIEIFR11.all = 0;
37
  PieCtrlRegs.PIEIFR12.all = 0;
38
}  
39
40
41
void PieVectTableInit(void)
42
{
43
  int16  i;
44
  Uint32 *Source = (void *) &ISR_ILLEGAL;
45
  Uint32 *Dest = (void *) &PieVectTable;
46
    
47
  EALLOW;  
48
  for(i=0; i < 128; i++)
49
    *Dest++ = *Source;  
50
  EDIS;
51
52
  // Enable the PIE Vector Table
53
  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  
54
}

theoretisch wenn ich nun die Interrupt Funktion aufrufe, sollte das 
funktionieren, habe einiges rumprobiert, laufe aber momentan gegen die 
Wand,
1
interrupt void INT1_ISR(void)     // INT13 or CPU-Timer1
2
{
3
  
4
int_cntr_1++;//Zähler hochzählen
5
6
GpioDataRegs.GPASET.bit.GPIO15 = 1;//LED an
7
8
}

von ... (Gast)


Lesenswert?

Student schrieb:
> DINT;

da fehlt dann irgendwo auch ein:

EINT

von Student (Gast)


Lesenswert?

EINT befindet sich ganz unten in der DeviceInit funktion.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Am C28 braucht man folgendes, damit ein Interrupt vom Mudul bis zur CPU 
kommt:

- Global interrupt enable (EINT)
- CPU Interrupt Enable Register (IER)
- Peripherie Interrupt enable Register (PieCtrlRegs.PIEIER)
- Modul Interrupt enable Bit (Freigabe im Modul selbst)

Grüße,

Peter

von Christian W. (chrisw84)


Lesenswert?

Außerdem fehlt in der ISR:
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

Hast du dir die Beispiele (siehe meinen Link oben) angesehen?
Dort gibt es doch die Beispielprogramme. Da ist z.B. ein Beispiel 
CPU-Timer dabei. Da ist doch alles wunderbar erklärt!?


Viele Grüße

von Student (Gast)


Lesenswert?

Hallo, den Timer habe ich auch schon ausprobiert. Bin irgendwie zu blöd 
dafür, ich weiss nicht. Werde morgen versuchen das ganze nochmals zu 
implementieren.

Adios!

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.