www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Probleme mit UART


Autor: Marco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,

ich habe ein Problem mit dem UART meines MSP430. Ich habe ein Programm 
geschrieben was folgendes machen soll.
-Daten vom PC empfangen
-Wenn ein "Enter" gesendet wurde, die empfangenen Daten auf einem 
Display
 ausgeben
-einen String als Kontrolle an den PC senden

Auf dem PC habe ich Hyperterminal am laufen.

Nun habe ich zwei Probleme.

Problem 1:

Es werden Daten empfangen und so lange in einem String gespeichert, bis 
ein Enter gedrückt wird. Das Enter ist dann das Zeichen, dass keine 
weiteren Daten mehr kommen und das empfangene auf dem Display ausgegeben 
werden kann.
Daten empfangen und speichern geht, aber bei der Ausgabe stimmt was 
nicht.
Es werden immer nur 6 Zeichen ausgegeben. Wenn ich z.B. "1235.678" 
sende, wird das auch gespeichert, im Debugger nachgeschaut. Sobald das 
dann aber auf dem Display ausgegeben werden soll, steht in dem String 
nur noch "12345.".Der Rest wird einfach abgeschnitten. Ich kann mir nur 
vorstellen, dass das an der Ausgabe liegt, aber ich finde den Fehler 
einfach nicht.

Problem 2:

Nachdem die Daten auf dem Display ausgegeben wurden, wenn auch verkürzt, 
soll ein String als Bestätigung an den PC gesendet werden. Das 
funktioniert leidernicht. Der Code bleibt immer in der Zeile
 while (!(IFG1 & UTXIFG0));
d.h. ja, dass der Sendebuffer nicht bereit ist, wenn ich das richtig 
verstanden habe, aber der müsste doch zumindest beim ersten mal leer 
sein.
Ich steige nicht dahinter, woran es liegt.

Ich habe mal ein Zip mit dem wichtigsten Code für Display, UART und das 
Main-Programm angehängt.

Wäre klasse, wennn sich das vielleicht mal jemand anschauen und den 
fehler finden würde.

Vielen Dank.

Gruß
Marco

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>while (!(IFG1 & UTXIFG0));
nimm lieber:
while (!(U0TCTL & TXEPT));

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

Bewertung
0 lesenswert
nicht lesenswert
> >while (!(IFG1 & UTXIFG0));
> nimm lieber:
> while (!(U0TCTL & TXEPT));

Nein, das ist nicht das Problem. UTXIFGx ist schon das korrekte zu 
prüfende Flag. Wird TXEPT überprüft, dann ist nicht nur das 
Sendeschieberegister, sondern auch der Sendepuffer leer. Wird so 
gesendet, wird zwischen jedes übertragene Zeichen eine Zeichenzeit lang 
gewartet. Das ist aber nur bei sehr langsamen Gegenstellen nötig oder 
auch nur nützlich.

Desweiteren werden Rx- und Tx-Interrupts aktiviert, es gibt aber nur 
einen Interrupthandler für den Rx-Interrupt. Der übrigens schreibt 
munter in ein irgendwo definiertes Array irgendeiner Größe, ohne daß 
eine Überprüfung des Arrayindexes auf Überlauf stattfindet.

Wie groß ist out_str?

Wie ist NextStr definiert?

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

NextStr ist wie folgt definiert:
unsigned char NextStr= 0;

und out_str mit unsigned char out_str[]="0000";

> >while (!(IFG1 & UTXIFG0));
> nimm lieber:
> while (!(U0TCTL & TXEPT));

Wenn ich das mache, wird das erste Zeichen meines Strings, welcher an 
den PC gesendet werden soll 2 mal gesendet und danach wird anscheinend 
ein Reset ausgeführt, denn das LCD steht dann wieder wie beim 
Programmstart vor dem ersten Senden und Empfangen von Daten. Deswegen 
hat es dann auch den Anschein, dass nix auf dem LCD angezeigt wird. Wenn 
man dann Schritt für Schritt durchgeht, sieht man, dass es angezeigt 
wird, dann wird was an den PC gesendet, aber falsch und dann resettet 
sich das ganze anscheinend.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco wrote:
> Hallo,
>
> NextStr ist wie folgt definiert:
> unsigned char NextStr= 0;

OK

> und out_str mit unsigned char out_str[]="0000";

Prima, da passen genau 4 Zeichen rein, wenn du mehr empfängst, bevor das 
Enter kommt, überschreibst du irgendetwas anderes im RAM.

>> >while (!(IFG1 & UTXIFG0));
>> nimm lieber:
>> while (!(U0TCTL & TXEPT));

while (!(IFG1 & UTXIFG0)); ist schon richtig, lass das drin.

Achso, und lass den TX-Int aus:

IE1 |= URXIE0;

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank!

> IE1 |= URXIE0;

erledigt

> out_str[]="0000";

wie dumm....kann man das auch auf unbestimmte größe definieren?

Das Problem mit dem Senden von Nachrichten bleibt. der hängt immer in 
der Zeile while (!(IFG1 & UTXIFG0)); fest.

Marco

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unbestimmte Größe geht so erst mal nicht. Schließlich muss der Compiler 
dir was reservieren im RAM. Du könntest natürlich die große Keule mit 
malloc() schwingen, macht aber keinen Sinn. Überleg doch mal, was 
maximal auf dein Display drauf geht, mehr brauchst du doch nicht.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das stimmt natürlich...mehr als aufs Display passt ist ja auch Quatsch, 
bzw. Habe ich später ja auch nur eine begrenzte Menge, die empfangen 
wird.


Hetzt stellt sich nur noch die Frage, warum das Ding einfach nicht 
senden will, bzw. immer in der Abfrage hängen bleibt.

hat da noch jemand eine Idee?

Vielen Dank!

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das mit dem Senden funktioniert nun auch. Ich weiß nicht so recht warum, 
ich habe die Initialisierung des UART nochmal kontrolliert und ein wenig 
rumprobiert, hinterher aber wieder alle Werte wie zuvor eingestellt, 
aber jetzt gehts. Ob da irgendwo ein Tipfehler war oder so!?


Vielen Dank für die Hilfe!

Marco

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

Bewertung
0 lesenswert
nicht lesenswert
> hinterher aber wieder alle Werte wie zuvor eingestellt,

Bei der UART des MSP430 ist auch die Reihenfolge entscheidend, in der 
Dinge eingestellt werden. Das steht aber im User's Manual.

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.