mikrocontroller.net

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


Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
    {
//...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da haben wir das Problem:
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  if(count<sizeof(string))
  {

   switch(RXBUF0)
    {
//...

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.

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.