mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430-UART Flagabfrage


Autor: kim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Steven Wetzel (steven)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Yagan Ζ. Dongobar (yagan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Yagan Ζ. Dongobar (yagan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steven Wetzel (steven)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.