Forum: Mikrocontroller und Digitale Elektronik MSP430 Formel im Programm funktioniert nicht


von Markus S. (Gast)


Lesenswert?

Hallo zusammen,
hier mal wieder ein Problem eines "Jungprogrammierers"
Ich möchte mit einen MSP430149F einen Temperaturfühler auslesen und auf 
eine 7-Segmentanzeige Anzeigen lassen.
Als Programmierumgebung verwende ich IAR.
Ich habe mir eine Probeplatine gebastelt auf die ich die OLMEX platine 
gesetzte habe, und habe Taster, LEDs, 7-Segmentanzeige usw. mit drauf 
gelötet (ähnlich wie bei mathar.com). Die Anzeige funktioniert 
Problemlos. Ich kann mir den Wert der aus dem ADC12 kommt direckt 
anzeigen lassen (0-4095). Das passt auch mit den errechneten Werten von 
dem Temperaturfühler zusammen.
Ich möchte jetzt die Werte von ADC12 in die Temperaturwerte umrechnen 
und ausgeben.
Ich mir eine Formel hergeleitet und sie ins Programm eingegeben:

int Temperaturwert=(206*(ADC12wert+1730)/2600)-55;

Da das nicht geklappt hat, habe ich weitere Varianten versucht:

long Temperaturwert=(206*(ADC12wert+1730)/2600)-55;

oder

long Temperaturwert1=ADC12wert+1730;
long Temperaturwert2=Temperaturwert1*206;
long Temperaturwert3=Temperaturwert2/2600;
long Temperaturwert=Temperaturwert3-55;

leider das gleiche Ergebnis

Das Ergebnis ist, dass die 7-Segmentanzeige gar nichts anzeigt, und das 
tut sie nur wenn an den einzelnen 7-Segment Decodern für die Ziffern ein 
Wert über 9 angelegt wird. Als Decoder verwende ich den 4511(von 
Reichelt).
Ich habe die Formel mal in eine C-Programmierumgebung auf dem PC 
eingegeben. Da funtioniert sie problemlos.
Meine Frage also lautet. Hat der MSP430194F ein Problem mit solchen 
Formeln oder habe ich irgendetwas nicht beachtet.

Ich hoffe Ihr könnt mir helfen.

Vielen Dank

Markus

von Mark (Gast)


Lesenswert?

Hi Markus,

wenn Du einen int auf einer 7-Seg-Anzeige ausgeben willst, dann musst Du 
ja erstmal eine Umwandlung des Int-Wertes auf die einezelnen Ziffern 
machen - ich hoffe das hast Du so implementiert.
Ein 'gar nichts' anzeigen dürfte dann aber nicht mehr auftreten, d.h. 
jeder Wert zwischen 0 und 4095 müsste ja angezeigt werden - oder?
Kannst Du nicht im Debugger mal einen Breakpoint setzen und Dir den Wert 
anschauen, der nach Deiner Berechnung rauskommt?

Mark

von Stefan (Gast)


Lesenswert?

1
int Temperaturwert=(206*((long)ADC12wert+1730)/2600)-55;

von Markus S. (Gast)


Lesenswert?

Hallo Mark,

>- ich hoffe das hast Du so implementiert.
das mit der Umwandlung habe ich ja gemacht. Deshalb funktioniert das 
direkte Anzeigen der Werte vom ADC12 problemlos.

>Ein 'gar nichts' anzeigen dürfte dann aber nicht mehr auftreten...
doch leider tut es das. Das versehe ich ja leider auch nicht. Noch zur 
Info, wenn ich die Temperatur am Fühler erhöhe, dann kommt mal kurz eine 
Zahl (aber nur eine)

>Kannst Du nicht im Debugger mal einen Breakpoint setzen und Dir den Wert
>anschauen, der nach Deiner Berechnung rauskommt?

Das mit dem Breakpoint habe ich leider noch nicht kapiert wie das 
funktionieren soll.

Danke schon mal für deine Hilfe
Markus

von Helmut L. (helmi1)


Lesenswert?

Markus S. schrieb:
> Das mit dem Breakpoint habe ich leider noch nicht kapiert wie das
> funktionieren soll.

Zeile mit Maus auswaehlen, dann rechte Maustaste und Toggle Breakpoint 
auswaehlen.
Dann wird die Zeile mit einem roten Punkt markiert. Wenn du dann im 
Debugger menu 'GO' anklickst laeuft er bis zur der Stelle.

Unter 'VIEW' Symblic Memory kannst du dir dann die Variable ausgeben 
lassen.

von Mark (Gast)


Lesenswert?

Hi,

der cast auf (long) wie von Stefan beschrieben sollte das Problem lösen. 
Du kommst sonst bei Deiner Formel über die int-Grenzen und das Ergebnis 
ist ein negativer Wert, der wahrscheinlich bei Deiner Anzeige 'nichts' 
anzeigt.

Auf dem PC ging es weil int dort sicher 32bit ist.

Übrigens kannst Du Deine Berechnung ganz einfach debuggen, z.B. im IAR 
Kickstart einfach ein neues Projekt erstellen, gleich die main erzeugen 
lassen und die paar Zeilen da reinkopieren. Auf der linken Seite im 
Editor entspr. Breakpoints setzen und den Debugger starten (Options -> 
Debugger = Simulator einstellen!). Das geht also ohne angeschlossenes 
Device.

Ciao

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Das kann ja auch nicht funktionieren:
((long)ADC12wert+1730)/2600)

Angenommen, man setzt 0 ein, dann kommt 0 raus, wenn man 4095 einsetzt, 
kommt immerhin schon 2 raus. Es gibt also nur 3 mögliche Werte, die als 
Anzeigewert überhaupt rauskommen können.

Stichwort: Ganzzahlarithmetik -> Nachkommastellen werden abgeschnitten, 
und zwar auch bei Zwischenergebnissen.

Grüße,

Peter

von Mark (Gast)


Lesenswert?

Hi Peter,

will wirklich nicht klugscheißen aber wenn man 0 einsetzt kommt 82 raus 
oder -44, je nachdem ob man den ADC-Wert auf long castet oder nicht.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Hab mich in den Klammern verzählt, da steht ja noch 206* davor, ist aber 
trotzdem noch nicht schön.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Bitte mal den Quellcode von der Anzeige herzeigen, dort sollte der 
Fehler ja sein, wenn gar nichts im Display steht.

von Karl H. (kbuchegg)


Lesenswert?

Markus S. schrieb:
> Hallo Mark,
>
>>- ich hoffe das hast Du so implementiert.
> das mit der Umwandlung habe ich ja gemacht. Deshalb funktioniert das
> direkte Anzeigen der Werte vom ADC12 problemlos.
>
>>Ein 'gar nichts' anzeigen dürfte dann aber nicht mehr auftreten...
> doch leider tut es das.


Dann stimmt deine Aussage das die 'direkte Anzeige' funktioniert nicht 
in ihrer Allgemeinheit.

Hast du bei direkter Anzeige ausprobiert, was passiert, wenn der 
Zahlenwert zu groß wird, was passiert wenn er negativ wird?

von Markus S. (Gast)


Lesenswert?

Hallo alle zusammen,
1. vielen vielen Dank für die große Hilfe von euch!
2. Es funtioniert!

@Stefan
>int Temperaturwert=(206*((long)ADC12wert+1730)/2600)-55;
es hat funtioniert den ADC12wert als long zu definieren. Nur hat es 
nicht so funtioniert wie du es beschrieben hast, denn dann will er 
irgendwo ein Simikolon haben. Ich habe den ADC12wert weiter oben im 
Programm (bei der Werteübergabe) als long definiert dann hat es 
geklappt.

@Helmut
das mit dem Breakpoint funtioniert nicht weil ich nicht bis zu der 
Stelle komme. Denn im Programm müssen erst einige (externe) Dinge 
passieren bis ich an die Stelle komme. Deshalb weiß ich leider nicht 
weshalb es nicht funktioniert hat.


Heisst das denn das bei dieser Rechnung der MSP jeden Zwischenwert nach 
einer Rechenoperation dem ADC12wert zu weist? Ich hätte gedacht das 
jeder Zwischenwert dem "Temperaturwert" zugewiesen wird deshalb habe ich 
den Temperaturwert als long definiert.
Dieses war nur ein Test die richtige Widerstandskennlinie hat noch eine 
kopliziertere Formel. Heisst das, dass ich alle Komponenten die ich in 
einer Formel verwenden will als long definieren muß?

Markus

von Helmut L. (helmi1)


Lesenswert?

Markus S. schrieb:
> das mit dem Breakpoint funtioniert nicht weil ich nicht bis zu der
> Stelle komme. Denn im Programm müssen erst einige (externe) Dinge
> passieren bis ich an die Stelle komme. Deshalb weiß ich leider nicht
> weshalb es nicht funktioniert hat.

Warum überspringst du nicht einfach diesen Teil.
Hier könnte man ausnahmweise mal das sonst so verpönte Goto benutzen.

von Markus S. (Gast)


Lesenswert?

sorry für die Frage.
Aber wie überspringt man ein Programteil?
Wie funktioniert der Goto Befehl?

Markus

von Helmut L. (helmi1)


Lesenswert?

Programteil das ausgeführt werden soll

goto hier;  // springe nach label hier

Programmteil das übersprungen werden soll

hier:

hier gehts dann weiter

von Markus S. (Gast)


Lesenswert?

so, habe ich mal probiert, aber da kommen bei mir zu viele 
Fehlermeldungen weil dann einige Variablendeklarationen fehlen. Ich 
denke ich werde das mal mit einen einfacheren Programm probieren.
Auf jeden Fall vielen Dank für den Tip

Markus

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.