MSP430F1611 UART1 Codeproblem

OP #1371310
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
}
Persönliche Seite #1388395
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
Persönliche Seite #1388465
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

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.