Timer-Überlauf auf MSP430

Ich verwende einen Interrupt, um den Mikrocontroller zu wecken, sobald der Wert erreicht ist. Ich sehe, dass es im Capture/Compare Control Register ein Capture Overflow-Bit gibt. Ich kann anscheinend kein Beispiel für die Überprüfung dieses Bits finden, sobald der Wert erreicht wurde. Ein Beispiel -Interrupt sah so aus:

#pragma vector = TIMERA0_VECTOR
__interrupt void CCR0_ISR(void) {
    if (++i == 120) {
        P1OUT ^= RLY1;
        i=0;
    }
} // CCR0_ISR

Dies überprüft jedoch nicht den Wert des Bits. Wie überprüfe ich also, ob der Timer übergelaufen ist?

Vermutlich setzt der Rest des Beispiels den Timer in einen Modus, in dem der Überlauf das einzige Unterbrechungsereignis ist. Wenn der Timer also nicht übergelaufen ist, haben Sie diesen Code nicht erreicht.
könnten Sie bitte sagen, was Ihre genaue Ausgabe war?

Antworten (2)

Sie sind sich nicht sicher, welche MSP-Serie Sie verwenden, daher müssen Sie die Einzelheiten nachschlagen. Aber die Grundprämisse sollte allgemein gelten, denke ich.

Das folgende Beispiel stammt aus der Datei msp430g2xx1_ta_03.cin den Codeschnipseln, die aus dem TI-Wiki heruntergeladen werden können :

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
 switch( TAIV )
 {
   case  2: break;                          // CCR1 not used
   case  4: break;                          // CCR2 not used
   case 10: P1OUT ^= 0x01;                  // overflow
            break;
 }
}

Der Schlüssel überprüft das TAIVRegister, um zu sehen, was den Interrupt verursacht hat. Werfen Sie einen Blick auf Seite 416 des Benutzerhandbuchs der CC430-Familie :

Beschreibung des TAIV-Registers

Jetzt sucht das Codebeispiel nach einem Wert von 10im TAIVRegister und das Benutzerhandbuch gibt an, dass dies 0x0Eder Überlauf ist. Überprüfen Sie also erneut die Dokumentation Ihres spezifischen Chips. Aber das TAIVRegister sagt Ihnen, was die Ursache des Interrupts ist.

Es gibt 2 Unterbrechungsquellen für Timer A

  1. Timer-Überlauf#pragma vector = TIMERA0_VECTOR
  2. Capture/Compare-Interrupt#pragma vector = TIMERA1_VECTOR

Die von Ihnen gesuchte Interrupt-Routine wird ausgeführt, wenn der Timer überläuft und nicht, wenn das Vergleichsregister mit TAR übereinstimmt. Sie sollten die TAIV-Registrierung verwenden

    #pragma vector = TIMERA1_VECTOR
__interrupt void CCR0_ISR(void) 
{
 //check TAIV for compare/capture interrupt
}