Hallo zusammen, ich beschäftige mich gerade mit dem MSP430f149 und möchte eine Kommunikation zwischen Controller und PC herstellen. Erst einmal um das ganze mal zu testen, bin m Bereich Controller noch Anfänger. Ich habe noch kleine Probleme mit der Konfiguration des USAT im UART Mode noch nicht so ganz zurecht, genauer mit der Einstellung der Baudrate. Das läuft ja über die beiden Register UxBR0 und UxBR1. Ich habe nun einen Quarz mit 32.768kHz. Ich steige da jetzt noch nicht durch, was ich für die beiden Register angeben muss, um bestimmte Baudraten einzustellen, z.B. 9200 oder 115200. Wäre klasse, wenn mir das jemand einmal erklären könnte. Vielen Dank. Gruß Sven
Hmm. Ich mache das so: ME1 |= UTXE0 + URXE0; (damit definiere ich, daß sowohl TxD als auch RxD genutzt werden sollen) UCTL0 |= CHAR; (8-Bit Daten) UTCTL0 |= SSEL1; (SSELx = 2, also wird SMCLK für die Baudratenerzeugung verwendet) UBR00 = 0xD0; UBR10 = 0x00; Ja, und das ist der Kern der Sache. In meinem Beispiel ist SMCLK 2 MHz, und die Baudrate ist SMCLK / UBR. UBR ist der 16-Bit-Wert 0x00D0, dezimal 208. 2 MHz / 208 ist 9615, und das liegt weniger als 1 % neben dem von mir gewünschten Wert von 9600 und ist daher akzeptabel genau. "Mein" SMCLK von 2 MHz erzeuge ich mit dem DCO, der wiederum mit einem 32.768 kHz-Quarz stabilisiert wird. Mit welchem tatsächlichen Takt betreibst Du Deinen '430?
Den Baudraten-generator gibts hier: http://mspgcc.sourceforge.net/baudrate.html Allerdings musst du wie gesagt wissen,. mit welcher Frequenz der SMCLK läuft. Wenn du den ACLK (32khz) benutzt, kannst du gerade mal 9600 Baud machen. Übrigens wird der DCO nur erstmalig über den Quarz eingestellt, der läuft ja mit einem RC-Oszillator. In diesem beispiel von TI, indem der Timer A benutzt wird, erfolgt nur eine Einstellung auf den nächstmöglichen Wert als ganzzahliges Vielfaches des 32Khz Quarzes. Nach der Einstellung ist der DCO einem schrecklichem Temperatur-Drift unterworfen. Und dummerweise ist der auf jedem MSP auch noch anders, hatte hier ein Sensornetzwerk, das als Taktquelle für die AD-Wandlung den DCO Takt benutzt hat, am Sampling-Start gings noch, nach 2000 Samples (1KS/s) war der Sampling-Takt schon zig Samples verlaufen....also unbrauchbar, für alles was relativ genau sein muss.
Das TI-Beispiel verwendet zwar nur ein ganzzahliges Vielfaches des 32.768 kHz-Taktes für den DCO, regelt den aber im laufenden Betrieb nach. Damit läuft der DCO stabil. In "meinem" Falle mit einer Frequenz von 1.998848 MHz, was für mich ausreichend genau an 2 MHz liegt. Das ist eine Abweichung von etwa 58 ppm.
Hallo, vielen Dank erst einmal. Meinst du das hier : UTCTL0 |= SSEL0; ? das dürfte dann der ACLK sein mit 32.768kHz. In der ApplicationNOte slaa049 ist auf Seite 10 eine Tabelle 2, in der einige Einstellungen der Baudrate angegeben sind, z.B. für 32.768kHz Quarz UBR00 = 0x03; // 9600 baud aus 32.768 kHz erzeugen UBR10 = 0x00; // siehe Application Note Tabelle 2, Seite 10 UMCTL0 = 0x4A; // Korrektur der Division Die 03 kommen ja von 32768/9600. Da da ja 3.4 ist, wird dann mit UMCTL0 noch ein Korrekturfaktor eingefügt. Allerdings kann manmit dem ACLK nur Baudraten bis 9600 erzeugen, wenn ich das richtig verstehe. Welche Baudrate kann der MSP denn überhaupt maximal? Und wie bekomme ich denn sowas hin: "Mein" SMCLK von 2 MHz erzeuge ich mit dem DCO, der wiederum mit einem 32.768 kHz-Quarz stabilisiert wird.
@Rufus: Das klappt aber nur bei den MSPs, die den FLL+ Taktgenerator eingebaut haben. Die älteren Modelle mit dem DCO haben keine Regelschleife.
Also hier ist ein kleines Beispiel wo ein 8Mhz Quarz in Einsatz kommt und auch UART0 auf 9600 8N1 eingestellt ist.
1 | //************************************************************************
|
2 | // MSP-FET430P140 Demo - USART0 UART 9600 Echo ISR, HF XTAL ACLK
|
3 | //
|
4 | // Description; Echo a received character, RX ISR used. Normal mode is LPM0,
|
5 | // USART0 RX interrupt triggers TX Echo. Though not required, MCLK = LFXT1
|
6 | // ACLK = MCLK = UCLK0 = LFXT1 = 3.58MHz
|
7 | // Baud rate divider with 8Mhz XTAL @9600 = 3.58MHz/9600 = 831 (033Fh)
|
8 | // //*An external 3.58Mhz XTAL on XIN XOUT is required for ACLK*//
|
9 | //
|
10 | // MSP430F149
|
11 | // -----------------
|
12 | // /|\| X2IN|-
|
13 | // | | | 8MHz
|
14 | // --|RST X2OUT|-
|
15 | // | |
|
16 | // | P3.4|------------>
|
17 | // | | 9600 - 8N1
|
18 | // | P3.5|<------------
|
19 | //
|
20 | //
|
21 | // M. Buccini
|
22 | // Texas Instruments, Inc
|
23 | // February 2002
|
24 | // Adapted for mspgcc by Steve Underwood <steveu@coppice.org>
|
25 | //***********************************************************************
|
26 | |
27 | #include <signal.h> |
28 | #include <io.h> |
29 | |
30 | int main(void) |
31 | {
|
32 | unsigned int i; |
33 | |
34 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT |
35 | P1DIR |= 0x01; // Set P1.0 to output direction |
36 | P1OUT |= 0x01; // Set P1.0 |
37 | BCSCTL1 &= ~XT2OFF; // XT2on |
38 | |
39 | do
|
40 | {
|
41 | IFG1 &= ~OFIFG; // Clear OSCFault flag |
42 | for (i = 0xFF; i > 0; i--); // Time for flag to set |
43 | }
|
44 | while ((IFG1 & OFIFG) != 0); // OSCFault flag still set? |
45 | |
46 | BCSCTL2 |= SELM1+SELS; // MCLK = SMCLK = XT2 |
47 | UCTL0 = CHAR; // 8-bit character |
48 | UTCTL0 = SSEL1; // UCLK = SMCLK |
49 | UBR00 = 0x3F; // 8Mhz/9600 - 831 |
50 | UBR10 = 0x03; // |
51 | UMCTL0 = 0x00; // no modulation |
52 | ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD |
53 | IE1 |= URXIE0; // Enable USART0 RX interrupt |
54 | P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD |
55 | P3DIR |= 0x10; // P3.4 output direction |
56 | P1OUT &=~0x01; // P1.0 Reset |
57 | _EINT(); // Enable interrupts |
58 | |
59 | for (;;) |
60 | {
|
61 | unsigned long int i; |
62 | |
63 | P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR |
64 | |
65 | i = 1000000; // Delay |
66 | do (i--); |
67 | while (i != 0); // Required only for C-spy |
68 | }
|
69 | return 0; |
70 | }
|
71 | |
72 | interrupt (UART0RX_VECTOR) usart0_rx(void) |
73 | {
|
74 | while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready? |
75 | TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 |
76 | }
|
Aber wenn du tatsächlich etwas über MSP430 lernen willst, musst du dich mit Datenblätter und Applikations-Note von TI auseinandersetzen. Außerdem sind so viele beispiele in MSPGCC Paket unter dem Verzeichnis Examples. Verwendest du MSPGCC? Gruß Branko
@Sven Anbei eine gute Deutschsprachige Dokumentation über MSP430F149: http://www.inf.fu-berlin.de/inst/ag-tech/teaching/WS0506/19606-P/Aufgaben/Dokumentation_MSP430F149.pdf Branko
@Christian: Die Regelschleife kann man auch "von Hand" selber machen, das funktioniert dann auch mit FLL-losen '430ern. Dazu gibt es ein paar Beispiele von TI höchstselbst unter http://www-s.ti.com/sc/techzip/slac015.zip fet140_uart03_19200.c beispielsweise betreibt die UART mit 19200 Baud und erzeugt den Systemtakt mit dem DCO, der ständig im Timerinterrupt nachjustiert wird. Dazu wird LFXT1CLK mit 32.768 kHz gespeist, das durch einen Prescaler geschickt um ein ACLK von 4.096 kHz zu erzeugen. Der Timer wird mit fDCO gespeist und mit ACLK der Capture-Mode bedient, so daß die Periodendauer von ACLK in DCO-Takten gemessen werden kann. Weicht diese von der Vorgabe ab, wird nachjustiert.
Jo, so in der Art hab ich das auch gebaut, ich hab den DCO zyklisch nachgestellt. Aber innerhalb eines Messzyklus (8 Sek Länge, 1KS/s) ist der dann schon wieder weggelaufen. Und zwischendurch nachstellen ging nich, sollte ja äquidistant abgetastet werden. In der neuen Version hab ich jetzt einen Quarz, der zum Sampling angeschaltet wird, an X2. Geht wesentlich genauer.
hallo, ich verwende den iar workbench. die application notes und auch die beispiele habe ich mir schon teilweise angesehen. die beispiele von ti basieren fast alle auf einem 8mhz quarz. den habe ich noch nicht dran. ich glaube ich werde mein board erst einmal damit ergänzen.
Bei den von mir verlinkten Beispielen von TI basieren ziemlich viele nicht auf einem 8-Mhz-Quarz. In angehängter Datei (entHTMLisierte Variante aus TI-Beispielcode) sind ziemlich viele Beispiele zu finden, die mit "32kHz ACLK" auskommen.
Hallo, ich habe meinem msp nun einen 8Mhz Quarz verpasst. Funktioniert nun auch mit 115200 Baud recht gut. Ich wollte nun mal auf eine andere Baudrate einstellen 57600. Leider funktioniert da nun was nicht. Nun wollte ich erst einmal fragen, ob ich bei der Einstellung der Baudrate alles richtig gemacht habe. Das sieht für 57600 so aus UBR00= 0x86; URB10= 0x00; Ist das richtig oder habe ich mich da verhauen? Gruß Sven
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.