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
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?
> 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
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
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
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
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
> 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.
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
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.