Forum: Mikrocontroller und Digitale Elektronik [msp430] 9600 Baud mit 32kHz


von Martin (Gast)


Lesenswert?

Hallo!

Ich habe ein Problem beim Einstellen der Baudrate. Im folgenden
Quelltext, der eigentlich nur einen minimalen Funktionsumfang (eine
Echofunktion) zur Verfügung stellt, sollen Zeichen, die ich über das
Terminal an den MSP schicke wieder zurückgesandt und ausgegeben werden.
Mit 4800 Baud funktioniert das problemlos. Wenn ich die Baudrate nun wie
in diesem Fall versuche auf 9600 zu erhöhen werden nur noch kryptische
Zeichen ausgegeben, also in jedem Fall nicht mehr das Zeichen, was ich
ursprünglich eingegeben habe. Die Frequenz meines Quartzes beträgt 32
kHz.

Beispielprogramm:

#include  <msp430x16x.h>
#include <signal.h>


int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  P3SEL = 0x30;

  ME1 |= UTXE0 + URXE0;
  UCTL0 |= CHAR;
  UTCTL0 |= SSEL0;
  UBR00 = 0x03;                           // 9600 Baud

  UBR10 = 0x00;
  UMCTL0 = 0x4A;
  UCTL0 &= ~SWRST;
  IE1 |= URXIE0;                          // Interrupts an
  IFG1 &= ~UTXIFG0;                       // Interruptflag loeschen
  _EINT();                                // Enable interrupts
}

interrupt(USART0RX_VECTOR) usart0_rx(void)
{
  TXBUF0 = RXBUF0;
}

Weiß jemand woran das liegen könnnte? Ich habe keine wirklich plausible
Erklärung dafür. Die Baudrate im Terminal ist natürlich auch
entsprechend angepasst (->9600).

Gruß,

Martin.

P.S.: Ich verwende das Headerboard von Olimex mit externer
Spannungsversorgung und erforderlicher Peripherie (MAX232).

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hallo

ich kenne den MSP nicht. Aber wenn der keinen eigenen Oszillator für
die UART-Schnittstelle hat, Du also also mit deinem Sytemtakt arbeitest
wird das schon ein Problem. Schon die 4800 Baud aus 32768 Hz zu erzeugen
wird ein Problem: 32768:6 = 5459 baud, 32768:7 =  4679 Baud. letzteres
geht so gerade noch. 4679/4800= rund 2,5% Abweichung. 9600 Baud: (32768
: 3) =10918Baud, (32768:4) = 8189Baud. Fehler zu 1 = 13%, fehler zu 2:
14,6%.  Ohne das jetzt auszurechnen, ab welcher Taktabweichung die
Übertragung fehlschlägt, aber Pi * Daumen würd ich mal sagen bei 10 Bit
pro Zeichen nicht mehr als 10%.

Gerhard

von frank (Gast)


Lesenswert?

Hallo,

Standardmäßig ist der interne Oszillator an. wird der verwendet ist bei
höheren Baudraten die Abweichung zu groß und dazu kommt noch die
Abhängigkeit der Frquenz von der Temperatur.
Lösung : am besten einen externen (höheren) Takt verwenden.

Frank

von Mawe (Gast)


Lesenswert?

Ich habe bereits Kommunikationen mit dem MSP430F149 über den UART zu
einem Funkmodul gemacht und alles hat bestens geklappt. Dabei habe ich
ein Codebeispiel an meine Applikation angepasst. Bin mir nicht ganz
sicher, aber ich meine, der C-Code aus der Fet140_uart04_9600.c aus TIs
Codesammlung sollte passen. Der Code sendet ein empfangenes Byte zwar in
einer ISR wieder zurück aber das kannste ja auf deine Wünsche anpassen.
Ach ja ein ein 100k Widerstand ist bei dem Beispielcode an Rosc nötig,
aber dass ist auch im Code nochmal ersichtlich. Damit hats bei mir
prächtig funktioniert. Also viel Glück und wenns nit klappt meldest
dich nochmal, dann such ich mal mein Programmcode von damals.

von Lanius (Gast)


Angehängte Dateien:

Lesenswert?

UMCTL0= 0x29
könnte helfen.

UMCTL0 ist dafür da um mit kleinen Taktfrequenzen auf höhere Baudraten
zu kommen. Gibt irgendwo bei TI auch eine App-Note dazu.



Die Bitfehler kannst du dir hier ausrechnen lassen:

http://mspgcc.sourceforge.net/baudrate.html

hab die App mal angehängt da ich sie bei TI nicht mehr finden konnte

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.