MSP430: Takt intern geteilt?!

Gast #1420664
Lesenswert?

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
Gast #1420674
Lesenswert?

Kleiner Nachtrag: Ich schaue mir auch im Einzelschritt den 
Assembler-Code an. Da passiert auch nix anderes als ein XOR am Port und 
dann ein Jump zurück zum XOR. So viele Zyklen kann das doch nicht 
dauern...
Gast #1420697
Lesenswert?

Meine Fresse, seid ihr schnell :-)

@Tobias: An P5.4 hab ich 16 MHz, wie erwartet.

@all:
Die Instruktionen sehen so aus:
1
xor.b #0x1,&P1OUT
2
jmp 0x3160

Jetzt geh ich ins Datenblatt uns sehe...
2 Cycles für jmp (Format-III Instruction) und
5 Cycles für's xor (Format-I (Double Operand) Instruction).
Macht zusammen 7 Cycles für's Toggeln.

Da komm ich aber doch trotzdem nicht hin, oder hab ich mir verzählt?
Gast #1420713
Lesenswert?

Ja, alles klar. Dann hab ich's schon.

Anfang mit Lowpegel, xor (5 Zyklen) auf High, Jump (2 Zyklen), xor auf 
Low (nochmal 5 Zyklen) macht 12 Zyklen und die Periode ist durch.

Danke für eure Hilfe!
Daniel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren