MSP430-UART Flagabfrage

Gast #539396
Lesenswert?

Hi,

ich benutze den MSP430F1612 und möchte gern 3 Byte über den UART 
ausgeben.
Da darauf zu achten ist, dass der TXBuffer erst leer seien muss um ein 
neues Byte reinzuschreiben, erfolgt eine Abfrage auf zustand des Buffer. 
Also eine Flagabfrage des UTXIFG0:


for(BYTE p=0;p<=2;p++)
 {
   while (!(IFG1 & UTXIFG0));
         {
          };
   //     LCD_Cursor_Set(3,7);
   //     LCD_Awrite("Sende");

          TXBUF0 = send[p];

   //     send_lock =1;
          }

Bei Ausführung des Programms bleib es nun immer in der while schleife 
hängen.

Hat jemand eine Idee woran das liegen könnte?? Dachte der UART setzt das 
Flag von selbst, wenn das Byte rausgegangen ist??

bin echt ratlos



LG kim
Gast #539428
Lesenswert?

hi, wow ihr seid echt schnell!!

also meine Init sieht so aus, habe 8MHzquart dranhängen.
Die Frage nach der Schleife ist mehr als berechtigt, die hat keinen 
Sinn.

ME1 |= UTXE0 + URXE0;           // TX- und RX-modul erst mal anschalten
BCSCTL1 |= 0x10;                //teilt 8Mhz  /  2  = 4Mhz
UBR00 = 0x10;                   //  31.25kbaud (32µs time slices)
UBR10 = 0x00;
UTCTL0 |= SSEL1;                // use SMCLK
UMCTL0 = 0x4A;
UCTL0 &= ~SWRST;                      // USART freigeben

Ich möchte MIDIDaten generieren, brauche also eine Baudrate von 
31.25kHz.

Danke!! kim
#539444
Lesenswert?

kim,

nach Angabe im User Manual ist wohl die Reihenfolge der Initialisierung 
essentiell:

    UCTL0 |= SWRST;             // Reset UART
    ...                         // Init Clock, Baudrate, Datenformat
    ME1 |= UTXE0+URXE0;         // Enable USART0 TXD/RXD
    UCTL0 &= ~SWRST;            // Initalize USART state machine

So funktioniert es bei mir. Und vergiss nicht die Port-Pins für die UART 
freizugeben:

    P3SEL |= PUART0;    // P3.4,5 = USART0 TXD/RXD

Ciao, Yagan
Gast #539446
Lesenswert?

Danke Yagan,

auf die Reihenfolge habe ich schon geachtet. Der UART arbeitet schon, 
ohne das -->while (!(IFG1 & UTXIFG0));<-- wird das letzte Byte der 3 
gewünschten ausgegeben.
Meine INIT:

void uart0_init()
{
  P3DIR &= ~BIT5;       // set P3.5/URXD0 to input
  P3DIR |=  BIT4;       // set P3.4/UTXD0 to output
  P3SEL |=  BIT5|BIT4;  // set P3.5/URXD0 and P3.4/UTXD0 to peripheral
  U0CTL |= SWRST;       // enable software reset
  ME1 |= UTXE0 + URXE0; // switch UART on
  UCTL0 |= CHAR;        // 8N1
  BCSCTL1 |= 0x10;      //teilt 8Mhz  /  2  = 4Mhz
  UBR00 = 0x10;         //  31.25kbaud (32µs time slices)
  UBR10 = 0x00;
  UTCTL0 |= SSEL1;      // use SMCLK
  UCTL0 &= ~SWRST;      // disable software reset
}

ich versuche es erstmal ohne Interrupt, das die Bufferabfrage dort ja 
auch erfolgen muss..

In wieweit könnte es an der Baudrate liegen?? die legt doch nur die 
Länge das Signals fest?!?

kim
#539468
Lesenswert?

kim,

mit der Baudrate kann es nicht zusammenhängen.
Wenn ein Byte ausgegeben wird, funktioniert auch die Taktversorgung.

Verschiebe doch mal die ME1-Zeile entsprechend der Empfehlung im User 
Manual:

void uart0_init()
{
  P3DIR &= ~BIT5;       // set P3.5/URXD0 to input
  P3DIR |=  BIT4;       // set P3.4/UTXD0 to output
  P3SEL |=  BIT5|BIT4;  // set P3.5/URXD0 and P3.4/UTXD0 to peripheral
  U0CTL |= SWRST;       // enable software reset
  // ME1 |= UTXE0 + URXE0; // switch UART on
  UCTL0 |= CHAR;        // 8N1
  BCSCTL1 |= 0x10;      //teilt 8Mhz  /  2  = 4Mhz
  UBR00 = 0x10;         //  31.25kbaud (32µs time slices)
  UBR10 = 0x00;
  UTCTL0 |= SSEL1;      // use SMCLK

  ME1 |= UTXE0 + URXE0; // switch UART on

  UCTL0 &= ~SWRST;      // disable software reset
}

Sonst wüsste ich keinen anderen Rat.

Ciao, Yagan
Gast #539908
Lesenswert?

Hi nochmal,

also mein Problem liegt eindeutig beim UTXIFG0. Dieses wird nicht 
automatisch zurückgesetzt wenn ein zeichen gesendet wurde!!

Woran könnte das liegen?? Meine INIT scheint mir richtig..

CIAO, kim

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