mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430x169 und externer Quarz


Autor: Stephan Plaschke (steph0815)
Datum:

Bewertung
0 lesenswert
nicht 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:
        BCSCTL1 &= ~0xBF; 
        BCSCTL1 |= 0x40;
        
        BCSCTL2 &= ~0x77; 
        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:
  // initialise TIMERA1, compare mode, SMCLK/1, capture/compare int 
  TACTL    = 0x0200 | TACLR;  
  TACCTL1  = 0x0010;
  TACCR0    = 40;
  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

Autor: Berti (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steph0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan Plaschke (steph0815)
Datum:

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

  do 
  {
    IFG1 &= ~OFIFG;                       // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG) != 0);          // OSCFault flag still set?  
  
    
  P1SEL = 0x10;        // Port1 I/O Funktion
  P1DIR = 0x1F;        // Port1 Ausgang

  
  // initialise TIMERA1, compare mode, SMCLK/1, capture/compare int 
  TACTL    = 0x0200 | TACLR;  
  TACCTL1  = 0x0010;
  TACCR0    = 40;
  TACTL   |= MC_1;          // Start Timer_A in up mode  

  // global interrupt enable
  _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

Autor: Christian R. (supachris)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum benutzt du nich die Routine von TI direkt:
BCSCTL1 &= ~XT2OFF;                       // XT2on
  
unsigned char i;
do
  {
    IFG1 &= ~OFIFG;                           // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
while ((IFG1 & OFIFG));                   // OSCFault flag still set?

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

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.