Forum: Mikrocontroller und Digitale Elektronik MSP430-UART Flagabfrage


von kim (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sollte in der Tat so funktionieren. Wie hast Du die UART 
initialisiert?


Davon abgesehen:
Welchen Sinn hat der leere Block nach der while-Schleife?

von S. W. (Gast)


Lesenswert?

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

Gib mal bitte die essentiellen Parameter, wie Baudratenregister:
Das kann dabei helfen. Der Fehler ist sicherlich dort zu finden (sag ich 
jetzt mal so)
http://mspgcc.sourceforge.net/baudrate.html

von kim (Gast)


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

von Yagan Ζ. D. (yagan)


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

von kim (Gast)


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

von Yagan Ζ. D. (yagan)


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

von S. W. (Gast)


Lesenswert?

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

Gar nicht mehr, da du ja ein Zeichen ausgeben kannst.

von kim (Gast)


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

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.