Forum: Mikrocontroller und Digitale Elektronik msp430f5438 und quarz


von mui (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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:

1
// 8 MHz-Quarz an XT1 (im HF-Modus)
2
3
// Portpins für XT1 "freischaufeln"
4
P7SEL |= 0x03;                  // XT1 an P7.0 und P7.1
5
6
/ XT2 wird nicht genutzt, XT1 im HF-Modus
7
UCSCTL6 = XT2OFF | XTS;
8
9
// warten, bis XT1 stabilisiert
10
do
11
{
12
  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
13
                                // Fehlerflags für XT2,XT1,DCO löschen
14
  SFRIFG1 &= ~OFIFG;            // Oszillatorfehlerflag löschen
15
}
16
while (SFRIFG1 & OFIFG);        // Oszillatorfehlerflag testen
17
  
18
19
// Taktquellen und Teiler für ACLK, SMCLK und MCLK wählen
20
UCSCTL4 = 0;
21
22
// SELA = 0   ACLK = XT1CLK
23
// SELS = 0   SMCLK = XT1CLK
24
// SELM = 0   MCLK = XT1CLK
25
26
UCSCTL5 = DIVS_3;
27
28
// DIVPA = 0
29
// DIVA = 0    ACLK /1
30
// DIVS = 3    SMCLK /8
31
// DIVM = 0    MCLK /1


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

von mui (Gast)


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

von mui (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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.
1
XT1DRIVE Bits 7-6
2
3
The XT1 oscillator current can be adjusted to its drive needs. 
4
Initially, it starts with the highest supply current for reliable 
5
and quick startup. If needed, user software can reduce the drive 
6
strength.
7
8
9
00   Lowest current consumption for XT1 LF mode. XT1 oscillator 
10
     operating range in HF mode is 4 MHz to 8 MHz.
11
12
01   Increased drive strength for XT1 LF mode. XT1 oscillator 
13
     operating range in HF mode is 8 MHz to 16 MHz.
14
15
10   Increased drive capability for XT1 LF mode. XT1 oscillator 
16
     operating range in HF mode is 16 MHz to 24 MHz.
17
18
11   Maximum drive capability and maximum current consumption 
19
     for XT1 LF mode. XT1 oscillator operating range in HF mode 
20
     is 24 MHz to 32 MHz.

Ändere also die Zeile
1
UCSCTL6 = XT2OFF | XTS;

zu
1
UCSCTL6 = XT2OFF | XTS | XT1DRIVE_1;

und Dein Quarz sollte auch mit 12 MHz funktionieren.

von metaljack (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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?

von metaljack (Gast)


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
1
void ClockInitXT2(void)
2
{
3
  P5SEL |= 0x0C;                            // Port select XT2
4
5
  UCSCTL6 &= ~XT2OFF;                       // Enable XT2
6
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO
7
                                            // Since LFXT1 is not used,
8
                                            // sourcing FLL with LFXT1 can cause
9
                                            // XT1OFFG flag to set
10
  UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO
11
  UCSCTL6 |= XT2DRIVE_2;
12
  // Loop until XT1,XT2 & DCO stabilizes
13
  do
14
  {
15
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
16
                                            // Clear XT2,XT1,DCO fault flags
17
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
18
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
19
20
  UCSCTL5=0;  //all divider =1
21
  UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
22
  UCSCTL6 |= XT2DRIVE_3;                                // expected frequency
23
  UCSCTL4 = SELS_5 + SELM_5 + SELA_0;               // SMCLK=MCLK=XT2
24
}

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

und hier schmeist es mir dann die clocks durcheinander
1
TBCTL = TBSSEL_2 + MC_1 + TBCLR + ID_0+CNTL__16;         // SMCLK, upmode, clear TBR
2
  TBCCTL0 = CCIE;                          // CCR0 interrupt enabled
3
  TBCCR0 = 556;
4
 // TBCCR2 =25;

von Rufus Τ. F. (rufus) Benutzerseite


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.

von metaljack (Gast)


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.

von metaljack (Gast)


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.

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.