MSP430 Timer A1 Capture, TA1R automatisch resetten

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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.