Forum: Mikrocontroller und Digitale Elektronik MSP430x169 und externer Quarz


von Stephan P. (steph0815)


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

von Berti (Gast)


Lesenswert?

Ich verwende zu 90% die TI Samplecodes (oder die von CrossWorks) und da 
findet man fast immer die gewünschten Informationen!

von Christian R. (supachris)


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 !

von szimmi (Gast)


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?

von Christian R. (supachris)


Lesenswert?

Das fiese ist, dass bei 3,3V und 8MHz genauestens auf die Kondensatoren 
am XT2 geachtet werden muss. Ich hatte es schon mehrfach, dass der XT2 
nicht anschgeschwungen ist. Der Oszillator ist wohl nicht besonders.

von Steph0815 (Gast)


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

von szimmi (Gast)


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.

von Stephan P. (steph0815)


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

von Christian R. (supachris)


Lesenswert?

Warum benutzt du nicht die Makros für die Register-Bits? So sieht doch 
kein Mensch durch.

von Stefan (Gast)


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!

von Christian R. (supachris)


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.

von Falk B. (falk)


Lesenswert?

@ Christian R. (supachris)

>Warum benutzt du nich die Routine von TI direkt:

Warum einfach, wenn es auch umständlich geht? ;-)

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

Ja, aber DANACH!

MfG
Falk

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.