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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.