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 }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.