Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 UART1 Codeproblem


von Selina H. (selina)


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
}

von Peter D. (pdiener) Benutzerseite


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

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.