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.
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
@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