mikrocontroller.net

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


Autor: Markus S. (Gast)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int Temperaturwert=(206*((long)ADC12wert+1730)/2600)-55;

Autor: Markus S. (Gast)
Datum:

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

Autor: Helmut Lenzen (helmi1)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Markus S. (Gast)
Datum:

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

Autor: Helmut Lenzen (helmi1)
Datum:

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

Autor: Markus S. (Gast)
Datum:

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

Markus

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programteil das ausgeführt werden soll

goto hier;  // springe nach label hier

Programmteil das übersprungen werden soll

hier:

hier gehts dann weiter

Autor: Markus S. (Gast)
Datum:

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

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.