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! :)