Forum: Mikrocontroller und Digitale Elektronik MSP430 Probleme mit UART


von Marco (Gast)


Angehängte Dateien:

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

von TL431 (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Marco (Gast)


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.

von Christian R. (supachris)


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;

von Marco (Gast)


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

von Christian R. (supachris)


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.

von Marco (Gast)


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!

von Marco (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

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.