Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer A1 Capture, TA1R automatisch resetten


von John war's (Gast)


Lesenswert?

Hallo liebe MSP430-Spezialisten! ;)
Ich habe hier in der Uni das Launchpad MSP-Exp430G2 mit einem 
MSP430G2553 vor mir und soll damit möglichst schnelle Pulse vermessen 
bzw. ihre Länge erfassen.
Dazu nutze ich den Timer A1 im Capture Modus:
1
// SMCLK + div. 1 + cont. mode + up
2
TA1CTL = TASSEL_2 | ID_0 | MC_2;
3
// Capt. both r/f edges + CCI0A + synch. + capture mode + int. enabled
4
TA1CCTL0 = CM_3 | CCIS_0 | SCS | CAP | CCIE;
Es wird sowohl bei steigender als auch fallender Flanke gecaptured, der 
Wert jedoch eigentlich nur bei der fallenden Flanke genutzt. Bei jedem 
Capture Interrupt wird geschaut, ob es sich um eine steigende oder 
fallende Flanke handelte. Bei einer Steigenden wird TA1R zurückgesetzt, 
um dann bei einer Fallenden den Wert der vergangenen Zeit im Ringpuffer 
zu speichern:
1
#pragma vector=TIMER1_A0_VECTOR
2
__interrupt void Timer1_A0_capt (void) {
3
    // Rising edge?
4
    if(P2IN & BIT0) {
5
        TA1R = 0;
6
    // Falling edge?
7
    } else {
8
        buffer[bufferEnd++] = TA1CCR0;
9
        bufferEnd %= BUFFERSIZE;
10
    }
11
}
Nun meine Frage:
Gibt es eine elegantere Möglichkeit bei einer steigenden Flanke TA1R zu 
resetten?
So gehen mir ja immer ein paar Takte verloren, bis der Interrupt 
tatsächlich ausgeführt und TA1R gelöscht wurde. Das ist zwar berechenbar 
und einigermaßen deterministisch, aber schön wäre ein Automatismus 
dennoch! ;)
Ich würde gerne noch schnellere Pulse vermessen und das Ausführen des 
"unnötigen" Interrupts raubt mir kostbare Zeit.

Danke im Voraus!
... John war's! :)

von Clemens L. (c_l)


Lesenswert?

Ein Timer hat mehrere CCRs, es wäre also schade, den gesamten Timer für 
ein Signal zu verschwenden.

Du kannst einfach die CCR-Werte in beiden Interrupts lesen und 
voneinander subtrahieren.

Falls der Puls so kurz sein könnte, dass die zweite Flanke kommt, bevor 
der Interrupt-Handler den ersten Wert gelesen hat, musst du das Signal 
mit zwei Pins verbinden und die steigende und fallende Flanke mit einem 
jeweils eigenem CCR messen.

von John war's (Gast)


Lesenswert?

Hallo  Clemens,
Danke für Deine Antwort!
Das ist eine gute Idee, werde ich gleich heute mal implementieren! :)
Schade, dass es keinen automatischen Reset für steigende/fallende 
Flanken gibt, das würde mir das Subtrahieren für die Zeitdifferenz 
sparen ...

Gibt es eigentlich MSP430 mit einem DMA-Kanal für Timer-Events? Ich habe 
zwar im family guide (pp. 287) davon gelesen, aber irgendwie scheinen 
alle Bausteine nur DMA für den ADC bereitzustellen!? :-/

Danke nochmals!
... John war's! :)

von Clemens L. (c_l)


Lesenswert?

John war's schrieb:
> Gibt es eigentlich MSP430 mit einem DMA-Kanal für Timer-Events?

Timer-Interrupts sind mögliche Trigger-Quellen. Der DMA-Controller kann 
beliebige Speicheradressen lesen und schreiben, also auch 
Timer-Register.

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.