Forum: Mikrocontroller und Digitale Elektronik MSP430 UART empfang nur letztes Byte


von mathias (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von mathias (Gast)


Lesenswert?

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)
    {
//...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von mathias (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.