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
1 | int Temperaturwert=(206*((long)ADC12wert+1730)/2600)-55; |
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
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.
Hab mich in den Klammern verzählt, da steht ja noch 206* davor, ist aber trotzdem noch nicht schön.
Bitte mal den Quellcode von der Anzeige herzeigen, dort sollte der Fehler ja sein, wenn gar nichts im Display steht.
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.
sorry für die Frage. Aber wie überspringt man ein Programteil? Wie funktioniert der Goto Befehl? Markus
Programteil das ausgeführt werden soll goto hier; // springe nach label hier Programmteil das übersprungen werden soll hier: hier gehts dann weiter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.