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
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
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.
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.
> 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?
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
voidClockInitXT2(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
voidCtrlInitTA(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
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.
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.
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.