[msp430] 9600 Baud mit 32kHz

Gast #212769
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).
Gast #212770
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
Gast #212771
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
Gast #212772
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren