Nabend!
Ich verzweifle gerade an folgendem Problem:
An meinem MSP430F2618 hängt ein externer Quarz mit 16 MHz an XT2. Den
möchte ich jetzt als Masterclock verwenden. Ich initialisiere den mit
diesem Code:
1 | int main( void ) {
|
2 | // Stop watchdog timer to prevent time out reset
|
3 | WDTCTL = WDTPW + WDTHOLD;
|
4 |
|
5 | //Ports initialisieren
|
6 | P1DIR = 0xFF; //P1 as output
|
7 | P1SEL = 0x00; //GPIO
|
8 | P1OUT = 0x00;
|
9 |
|
10 | //volle Fahrt auf's Clockmodul
|
11 | init_XT2();
|
12 | //DCO abschalten
|
13 | _BIS_SR(SCG0);
|
14 |
|
15 | for(;;) {
|
16 | P1OUT ^= 0x01; //toggle bit 1
|
17 | }
|
18 | }
|
19 |
|
20 |
|
21 |
|
22 | void init_XT2(void) {
|
23 | unsigned int i;
|
24 | BCSCTL3 |= XT2S_2; //16MHz mode
|
25 | BCSCTL1 &= ~XT2OFF; // XT2 = HF XTAL
|
26 | do {
|
27 | IFG1 &= ~OFIFG; // Clear OSCFault flag
|
28 | BCSCTL3 &= ~XT2OF; // clear xt2 osc. fault bit (maybe not neccessary but safe)
|
29 | for (i = 0xFF; i > 0; i--); // Time for flag to set
|
30 | }
|
31 | while ((IFG1 & OFIFG)); // OSCFault flag still set?
|
32 | BCSCTL2 |= SELM1 + SELS; // MCLK and SMCLK = XT2
|
33 | }
|
Das klappt wunderbar, der Quarz schwingt an, Oszi und Frequenzzähler
messen 16 MHz.
Nun wackel ich an P1.1 und messe da allerdings nur 1,33 MHz. Schaue ich
mir die zuständigen Register an, ist aber alles richtig eingestellt. Der
Takt wird laut den Prescaler-Bits nicht geteilt. Woher kommt denn jetzt
der Teilerfaktor 12 (16:1,33 = 12)?!
Ich bin echt dankbar, wenn mir jemand eine Kerze ins Dunkel stellt!
Daniel