Forum: Mikrocontroller und Digitale Elektronik MSP430F449 UART 9600/19200 Baud 32 KHz


von Uli (Gast)


Lesenswert?

Hallo Gemeinde,

ich habe folgendes Problem mit Uart0 MSP430F449 32.768 Khz Quarz an XT1.
Eigenes Board, 1Startbit, 8 Datenbits 1 Stopbit kein Paritybit.
Hardwarefehler schließe ich nun mal aus (Messungen ergaben keine Fehler 
an und vor dem MAX3221)

Senden und empfangen funktioniert mit 9600 Baud tadellos 100% 
fehlerfrei.
Bei 19200 Baud gibts bei ca 3000 Empfangenen zeichen im Schnitt 1-2 
verschlucktes Zeichen (vermutlich kein RX Interrupt ausgelöst)

hier mein Quellcode:
....
 TACTL = TASSEL0 + TACLR + TAIE;       // ACLK, Clear TAR, Interrupt 
enable


//FLL init
 SCFQCTL   = 0x3C; //ignores M bit 7
 SCFI0     = 0x40;//FLL_D.0
 SCFI1     = 0;
 FLL_CTL0 |= (DCOPLUS + XCAP14PF);       // load caps
 FLL_CTL1  = 0x20;//XT2OFF
....

Uart Initialisierung
// ================================================================
//  Funktionsname: init_UART0()
// ================================================================
void init_UART0(void)
{
  STOP_WATCHDOG                         // Watchdog stoppen
  _BIS_SR(GIE);

  P2DIR  |= 0x10;                       // P2.4 output direction
  P2SEL  |= 0x30;                       // P2.4,5 = USART0 TXD/RXD

  U0CTL  |= SWRST;                      // UART Control Register: Reset 
SWRST = 1 before initialisation Step <1>

  UCTL0  |= CHAR;                       // 8-bit character SWRST <Step 
2>

// Transmit Control Register
  U0TCTL |= SSEL1;                      // Transmitter Control Register: 
UCLK = SMCLK

// Uart Baud register

  UBR00=0xD0;     // 0xA0 = 9600 Baud    0xD0 = 19200 Baud
  UBR10=0x00;     // 0x01 = 9600 Baud    0x00 = 19200 Baud
  UMCTL0=0x08;    // 0x4A = 9600 Baud    0x08= 19200 Baud

//  UBR00=0xA0;     // 0xA0 = 9600 Baud    0xD0 = 19200 Baud
//  UBR10=0x01;     // 0x01 = 9600 Baud    0x00 = 19200 Baud
//  UMCTL0=0x4A;    // 0x4A = 9600 Baud    0x08= 19200 Baud

  ME1    |= (UTXE0 + URXE0);            // Enable USART0 TXD/RXD <Step 
3>
  U0CTL  &= ~SWRST;                     // UART Control Register: Clear 
Bit SWRST=0 <Step 4>
  IE1 |= URXIE0;                        // Enable USART0 RX interrupt 
<Step 5>
} // End init_UART0

auf 
http://www.msp430.info/modules.php?name=Sections&op=viewarticle&artid=2
steht, dass es Probleme beim Empfang geben kann und man das 
Modulationsregister auf Receive speziell anpassen muss um Fehler zu 
vermeiden.
Sind meine Modulationsregister richtig? (Für die Korrektur)

FLL Clock D=2, wurde auf 3.9977 MHz initialisiert.

An was könnte es liegen?

Für alle Kritik / Tipps dankbar!

Grüße Uli

von Christian R. (supachris)


Lesenswert?

Der Baudraten-Rechner sagt 0x84 für die Modulation: 
http://mspgcc.sourceforge.net/baudrate.html Kann eigentlich nur am 
Timing liegen. Stimmen denn die 3,9977MHz? Was sagt das Oszi dazu?

von Uli (Gast)


Lesenswert?

Hallo SupaChris!

vielen Dank für die schnelle Antwort, werde den Wert 0x84 am Montag 
nochmal ausprobieren. Habe den Wert 0x84, nach meiner 1. Fragestellung 
schon probiert, der Uart arbeitete aber gar nicht mehr mit diesem Wert.
Ich muss die Frequenz nochmals messen 3.9977 MHz ob die nicht irgendwie 
abweichen.
Hatte vorgestern 48 us für 1 Bit gemessen rein rechnerisch müssten es 52 
us sein, mit den obigen Einstellungen.
Und werde natürlich mein Datenblatt weiter studieren...

mfG Uli

von Christian R. (supachris)


Lesenswert?

Naja, zuerst musst du sicherstellen, dass die Frequenz des MCLK stimmt, 
und dass die FLL+ so eingestellt ist, dass diese Frequenz ständig 
nachgeregelt wird. Die FLL+ kann das ja. Erst dann kannst du dich weiter 
auf die Suche machen.

von Benjamin S. (recycler)


Lesenswert?

Lass am besten die verschiedenen Freuquenzen wie ACLK und MCLK und SMCLK 
an den entsprechenden Pins ausgeben und miss da mit einem Oszi nach. Das 
hat mir schon öfters geholfen.

von Uli (Gast)


Lesenswert?

Hallo Gemeinde

Es funktioniert mit 8 MHz fDCo. Das ist aber zu hoch für meine 
Betriebsspannung 3.3V

Die Clocks passen alle ! Danke für den Tipp

Habe nun den Takt raufgesetzt auf einen Wert, der mit 3.3 V noch läuft. 
Glücklicherweise bin auch auf einen Beitrag von Joerg H. gestossen, der 
7.14324 MHz verwendet - und dadurch wird das Modulationsregister 0.
Ich glaube dass es sonst immer zu Abweichungen kommen kann u. evtl 
Interruptprobleme je nach Interrupt-/Programmumfang auftreten können.

Hat das mit dem Jitter was zu tun und der worst case Zeitabweichung wie 
sie Lutz Bierl in seinem Buch beschreibt? Empfehlung D hoch setzen DCO 0 
setzen dann sei der Fehler kleiner.


Mit diesem Code funktionierts:
....
  FLL_CTL0 = DCOPLUS + XCAP14PF;            // set load capacitance for 
xtal

  // funktioniert 7.143424 MHz
  //          N = 108, fDCO= 7.143424
  SCFQCTL = (108 & 0x7f);  // Multiplikationsfaktor setzen f_DCO  = 
32.768 kHz* (N+1) * 2^D
  //        D
  //        |
  SCFI0 = ((1 & 3) << 6) | FN_3;
....

void init_UART0(void)
{
  STOP_WATCHDOG                 // Watchdog stoppen
  _BIS_SR(GIE);

  P2DIR  |= 0x10;               // P2.4 output direction
  P2SEL  |= 0x30;               // P2.4,5 = USART0 TXD/RXD

  U0CTL  |= SWRST;              // UART Control Register: Reset SWRST = 
1 before initialisation Step <1>

  UCTL0  |= CHAR;              // 8-bit character SWRST <Step 2>

// Transmit Control Register
  U0TCTL |= SSEL1;             // Transmitter Control Register: UCLK = 
SMCLK

// Uart Baud register
// 7.143424 MHz mit diesem auch Baudrateregister berechnet

  UBR00=0x74;     // 0x74 = 19202 Baud
  UBR10=0x01;     // 0x01 = 19202 Baud

  UMCTL0=0x00;    // 0x00 = 19202 Baud

  ME1    |= (UTXE0 + URXE0);    // Enable USART0 TXD/RXD <Step 3>
  U0CTL  &= ~SWRST;             // UART Control Register: Clear Bit 
SWRST=0 <Step 4>
  IE1 |= URXIE0;                // Enable USART0 RX interrupt <Step 5>
} // End init UART0

Danke und Grüße an alle

Beitrag #6765273 wurde von einem Moderator gelöscht.
Beitrag #6768033 wurde von einem Moderator gelöscht.
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.