Forum: Digitale Signalverarbeitung / DSP / Machine Learning Fragen zu externen Internets TMS320F2812


von merby (Gast)


Lesenswert?

Hallo zusammen,
ich soll für eine Studienarbeit eine kleine Motorsteuerung aufbauen. 
Soweit ja kein Problem nur habe ich ein paar Verständnisprobleme mit den 
Internets des TMS320.

Habe ich das richtig verstanden dass der DSP nur 2 unabhängige ISRs für 
externe Signale hat? Also kann ich nur XINT1 und 2 für externe ISRs 
verwenden? Ich möchte zum einlesen 3er Hall-Sensoren jeweils eine ISR 
nutzen.
Das geht ja dann folglich nicht oder? Oder gibt es noch eine Möglichkeit 
andere GPIO-Kanäle auf die User-ISRs zu routen? Der Sinn von diesen 
User-ISRs ist mir noch nicht so ganz klar... Oder sind das reine 
SW-Interrupts?

Bisher lese ich die Hall-Sensorwerte einfach zyklisch über ein 
Inputregister ein. Meinem betreuenden Professor gefällt diese Lösung 
aber nicht und ihm wäre eine Umsetzung über separate ISRs lieber...

Danke schonmal! Das dürfte ja eher eine kleine Verständnisfrage sein.

von Michael K. (Gast)


Lesenswert?

Laut Datenblatt hat das Ding 3 ext. Interrupts: XINT1/2/13. Zusätzlich 
können über die event manager je 3 weitere Interrupts generiert werden. 
Siehe die Seiten 36 und 62 im Datenblatt.

von merby (Gast)


Lesenswert?

Danke Michael für deine Antwort,
okay an den XINT13 habe ich nicht gedacht gehabt.

Bei den generierten Interrupts fehlt mir noch ein wenig das 
Verständnis...

Hast du zufällig ein Beispiel der Init parat? Kann ich dadurch "einfach" 
einen anderen Pin als Interrupt nehmen? Ich habe mir auch das Data Sheet 
und den separaten Userguide für den Eventmanager angeschaut aber 
irgendwie stehe ich da noch immer auf dem Schlauch. Ich konnte auch 
nirgende ein Register für die Polarität der generierten INTs finden.

Schöne Grüße und danke für die Hilfe!

von Michael K. (Gast)


Lesenswert?

Beispiel kann ich dir keines liefern, da ich die Xints beim 2812 nicht 
genutzt und das Teil überhaupt nur einmal verwendet habe. Was die Pins 
angeht hast du kaum Freiheiten und musst deine Peripherie entsprechend 
anschliessen. Bei den neueren C2000 (28035, 28335) könntest du die 
Zuordnung in Software erledigen und so quasi irgendeinen Pin benutzen. 
Die Register zum XINT findest du in spru078, Seite 144 (6-39). Die 
Einstell-Möglichkeiten sind sehr übersichtlich - sollte also kein 
größeres Problem sein.

von merby (Gast)


Lesenswert?

Vielen dank für deine Hilfe! Es läuft jetzt soweit wie ich es mir 
vorgestellt habe ;-)

Ich hab lediglich im Moment noch das Problem dass ich ständig in die 
ISRs in dem vorbereiteten DSP281x_DefaultIsr.c springe anstatt in meine 
ISRs welche ich in meinem Hauptprogramm geschrieben habe... Ich finde 
das nirgends eine Möglichkeit den "link" auf die vorbereiteten ISRs 
einzustellen. da finde ich auch in den anderen Examplecodes (bei denen 
es Funktioniert) keine Anhaltspunkt.


Schöne Grüße,

von merby (Gast)


Lesenswert?

habs gefunden! danke für deine Hilfe!

von merby (Gast)


Lesenswert?

sorry ich habe mich glaub ich zu früh gefreut...
der XINT13 streikt immer noch...

Ich hab den wie folgt Initialisiert(oben der funktionierende XINT1):


// Prototype statements for functions found within this file.
interrupt void XINT1ISR(void);
interrupt void INT13ISR(void);

//ab hier in der main:

   EALLOW;  // Allow access to EALLOW protected registers
   PieVectTable.XINT1 = &XINT1ISR;     // For signal
   PieVectTable.XINT13 = &INT13ISR;     // For signal
   EDIS;  // Disable access to EALLOW protected registers


   PieCtrlRegs.PIECRTL.bit.ENPIE = 1;          // Enable the PIE block
   PieCtrlRegs.PIEIER1.bit.INTx4 = 1;          // Enable PIE Group 1 
INT4 Xint1
  //!!!kein vergleichbares Register für XINT13 gefunden da er in keiner 
Group ist(non-peripheral)

//Clear Acknowledgebits
    PieCtrlRegs.PIEACK.all= M_INT2;

//Clear Interruptflags
    PieCtrlRegs.PIEIFR1.all = 0x0000;

//Check if all Intflags are zero
    while (PieCtrlRegs.PIEIFR1.all != 0x0000){}

//Select XINT13
   XIntruptRegs.XNMICR.bit.SELECT = 1;  // Select NMI Register as XINT13

// Configure XINT1
   XIntruptRegs.XINT1CR.bit.POLARITY = 1;      // rising edge interrupt
   XIntruptRegs.XNMICR.bit.POLARITY = 1;      // rising edge interrupt

// Enable XINT1
   XIntruptRegs.XINT1CR.bit.ENABLE = 1;        // Enable Xint1
   XIntruptRegs.XNMICR.bit.ENABLE = 1;        // Enable Xint13

EDIS;

Und die Routinen sehen wie folgt aus:

interrupt void XINT1ISR(void)
{
//CODE
   PieCtrlRegs.PIEIFR1.all;
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void INT13ISR(void)
{
//Code
   PieCtrlRegs.PIEIFR1.all;
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}


Der Interrupt am XINT13 reagiert überhaupt nicht... Ich weiß aber leider 
absolut nicht was ich noch aktivieren können müsste.


Schöne Grüße

von Michael K. (Gast)


Lesenswert?

Guck dir mal in spru078 die Abbildung 6-4 auf Seite 115 an. Demnach geht 
der INT13 gar nicht über die PIE, sondern direkt zur CPU. Dort kommt 
dann vermutlich spru430, Kapitel 3 ins Spiel. Wie du den aber konkret 
initialisieren musst kann ich dir leider nicht sagen, da ich das auch 
noch nicht gemacht habe.

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.