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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.