Forum: Mikrocontroller und Digitale Elektronik MSP430: Takt intern geteilt?!


von Daniel (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du steuerst den Pin mit Software an. Sieh Dir doch mal an, welche 
Assemblerinstruktionen der Compiler aus dem Inhalt Deiner Schleife 
gemacht hat und sieh Dir an, wieviele Takte diese Instruktionen 
benötigen.

von Daniel (Gast)


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...

von Tobias K. (kurzschluss81)


Lesenswert?

Konigurier pin 5.4 (Siehe Datenbaltt 
http://focus.ti.com/lit/ds/symlink/msp430f2618.pdf auf Seite 11) einfach 
mal als Spezialfunktion. Dort kommt dein MCLK als Tackt dann raus ohne 
Prescaler oder ähnliches da funkt auch deine Software nicht zwischen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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...

Sieh nach, schreibs auf. Sind ja nur 12 Taktzyklen.

von Daniel (Gast)


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?

von Nicolas S. (Gast)


Lesenswert?

Zweimal Toggeln ist eine Periode.

von Daniel (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.