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
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
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
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.
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
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
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?
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
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.
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