MSP430 Probleme mit ACLK und Uhrenquarz

29/12/2010 - 01:58 von Frank Buss | Report spam
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 <stdint.h>
#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;
}

Frank Buss, http://www.frank-buss.de
piano and more: http://www.youtube.com/user/frankbuss
 

Lesen sie die antworten

#1 Christian Zietz
29/12/2010 - 10:59 | Warnen spam
Frank Buss schrieb:

Er wird aber nur mit 1 Hz aufgerufen. Wo liegt mein Denkfehler?
[...]
// Timer im "Up" Modus laufen lassen, mit ACLK getaktet
TACTL = TASSEL_1 | MC_3 | ID_3;



MC_3 ist der Up/down-Modus.

Christian
Christian Zietz - CHZ-Soft - czietz (at) gmx.net
WWW: http://www.chzsoft.de/
PGP/GnuPG-Key-ID: 0x6DA025CA

Ähnliche fragen