www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 UART1 Codeproblem


Autor: Selina Hhh (selina)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Der untenstehende Code soll dafür sorgen, dass der Mikroprozessor 
Zeichen vom Hyper Terminal via UART1 empfängt und sogleich wieder ans 
Terminal zurückschickt.
Ich kann zwar via printf etwas ans Terminal schicken. Wenn ich aber eine 
Taste drücke, dann springt das Programm bis zur Stelle nach der 
While-Schleife im Main. Dies bedeutet ja eigentlich, dass der 
Empfangsbuffer geladen ist, was eigentlich den Interrupt auslösen 
sollte.
Dies passiert aber nicht. Ich habe jetzt schon einige Sachen versucht, 
leider hats bis jetzt nichts genützt. Vielleicht kann jmd von euch 
helfen.
Thx

int main(void)
{
  P4DIR = 0xFF;             //Port 4 = Output LED
  Init_System();            //Stop Watchdog
  printf_Auswahl(UART);
  //---------------------------------------------------------------------- 
------
  //Initialisierung UART
  //---------------------------------------------------------------------- 
------
  P3SEL |= BIT6;            //P3.6 = UTXD1
  P3SEL |= BIT7;            //P3.7 = URXD1
  P3DIR |= BIT6;            //UTXD1 = Output
  UCTL1 = SWRST;            //Initialize USART state machine
  U1ME  = UTXE1;            //Enable USART1 TXD
  U1ME |= URXE1;            //Enable USART1 RXD
  UCTL1 |= CHAR;            //8-bit character
  UTCTL1 = SSEL_2;          //UCLK = SMCLK (=700kHz)

  UBR01=0x4E; UBR11=0x00;   /* uart0 700000Hz 9602bps
                            (http://mspgcc.sourceforge.net/baudrate.html*/
  UMCTL1 = 0x08;            //Baudrate modulation

  IE2 = URXIE1;             //Enable USART1 receive interrupt
  _EINT();                  //Enable all interrupts
  UCTL1 &= ~SWRST;          //Initialize USART state machine

  P4OUT = 0x00;             //LED's = low

  while (1)
  {
    while(!(U1IFG&URXIFG1)) _NOP(); //USART1 RX buffer ready?
    P4OUT ^= 0x01;                  //LED0 = high
    _NOP();

  }
  return 0;
}

interrupt (UART1RX_VECTOR) USART1_RX(void)  //RX interrupt
{
    P4OUT = 0x02;                           //LED1 = high
    while (!(U1IFG & UTXIFG1)) _NOP();      //USART1 TX buffer ready?
    U1TXBUF = U1RXBUF;                      //RXBUF1 to TXBUF1
}

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde im Assembler Listing oder mit einem Debugger genau nachprüfen, 
ob das Interrupt enable Bit wirklich gesetzt worden ist.
Vielleicht ist aus irgendeinem Grund ein falsches Headerfile eingebunden 
und es werden die falschen Adressen verwendet.

Welcher Compiler ist das?
Die Registernamen entsprechen nicht denen aus dem Userguide.

Wenn das GIE Bit gesetzt ist, das interrupt enable Bit von Uart1 auch 
und ein RXIFG ansteht, wird der Interrupt angesprungen.

RXIFG steht offenbar an, also ist nur noch zu prüfen, ob GIE und URXIE1 
wirklich gesetzt sind.

Unabhängig davon manipuliert

P4OUT = 0x02;                           //LED1 = high

alle Bits von Port 4. Das ist eventuell unerwünscht.


Grüße,

Peter

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

Bewertung
0 lesenswert
nicht lesenswert
Das hier

> while (1)
>  {
>    while(!(U1IFG&URXIFG1)) _NOP(); //USART1 RX buffer ready?
>    P4OUT ^= 0x01;                  //LED0 = high
>    _NOP();
>  }

sollte aus der while-Schleife im main verschwinden. Das RX-ready-Flag 
sollte nicht gepollt werden, wenn gleichzeitig ein Interrupthandler für 
RX eingerichtet wird.

Das Toggeln von P4.0 kann auch im Interrupthandler erfolgen.

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.