www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik msp430f5438 und quarz


Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich bin langsam am Verzweifeln. Ich nutze den MSP430F5438 bisher mit 
internem Clock. Um da für meine Applikation noch etwas mehr Performance 
rauszuholen würde ich den MSP gerne mit externem Quarz und versuchsweise 
mit den möglichen 18MHz betreiben. Nur habe ich es bis jetzt nicht 
geschafft, das Teil mit einem externen Quarz zu betreiben. Auf der 
Homepage von TI gibt e auch keine Application Note zu dem Thema, bzw. 
nur zu den anderen MSP430.

Hat schonmal jemand einen externen Quarz zum laufen bekommen und kann 
mir mal nen Codeschnipsel zukommen lassen? Habe schon versucht mir aus 
dem Datenblatt, Abschnitt UCS zusammenzureimen, wie's laufen muss, aber 
kriege es einfach nicht hin.

Hat von euch schon jemand Erfahrung damit gemacht?

Vielen Dank und viele Grüße,
mui

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Initialisierung für einen 8MHz-Quarz an XT1, sowie die 
Initialisierung von ACLK und MCLK auf 8 MHz und SMCLK auf 1 MHz:

// 8 MHz-Quarz an XT1 (im HF-Modus)

// Portpins für XT1 "freischaufeln"
P7SEL |= 0x03;                  // XT1 an P7.0 und P7.1

/ XT2 wird nicht genutzt, XT1 im HF-Modus
UCSCTL6 = XT2OFF | XTS;

// warten, bis XT1 stabilisiert
do
{
  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                // Fehlerflags für XT2,XT1,DCO löschen
  SFRIFG1 &= ~OFIFG;            // Oszillatorfehlerflag löschen
}
while (SFRIFG1 & OFIFG);        // Oszillatorfehlerflag testen
  

// Taktquellen und Teiler für ACLK, SMCLK und MCLK wählen
UCSCTL4 = 0;

// SELA = 0   ACLK = XT1CLK
// SELS = 0   SMCLK = XT1CLK
// SELM = 0   MCLK = XT1CLK

UCSCTL5 = DIVS_3;

// DIVPA = 0
// DIVA = 0    ACLK /1
// DIVS = 3    SMCLK /8
// DIVM = 0    MCLK /1


Hilfreich sind die Codebeispiele von TI für den '5438 (slac166).

Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Codeauszug.

Habe ich jetzt gerade mal probiert, allerdings habe ich nur einen 
12MHz-Quarz hier. Das Programm bleibt in der do - while schleife hängen, 
das OFIFG-Flag wird nicht gelöscht. Auf dem Oszi kann ich aber sehen, 
das der Quarz mit 12MHz schwingt, allerdings nur mit Vpp ~300mV. Ist das 
okay soweit, oder gibt's da noch n anderes Problem? Ich verstehe halt 
nicht, wieso das Flag nicht gelöscht wird, obwohl der Quarz schwingt?!

Jemand noch eine Idee?

Viele Grüße,
mui

Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: mit einem 8MHz Quarz funktionierts...komisches Ding...aber 
komme ich damit auch irgendwie auf die maximal möglichen 16MHz? Mit der 
FLL?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, das hatte ich übersehen.

Es gibt auch noch ein Konfigurationsregister, in dem man die 
Treiberstärke für XT1 beeinflussen kann, was je nach Frequenz des 
Quarzes unterschiedlich ist.

Das sind die Bits XT1DRIVE (7 & 6) in UCSCTL6. Bei meiner 
Initialisierung sind sie auf 0 gesetzt.
XT1DRIVE Bits 7-6

The XT1 oscillator current can be adjusted to its drive needs. 
Initially, it starts with the highest supply current for reliable 
and quick startup. If needed, user software can reduce the drive 
strength.


00   Lowest current consumption for XT1 LF mode. XT1 oscillator 
     operating range in HF mode is 4 MHz to 8 MHz.

01   Increased drive strength for XT1 LF mode. XT1 oscillator 
     operating range in HF mode is 8 MHz to 16 MHz.

10   Increased drive capability for XT1 LF mode. XT1 oscillator 
     operating range in HF mode is 16 MHz to 24 MHz.

11   Maximum drive capability and maximum current consumption 
     for XT1 LF mode. XT1 oscillator operating range in HF mode 
     is 24 MHz to 32 MHz.

Ändere also die Zeile
UCSCTL6 = XT2OFF | XTS;

zu
UCSCTL6 = XT2OFF | XTS | XT1DRIVE_1;

und Dein Quarz sollte auch mit 12 MHz funktionieren.

Autor: metaljack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum thema msp430f5438 und quarz hätt ich auch grad n problem 
beizusteuern.
eigentlich ist ja nur ein systemclock von 18MHZ vorgesehn. ich war 
trotzdem mal so frech nen 20MHz quarz draufzusetzen. der funktioniert 
auch allerdings nur mit voller treiberstärke XT2DRIVE_3.
soweit sogut.
XT2 hab ich auf MCLK und SMCLK geleitet und betreibe damit TimerA mit 
100Hz - zur überprüfung lass ich ne LED mit TAISR blinken.
Wenn ich jetzt allerdings TimerB mit SMCLK als clock source versuche zu 
initialisieren wird der TimerA bzw das Blinken der LED deutlich 
langsamer.
kennt jemand dieses Phänomen?
leider habe ich keine möglichkeit zu debuggen da mein IAR den MSP nicht 
zu erkennen scheint. kann immer nur das fertig kompilierte über 
LiteFETPro430 flashen.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> XT2 hab ich auf MCLK und SMCLK geleitet

Hä? An XT1 hängt Dein 20-MHz-Quarz und was hängt an XT2?


> leider habe ich keine möglichkeit zu debuggen da mein IAR den MSP nicht
> zu erkennen scheint.

Und womit erzeugst Du dann Dein Programm?

Welche IAR-Version verwendest Du?

Autor: metaljack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee, mein quarz hängt an xt2, deswegen auch XT2DRIVE_3

ich benutze IAR EW4.11 Kickstart. der kompiliert und linkt mir den spaß 
zusammen und ich flash das output file mit dem LiteFET430Pro.
funktioniert an sich ganz gut.

ich häng ma nochn paar codeschnipsel an zum besseren verständnis:

ClockInitialisierung
void ClockInitXT2(void)
{
  P5SEL |= 0x0C;                            // Port select XT2

  UCSCTL6 &= ~XT2OFF;                       // Enable XT2
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                            // Since LFXT1 is not used,
                                            // sourcing FLL with LFXT1 can cause
                                            // XT1OFFG flag to set
  UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO
  UCSCTL6 |= XT2DRIVE_2;
  // Loop until XT1,XT2 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  UCSCTL5=0;  //all divider =1
  UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
  UCSCTL6 |= XT2DRIVE_3;                                // expected frequency
  UCSCTL4 = SELS_5 + SELM_5 + SELA_0;               // SMCLK=MCLK=XT2
}

Hier dann TimerA
void CtrlInitTA(void)
{
  TA1CTL = TASSEL_2 + MC_1 + TACLR + ID_0;         // SMCLK, upmode, clear TAR
  TA1CCTL0 = CCIE;                          // CCR0 interrupt enabled
  TA1CCR0 = TA_COUNTER;                    //SYS_CLOCK/TA_FREQ
  //TA1CCR2 =25;
   // P2DIR|=BIT3;P2SEL|=BIT3;P2REN&=~BIT3;
}

und hier schmeist es mir dann die clocks durcheinander

TBCTL = TBSSEL_2 + MC_1 + TBCLR + ID_0+CNTL__16;         // SMCLK, upmode, clear TBR
  TBCCTL0 = CCIE;                          // CCR0 interrupt enabled
  TBCCR0 = 556;
 // TBCCR2 =25;

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht merkwürdig aus

  UCSCTL4 = SELS_5 + SELM_5 + SELA_0;               // SMCLK=MCLK=XT2

ACLK speist Du mit XT1. Was hängt da dran?

Und was bezweckst Du mit den XT2DRIVE-Modifikationen?


  UCSCTL6 |= XT2DRIVE_2;

XT2DRIVE_2 ist XT2DRIVE1


  UCSCTL6 &= ~XT2DRIVE0;  // Decrease XT2 Drive according to

Das löschst Du, es war aber nie gesetzt

  UCSCTL6 |= XT2DRIVE_3;  // expected frequency

Und jetzt setzt Du XT2DRIVE0 und XT2DRIVE1

Das Umschalten von XT2DRIVE_2 zu XT2DRIVE_3 nennst Du im Kommentar 
"decrease", das ist ... eine interessante Auslegung.

Autor: metaljack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an XT1 hängt n 32khz quarz für ACLK.

die kommentare darfst du nich all zu ernst nehmen, da ich die 1tens aus 
einem der Codebeispiele von TI genommen hab und dann im moment dabei bin 
mit den einstellungen n bissel zu spielen.

die Codezeile

UCSCTL6 &= ~XT2DRIVE0;  // Decrease XT2 Drive according to

is natürlich mit dem darauffolgenden ziemlich sinnfrei
aber entscheidend dabei war eigentlich nur dass ich die treiberstärke 
auf 3 stellen musste da mit XT2DRIVE_2 er schon den TimerA nich richtig 
zum laufen gebracht hat. glaub ich zumindest. genau wissen tu ichs nich 
mehr, werds aber gleich nochmal ausprobieren.

leider hab ich keine möglichkeit ne frequenz messtechnisch zu ermitteln 
daher immer der behelf mit den leds.
lasse eine auf 100Hz und eine dann noch über nen counter in der TAISR 
auf 1Hz laufen damit ichs wenigstens so grob abschätzen kann obs alles 
so hinhaut wie ich das gern hätt.

das eigentliche problem  is ja wenn mir wirklich irgendwas mit dem XT2 
passiert, dann is meine ganze kommunikation per UART mit dem PC 
hinfälllig da ja dann die teiler für die Baudrate wieder nich mehr hin 
hauen.

Autor: metaljack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also,

hab nochma alles durchgetestet.
TimerA läuft auf 400Hz - sonst würd es ja auch mit dem teiler ni 
klappen(16bit und so). fakt is dass er auch bei XT2DRIVE_2 mit der 
TimerA-Initialisierung funktioniert. also eine LED leuchtet 
konstant(400Hz) und die zweite blinkt auf 1Hz. sobald ich mit nem taster 
die TimerB Initialisierung anfahr gehts deutlich langsamer, soll heißen 
selbst die 400Hz sind auf einmal als deutlich blinkende LED zu erkennen.

hab nochma schnell mit der handystoppuhr über 3 mal blinken gemessen.
faktor is ca 18 - also 18mal langsamer mein ich.

würde ja bedeuten dass der source clock auf knapp 1,knips MHz fällt, wo 
der clock allerdings herkommen soll is mir noch nich so richtig klar.
bei den früheren MSP modellen war der interne clock doch immer was bei 
700kHz wenn ich mich recht entsinne.

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.