Hallo erstmal, habe folgendes Problem, will eigentlich nur die verschiedenen Clocks ausgeben (SMCLK und ACLK) klappt aber absolut nicht. Auf dem Oszi bekomm ich nur Frequenzen, die überhaupt nicht passen. ich poste mal den Code, wär cool wenn mal einer drüberschauen könnte. #include <msp430x21x2.h> void main (void) { WDTCTL = WDTPW+WDTHOLD; //stop WD DCOCTL = CALDCO_16MHZ; //DCO to 16 MHz BCSCTL1 =XT2OFF+DIVA_0; //set LFXT1 --> low frequency mode, DIVA=1 BCSCTL2= SELM_1+DIVM_0+DIVS_0; //MCLK = DCOCLK, DMCLK = DCOCLK BCSCTL3=LFXT1S_0; //32kHz Crystal P2SEL=BIT0+BIT1; //P2.0 6 2.1 primary peripheral module function P2DIR= 0xBF; //P2.6 as Input; while (1) { } } Greetings P
Welcher Takt soll denn überhaupt aus welcher Quelle gespeist werden? Hast du einen Quarz angeschlossen? Oder soll alles aus dem DCO kommen? Um welchen MSP430 handelt es sich genau? Hast du mal eines der Code-Beispiele von TI probiert? Da gibts doch immer eins, was die Takte ausgibt...
Die CPU soll mit 16MHz laufen, ansonsten TimerA3 mit 32KHz über einen Quarz. Ich benutze den Msp430f2132 Die Codebeispiele hab ich mir schon angeschaut, werd aber nicht schlau draus. Versuche deshalb jetzt erstmal die Takte an den dafür vorgesehenen Pins auszugeben und darzustellen. mfg P
Hm, das C-Demo ist doch exakt das, was du brauchst, musst nur den DCO von 8MHz auf 16MHz ändern:
1 | #include "msp430x21x2.h" |
2 | |
3 | void main(void) |
4 | {
|
5 | WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog Timer |
6 | if (CALBC1_16MHZ ==0xFF || CALDCO_16MHZ == 0xFF) |
7 | {
|
8 | while(1); // If calibration constants erased |
9 | // do not load, trap CPU!!
|
10 | }
|
11 | BCSCTL1 = CALBC1_16MHZ; // Set DCO to 16MHz |
12 | DCOCTL = CALDCO_16MHZ; |
13 | P2DIR |= 0x07; // P2.0,1,2 output direction |
14 | P2SEL |= 0x03; // P2.0 = ACLK, P2.1 = SMCLK |
15 | |
16 | while (1) |
17 | {
|
18 | }
|
19 | }
|
Was gibts daran nicht zu verstehen? Da ist doch jede Zeile kommentiert. Grundsätzlich sollte man immer erst mal in den C-Demos schauen, was da drin steht, das ist so super kommentiert und funktioniert auf jeden Fall. Wenn man das schon nicht versteht, kommt man sonst auch nicht weiter. Zu finden sind die Demo-Programme hier: http://focus.ti.com/lit/sw/slac163b/slac163b.zip
Danke auch, wenn ich einen dementsprechenden Kommentar gewollt hätte, hätte ichs gleich gesagt! Nur zur Info, exakt dieses Beispiel habe ich ausprobiert und bekomme aber am P2.0 leider keine 32KHz.
Dein Fehler:
1 | P2SEL=BIT0+BIT1; |
Die Aufgabe: Nachgucken, wo Dein 32kHz Quarz hängt und überlegen, warum er so (s.oben) nicht funktionieren kann!
Wenn du den Code exakt so hattest, dann ist dein Quarz nicht richtig angeschlossen oder kaputt oder mit dem oszi stimmt was nicht. Nach dem Reset des MSP430 läuft der SMCLK schon vom DCO mit etwa 1,1MHz, der ACLK kommt automatisch vom X1 im LF-Modus mit 6pF Last. Das ist ideal für Uhrenquarze. Es muss also kein Register gesetzt werden. Willst du DCO auf 16MHz haben, dann musst die wie im Code die Kalibrier-Werte laden. Mehr nicht. Ist tausendfach erprobt. Aus dem User Guide: After a PUC, MCLK and SMCLK are sourced from DCOCLK at ~1.1 MHz (see the device-specific data sheet for parameters) and ACLK is sourced from LFXT1CLK in LF mode with an internal load capacitance of 6pF.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.