Hallo zusammen, habe folgende Initialisierung um einen MSP430 jede 1 ms aus dem LPM3 zu holen und eine Uhr zu betreiben. D.h. alle 1024 Interrupts wird eine Sekunde hinzugezählt. Zusätzlich wird alle 10 Interrupts ein Sensor abgefragt. Leider ist die Uhr nicht besonders genau (1 Sekunde pro Std zu schnell). Ist die Initialisierung falsch? Gibt es eine Möglichkeit die Uhr genauer zu machen (ausser DCF)? Stromsparlösung bevorzugt.
1 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer |
2 | FLL_CTL0 &= ~XTS_FLL; // XT1 0 low-frequency |
3 | _BIC_SR(OSCOFF); // turn on XT1 oscillator |
4 | |
5 | do // wait in loop until crystal is stable |
6 | IFG1 &= ~OFIFG; |
7 | while (IFG1 & OFIFG); |
8 | |
9 | FLL_CTL1 &= ~FLL_DIV0; // ACLK = XT1 |
10 | FLL_CTL1 &= ~FLL_DIV1; |
11 | |
12 | IFG1 &= ~OFIFG; // clear osc. fault int. flag |
13 | FLL_CTL1 &= ~SELM0; // set DCO as MCLK |
14 | FLL_CTL1 &= ~SELM1; |
15 | |
16 | BTCTL = BTIP2; // BT1 interrupt freq. = 1024Hz |
17 | // aus ACLK = 32.768kHz
|
18 | _EINT(); // Enable interrupts |
19 | |
20 | |
21 | _BIS_SR(LPM3_bits + GIE); // in Low Power Mode 3 |