MSP430 Timer A1 Capture, TA1R automatisch resetten

Gast #4946112
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! :)
#4946278
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.
Gast #4946744
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! :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren