Ich habe bei dem LaunchPad mal den Uhrenquarz eingelötet und funktioniert soweit scheinbar auch, ich kann auch auf P1.0 den Takt wieder rausgeben und messe dort auch 32768 Hz, aber wenn ich es als Quelle für Timer A verwende, mit Vorteiler 8 im BCSCTL1 und nochmal ein Teiler 8 im TACTL Register, und den Timer im Compare-Modus laufen lasse, mit 256 als Endwert, dann sollte doch der Interrupt dann mit 32768/8/8/256 = 2 Hz aufgerufen werden, oder? Er wird aber nur mit 1 Hz aufgerufen. Wo liegt mein Denkfehler?
Gibt es übrigens irgendwo ein Diagramm für den Clock-Tree für die MSP430-Chips, wie man es von anderen Herstellern kennt?
Hier der Source Code:
#include #include "msp430x20x2.h"
#define RED_LED BIT0 #define GREEN_LED BIT6 #define LED_DIR P1DIR #define LED_OUT P1OUT
#define BUTTON BIT3 #define BUTTON_OUT P1OUT #define BUTTON_DIR P1DIR #define BUTTON_IN P1IN #define BUTTON_REN P1REN
// Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { static uint8_t on = 0; if (on) { LED_OUT &= ~GREEN_LED; } else { LED_OUT |= GREEN_LED; } on = !on; TACCTL0 &= ~CCIFG; }
int main(void) { // Watchdog ausschalten WDTCTL = WDTPW + WDTHOLD;
// LED Pins auf Ausgang setzen LED_DIR |= RED_LED | GREEN_LED; // ACLK auf die rote LED ausgeben P1SEL |= RED_LED; // Button-Eingang konfigurieren BUTTON_DIR &= ~BUTTON; BUTTON_REN |= BUTTON;
// rote LED an LED_OUT |= RED_LED;
// den Low Frequency Mode für den externen Quarzeingang setzen BCSCTL1 &= ~XTS; // durch 8 teilen BCSCTL1 |= DIVA_3; // 32768 Hz Modus einstellen BCSCTL3 &= ~(LFXT1S0 | LFXT1S1); // 12.5 pF einstellen BCSCTL3 |= XCAP0 | XCAP1;
// zunächst ggf. aktiven Capture/Compare Interrupt für Timer ausschalten TACCTL0 = 0;
// Timer im "Up" Modus laufen lassen, mit ACLK getaktet TACTL = TASSEL_1 | MC_3 | ID_3; // Timer stoppen // (siehe Kapitel 12.2.2 vom MSP430x2xx Family User's Guide) TACCR0 = 0; // neuen Grenzwert festlegen. Der Timer läuft jetzt wieder von 0 los TACCR0 = 256;
// Capture/Compare Interrupt einschalten TACCTL0 = CCIE;
// Low Power Mode 0 aktivieren und Interrupts aktivieren // Die CPU hält hiernach an und läuft nur noch im Interrupt __bis_SR_register(LPM0_bits | GIE); // wird nicht erreicht return 0; }