Forum: Digitale Signalverarbeitung / DSP / Machine Learning Zyklischer aufruf der ISR mit eCAP


von TMS320F2803x² (Gast)


Lesenswert?

Hallo,
ich verwende den o.g. DSC.
Ist es prinzipiell möglich mit den eCAP einen zyklischen Interrupt zu 
erzeugen, wie z.B. mit einem "normalen" Timer?
Der tolle Reference Guide "SPRUFZ8A" gibt nicht soviel her.

Ich habe es jetzt mal wie folgt konfiguriert:
1
  // Konf. ECAP 1 im APWM mode. ISR soll aufgerufen werden, wenn Timer=PRD.
2
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;  // Stop TSCTR
3
ECap1Regs.ECEINT.all=0;    // Interrupts deaktivieren
4
ECap1Regs.ECCLR.all = 0x0FF; // Interruptflags löschen
5
ECap1Regs.ECEINT.bit.CTR_EQ_PRD = 1; // Erlauber Interrupt, wenn Zähler==Periode
6
ECap1Regs.ECCTL2.bit.CAP_APWM = 1;// ECAP 1 im APWM mode
7
ECap1Regs.CAP1 = 5000; // Setzte Wert für eine Periode
8
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start TSCTR

In der ISR ist folgendes zu finden:
1
  // Lösche Anforderungsflag
2
     ECap1Regs.ECCLR.bit.INT = 1;
3
4
   // Bekomme wetrere Interrups
5
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

Die Interrupts sind freigegeben, PIE ist gesetzt, etc.. Das sollte alles 
passen.
Nun wird die ISR nicht nur aufgerufen wenn Zähler==Periode, sondern 
irgendwie alle ?4-8? Takte!
Habe ich da etwas falsch konfiguriert?
Das eCAP-Register ist wohl ein wenig exotisch.... :o)

Hoffe jemand kann da mal drüber schauen!

von TMS320F2803x² (Gast)


Lesenswert?

So,
ich habe es nun hinbekommen, dass Interrupte bei CTR==PRD erzeugt 
werden:

Die Konfiguration der Register:
1
   ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
2
   ECap1Regs.ECCLR.all = 0xFF;              // Clear all CAP interrupt flags
3
   ECap1Regs.ECCTL1.all = 0;          // Disable ECCTL1
4
   ECap1Regs.ECCTL2.all = 0;        // Stop the counter and disable all
5
   
6
    // Configure peripheral registers         
7
   ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Disable sync in
8
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 3;       // Disable sync out
9
   ECap1Regs.ECCTL2.bit.CAP_APWM=1;      // Set APWM Mode
10
   ECap1Regs.ECEINT.bit.CTR_EQ_PRD=1;    // Enable int @ CTR==PRD
11
   ECap1Regs.CAP1=10000;          // Load periode register
12
   ECap1Regs.ECCTL2.bit.TSCTRSTOP=1;  // Start the counter

In der ISR ist zu finden:
1
   ECap1Regs.ECCLR.bit.INT = 1;        // Clear the ECAP1 interrupt flag
2
  ECap1Regs.ECCLR.all = 0xFF;          // Clear all interrupt flags
3
  
4
   // Acknowledge this interrupt to receive more interrupts from group 4
5
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

Das Problem ist nun noch, dass 2 Interrupte erzeugt werden. Bei CTR=PRD 
und ein Weiterer mit einem zeitlichen Versatz von ca. 250 ns.
Für einen Tipp wäre ich sehr dankbar!

Grüße

von Kai Z. (liquidsteel)


Lesenswert?

Hi,

ich habe gerade selber erfolgreich ein projekt mit dem eCAP 
abgeschlossen. Ja im Prinzip ist ein zyklischer Interrupt möglich mit 
dem eCAP, falls du nen Timer nicht benutzen möchtest (wäre einfacher).
Ich habe das eCAP auch als APWM benutzt.
Versuch das gleiche doch mal mit CTR = CMP und dem CAP2 und schau was 
passiert.

Wenn der Versatz des zweiten Interrups konstant ist dann verfolg das 
doch zurück. Also mittels des Clocks des eCAP kannste ja zurückrechnen 
bei welchem Count der zweite Interrupt erfolgt.

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.