Hallo, ich bin gerade dabei ein Programm zur Kommunikation zwischen meinem MSP und dem PC über die serielle Schnittstelle zu schreiben. Es soll so aussehen, dass ich am PC Tasten drücke (Hyperterminal), diese Tastendrücke werden dann aufsummiert und auf einem LCD ausgegeben. andersherum möchte ich durch einen Tastendruck eine 1 anden PC senden. Das ist keine gescheite Anwendung, aber ich möchte auch erst einmal nur die Kommunikation an sich hinbekommen. Ich sehe jetzt aber vor einem Problem. Das ganze funktioniert irgendwie nicht. Wenn ich das Programm starte und am PC Tasten drücke wird das auch an dem Display am MSP angezeigt. Drücke ich nun den Taster am MSP wird nix gesendet. Anschließend wird auch nix mehr vom PC empfangen. Wie es scheint bleibt der dann in der Datei uart bei "while (!(IFG1 & UTXIFG0)); " hängen. Den kompletten Code habe ich ja im Anhang. Ich komme da nicht weiter. Wäre klasse, wenn sich mal jemand den Code ansehen könnte. Bin für jeden Tip offen. Grüße Euer Franky
hallo, ich bin ein wenig weiter. problme macht irgendwie das senden. das empfangen ist kein problem, das läuft einwandfrai, solange nichts gesendet wird. also nach dem ersten tastendruck und somit dem ersten versuch etwas zu senden hängst sich das ganze irgendwie auf. Ich habe hier jetzt mal meine interrupt-routine für den empfang: #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { if(StringReady == 0) { if(RXBUF0) { zaehl++; StringReady = 1; // Wenn auf '1', darf der String ausgelesen // werden _BIC_SR_IRQ(LPM0_bits); // Exit LPM0 } } }/* __interrupt void usart0_rx (void) */ Hier einmal meine Funktion zum senden: void SendUSART0(unsigned char* str) // Einen String über die serielle { // Schnittstelle (USART0) senden while (*str != 0) { while (!(IFG1 & UTXIFG0)); // Warten, bis USART0 TX-Buffer sendebereit TXBUF0 = *str++; } while (!(IFG1 & UTXIFG0)); // Warten, bis USART0 TX-Buffer sendebereit TXBUF0= 0x0D; // "ENTER" senden als Abschluss } und hier meine initialisierung des uart: void InitUART(void) { P3DIR = 0x1F; P3SEL = 0x30; // P3.4 und P3.5 als USART0 TXD/RXD ME1 |= UTXE0 + URXE0; // TX- und RX-Modul erst mal anschalten UCTL0 |= CHAR; // 8 Data Bits, 1 Stop Bit, no parity (8N1) UTCTL0 |= SSEL0; // ACLK als UCLK festlegen UBR00 = 0x03; // 9600 Baud aus 32.768 kHz erzeugen UBR10 = 0x00; // Siehe Application Note Tabelle 2, Seite 10 UMCTL0 = 0x4A; // Korrektur der Division UCTL0 &= ~SWRST; // USART freigeben IE1 |= URXIE0 + UTXIE0; // TX- und RX-interrupts anschalten IFG1 &= ~UTXIFG0; // Initales Interrupt-Flag löschen //_BIS_SR(GIE); _BIS_SR(LPM0_bits + GIE); // Ab in den LPM0 mit Interrupts ... } wie gesagt, der empfang funtioniert einwandfrei, bis etwaas gesendet werden soll. dabei hängt sich das ganze auf. Wäre klasse, wenn mir da jemand weiterhelfen könnte. das ist zum verzweifeln. würde mich nciht wundern, wenn das mal wieder nur an einer klitze kleinigkeit hängt. gruß euer franky
nachtrag: mit while (!(IFG1 & UTXIFG0)); warte ich ja daraus, dass ich etwas senden kann, der das buffer sendebereit ist. da bleibt der immer hängen, egal ob vorher schon irgendwann einmal etwas empfangen oder gesendet wurde.
Hmmm, hast Du überhaupt die TX-ISR definiert?: #pragma vector=UART0TX_VECTOR __interrupt void usart0_Tx (void) ... Wenn Du die nicht hast, findet der MSP bei dem Interrupt keine gültige Adresse und landet im Nirvana. Ich denke mal, Du brauchst den Interrupt nicht: (IE1 |= URXIE0 + UTXIE0; in IE1 |= URXIE0; ändern) da Du das Flag pollst. Kannst das Flag UTXIFG0 trotzdem pollen, das wird unabhängig von der Interrupt-Freigabe gesetzt.
Nachtrag: Falls Du den Interrupt doch brauchst, ich habe mal ein TI-Bsp. angehängt, wo man das ganz gut sieht, wie man vorgehen muss.
Wenn´s der fehlende TX-Interrupt-Handler wäre, müsste das Zeichen am PC ankommen. Sonst wüsst ich aber auch nix. Vermutest du den Absturz an der Stelle, oder bleibt der Debugger da hängen? Wenn du einen falschen Int-Vektor hast, müsstest du im Debugger dann sehen, dass er an eine seltsame Stelle im Flash springt und dort kein Disassembly zu finden ist.
hallo, ich habe folgendes gemacht: IE1 |= URXIE0 + UTXIE0; in IE1 |= URXIE0; Weiter nix, dann lief es schon. denke, dass der debugger an der stelle stehen blieb, da die bedingung halt immer erfüllt war. vielen dank. grüße franky
Nee, eher weil der Prozessor an den nicht vorhandenen Interrupt-Vektor gesprungen ist...
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.