MSP430x169 und externer Quarz

OP #733533
Lesenswert?

Also ich hab hier das MSP430-169STK von Ollimoex. Auf dem ist ein 8MHz 
Quarz vorhanden. Diesen wollte ich jetzt aus stabilitätsgründen in 
Betrieb nehmen. Laut meinen Verständniss muss ich dazu nur die BCSCTLx 
Register einstellen. Dies mache ich wie folgt:
1
        BCSCTL1 &= ~0xBF; 
2
        BCSCTL1 |= 0x40;
3
        
4
        BCSCTL2 &= ~0x77; 
5
        BCSCTL2 |= 0x88;
Wenn ich mir dann an P1.4 den SMCLK ausgeben lasse entspricht dieser 
auch den geforderten 8MHz. Wenn ich allerdings den TIMERA1 wie folgt 
initialisiere:
1
  // initialise TIMERA1, compare mode, SMCLK/1, capture/compare int 
2
  TACTL    = 0x0200 | TACLR;  
3
  TACCTL1  = 0x0010;
4
  TACCR0    = 40;
5
  TACTL   |= MC_1;          // Start Timer_A in up mode
entspricht der Timerwert nicht den geforderten 40*1/8MHz sondern nur 
40*1/1MHz. Dementsprechend habe ich irgendwo den Teiler 8. Ich habe 
schon viel ausprobiert nur leider zu keinen Ergebnis gekommen.
Das zweite Problem ist wenn ich die Initialisierung hier aus den Forum 
verwende (siehe 
http://www.mikrocontroller.net/articles/MSP430_Codebeispiele) hänge ich 
die ganze Zeit in der Schleife. Diese dient ja der Überprüfung des 
Oscillators. Der wiederrum schwingt aber wenn ich direkt an den Pins 
messe.

Hoffe hier kann mir jemand helfen.

Greetz
Stephan
#733549
Lesenswert?

1. Hast du die externen beiden Kondensatoren an den Quarz gelötet und 
vorher entsprechend der Lastkapazität des Quarzes berechnet?

2. Verwende doch bitte mal die Makros für die Bits in den Registern.

3. Du musst auf jeden Fall warten, bis der Quarz stabil angeschwungen 
ist, das Stück Code gibts ja auch bei TI.

4. Wenn du wirklich 8MHz verwenden willst, muss die Betriebsspannung 
erhöht werden, mit 3,3V läuft der µC dann entweder instabil oder gar 
nicht. Du musst 3,6V Vcc anlegen !
Gast #733559
Lesenswert?

Also von den 8MHz als MCLK kann ich nur abraten. Die 3,6V, die man dafür 
braucht, sind auch die obere Grenze für Vcc bei Programmausführung. 
Diese Konfiguration ist eigentlich schon ein Widerspruch in sich. Das 
wird zwar in den meisten Fällen laufen, aber bei Problemen wird TI 
freundlich die Hände heben...
Den ACLK und SMCLK kannst Du natürlich mit den 8MHz laufen lassen, kein 
Problem.
In dem Code selbst seh ich erstmal keinen Fehler, zumal Du ja die 8MHz 
für den SMCLK messen kannst.
Kannst Du mal den kompletten Init-Code posten?
Gast #734159
Lesenswert?

Bin jetzt leider nicht mehr am Platz (endlich Urlaub!!) werd das aber im 
neuen Jahr hier posten. Das komische ist ja nur das, das Olimex Board 
mit einem 8MHz Quarz ausgeruestet ist. Daher hatte ich da keine 
Bedenken. Eigentlich reichen mir auch 4MHz aber ausloeten seh ich etwas 
kritisch bei dem Board, da es nicht meins ist und mir nur zur Verfuegung 
gestellt wurde....

Aber danke schon mal!
Wuensch euch dann ein frohes Fest und einen guten Rutsch!!

Stephan
Gast #734187
Lesenswert?

Hiho,
brauchst den Quarz nicht runterreißen. Stell den MCLK-Teiler einfach auf 
2 und lass die CPU mit 4 MHz laufen, dann reichen die 3,3V.
SMCLK und ACLK kannst Du wie gesagt mit den 8MHz betreiben.
Ansonsten schoene Feiertage.
OP #745763
Lesenswert?

So hier dann mal meine ganze Init:
1
  WDTCTL = WDTPW + WDTHOLD;  // watchdog ausschalten
2
//  error_DCO = Set_DCO(uC_FREQUENCY);
3
    
4
  BCSCTL1 &= ~0xBF; 
5
  BCSCTL1 |= 0x40;
6
    
7
  BCSCTL2 &= ~0x67; 
8
  BCSCTL2 |= 0x98;   /* <- geändert um 4MHz MCLK zu bekommen */
9

10
  do 
11
  {
12
    IFG1 &= ~OFIFG;                       // Clear OSCFault flag
13
    for (i = 0xFF; i > 0; i--);           // Time for flag to set
14
  }
15
  while ((IFG1 & OFIFG) != 0);          // OSCFault flag still set?  
16
  
17
    
18
  P1SEL = 0x10;        // Port1 I/O Funktion
19
  P1DIR = 0x1F;        // Port1 Ausgang
20

21
  
22
  // initialise TIMERA1, compare mode, SMCLK/1, capture/compare int 
23
  TACTL    = 0x0200 | TACLR;  
24
  TACCTL1  = 0x0010;
25
  TACCR0    = 40;
26
  TACTL   |= MC_1;          // Start Timer_A in up mode  
27

28
  // global interrupt enable
29
  _EINT();
wie von Szimmi beschrieben habe ich den MCLK auf 4MHz gestellt(hoffe 
ich) aber das Ergebnis ist das gleiche. Ich komme nicht aus der do-while 
Schleife herraus.
Muss ich sonst noch was ändern?

Danke
Gast #745870
Lesenswert?

Obwohl das eigentliche Problem damit wohl nicht gelöst wird...
... aber Deine Vorgehensweise ist falsch!
Du setzt MCLK und SMCLK sofort auf XT2CLK und prüfst dann auf OSC_FAULT.
Wenn OSC_FAULT besteht, dann läuft logischerweise die CPU nicht mehr.
Also zumindest MCLK auf DCOCLK belassen, OSC_FAULT checken und falls 
dann alles OK ist, kannst Du MCLK auf XT2CLK setzen!
#745893
Lesenswert?

Warum benutzt du nich die Routine von TI direkt:
1
BCSCTL1 &= ~XT2OFF;                       // XT2on
2
  
3
unsigned char i;
4
do
5
  {
6
    IFG1 &= ~OFIFG;                           // Clear OSCFault flag
7
    for (i = 0xFF; i > 0; i--);               // Time for flag to set
8
  }
9
while ((IFG1 & OFIFG));                   // OSCFault flag still set?
10

11
BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2 (safe)

Das funktioniert zuverlässig. Die Teilung durch 2 musst du noch 
reinmachen.

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