mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 UART Baudrate einstellen


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

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

Autor: Branko Golubovic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 Also hier ist ein kleines Beispiel wo ein 8Mhz Quarz in Einsatz kommt 
und  auch UART0 auf 9600 8N1 eingestellt ist.
//************************************************************************
//  MSP-FET430P140 Demo - USART0 UART 9600 Echo ISR, HF XTAL ACLK 
//
//  Description; Echo a received character, RX ISR used. Normal mode is LPM0, 
//  USART0 RX interrupt triggers TX Echo. Though not required, MCLK = LFXT1  
//  ACLK = MCLK = UCLK0 = LFXT1 = 3.58MHz
//  Baud rate divider with 8Mhz XTAL @9600 = 3.58MHz/9600 = 831 (033Fh)
//  //*An external 3.58Mhz XTAL on XIN XOUT is required for ACLK*//    
//
//                MSP430F149   
//             -----------------
//         /|\|             X2IN|-  
//          | |                 | 8MHz 
//          --|RST         X2OUT|-
//            |                 |
//            |             P3.4|------------> 
//            |                 | 9600 - 8N1
//            |             P3.5|<------------
//
//       
//  M. Buccini
//  Texas Instruments, Inc
//  February 2002
//  Adapted for mspgcc by Steve Underwood <steveu@coppice.org>
//***********************************************************************

#include  <signal.h>
#include  <io.h>

int main(void)
{
  unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  P1DIR |= 0x01;                        // Set P1.0 to output direction
  P1OUT |= 0x01;                        // Set P1.0
  BCSCTL1 &= ~XT2OFF;                   // XT2on

  do 
  {
    IFG1 &= ~OFIFG;                       // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG) != 0);          // OSCFault flag still set?                

  BCSCTL2 |= SELM1+SELS;                // MCLK = SMCLK = XT2
  UCTL0 = CHAR;                         // 8-bit character
  UTCTL0 = SSEL1;                       // UCLK = SMCLK
  UBR00 = 0x3F;                         // 8Mhz/9600 - 831
  UBR10 = 0x03;                         //
  UMCTL0 = 0x00;                        // no modulation
  ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
  IE1 |= URXIE0;                        // Enable USART0 RX interrupt
  P3SEL |= 0x30;                        // P3.4,5 = USART0 TXD/RXD
  P3DIR |= 0x10;                        // P3.4 output direction
  P1OUT &=~0x01;                         // P1.0 Reset
  _EINT();                              // Enable interrupts
  
  for (;;)                             
  {
    unsigned long int i;

    P1OUT ^= 0x01;                      // Toggle P1.0 using exclusive-OR

    i = 1000000;                          // Delay
    do (i--);
    while (i != 0);                             // Required only for C-spy
  }
  return 0;
}

interrupt (UART0RX_VECTOR) usart0_rx(void)
{
  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
  TXBUF0 = RXBUF0;                      // RXBUF0 to TXBUF0
}
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

Autor: Branko Golubovic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven

Anbei eine gute Deutschsprachige Dokumentation über MSP430F149:
http://www.inf.fu-berlin.de/inst/ag-tech/teaching/...

Branko

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke habs. hab mich da wohl nett verrechnet.

gruß
sven

Autor: Christian R. (supachris)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.