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.
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.
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!
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.
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,
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.