Forum: Mikrocontroller und Digitale Elektronik MSP430 UART Baudrate einstellen


von Sven (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

@Rufus: Das klappt aber nur bei den MSPs, die den FLL+ Taktgenerator 
eingebaut haben. Die älteren Modelle mit dem DCO haben keine 
Regelschleife.

von Branko Golubovic (Gast)


Lesenswert?

 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

von Branko Golubovic (Gast)


Lesenswert?


von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

Hallo,

danke habs. hab mich da wohl nett verrechnet.

gruß
sven

von Christian R. (supachris)


Lesenswert?

Das Modulationsregister nicht vergessen. 
http://mspgcc.sourceforge.net/baudrate.html

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.