Hallo, ich habe da ein Problem mit meiner Uart an einem MSP430: Sie ist verbunden mit einem Bluetooth Modul. Dieses Modul selbst sendet Statusinformationen an die UART sowie die Daten, die ich über BT zu ihr sende. Nun ist es so, das der UART RX interrupt nur beim letzten Byte ausgelöst wird, das verschickt wird, d.h. alle Vorangegangenen wurden nicht erkannt. Beim Versenden von meinen Daten habe ich eine kleine Pause zwischen den Bytes eingebaut (einzeln versendet, nicht als string), so das das jetzt Funktioniert. Das Problem mit den Statusinformationen des BT-Moduls löst das nicht. Könnt ihr mir einen Tip geben, was ich machen kann, damit der RX interrupt schon bei dem ersten Byte ausgelöst wird. UART: 9600/8/N/1 Mathias
Ohne Deinen Sourcecode zu sehen geht das nicht. Welche MSP430-Variante mit welcher UART verwendest Du? Prinzipiell funktioniert der RX-Interrupt sowohl bei der neueren USCI als auch bei der alten UART; das Problem dürfte in Deiner Software liegen.
MSP430: F1611 //Init UART: UCTL0 &= ~SWRST; UCTL0 = CHAR; //Sart bit, 8 data bits, no parity, 1 stop UTCTL0 = SSEL0; //ACLK(32768) is UART clock U0BR0 = 0x03; //9600 U0BR1 = 0x00; UMCTL0 = 0x4A; //modulation ME1 |= UTXE0 | URXE0; //enable UART modul P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD P3DIR |= BIT4; //enable TXD0 as output P3DIR &= ~BIT5; //enable RXD0 as input IE1 |= URXIE0; // Enable USART0 RX interrupt //interrupt vector #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { if(count<sizeof(string)) { switch(RXBUF0) { //...
Da haben wir das Problem:
1 | #pragma vector=UART0RX_VECTOR
|
2 | __interrupt void usart0_rx (void) |
3 | {
|
4 | if(count<sizeof(string)) |
5 | {
|
6 | |
7 | switch(RXBUF0) |
8 | {
|
9 | //...
|
Du wertest im Interrupt RXBUF0 nur aus, wenn count (wie und wo definiert/initialisiert?) kleiner ist als sizeof(string) - (wie und wo definiert/initialisiert?) - also nicht immer. Du musst RXBUF0 immer auswerten, da sonst kein neuer Interrupt ausgelöst wird. Ansonsten: Poste keine Codefetzen, sondern vollständigen Code. Ich habe jetzt nicht überprüft, ob Deine Initialisierung der UART den Codebeispielen von TI entspricht - an die dort vorgegebene Reihenfolge MUSS man sich halten.
Danke für die Hinweise. Ich habe die Reihenfolge der Initialisierung nach den Codebeispielen geändert. Die Stelle mit count welche du bemängelt hat habe ich entfernt. War nur zur sicheren Sicherheit... . Es funktioniert jetzt wie gewünscht. Ich denke das Hauptproblem war, das ich in dem RX interrupt Debugt habe. Dadurch sind die Bytes sicher verloren gegangen. Mathias
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.