Forum: Compiler & IDEs Formatierte Ausgabe mit sprintf()


von JTR (Gast)


Lesenswert?

Hallo,
also geht darum eine long Zahl formatiert auf einem LCD auszugeben.
Dafür verwende ich die Fleury include. Mit der Funktion lcd_puts() 
werden Strings am Display ausgegeben, aber eben nur Strings.

Der Wert der long Variable hängt vom ADC Ergebnis ab.
Dieser kann sich zwischen 0 u. 1023 bewegen.

Die long Variable wird wie folgt berechnet:
1
ulPuffer=(1000*usigetADU_10Bit(0))/1023*20;

Dieser Wert steht dann für die Leistung in [mW].
Erklärung:
*1000 um von W auf mW zu kommen
*20 = 5 * 4 --> *5 weil, das die max. Referenz Spannung ist und *4 weil 
1V euntspricht 4W
/1023 --> weil, dass der max. Wert des ADC ist

Hier ist einfach die Kurvengleichen y=kx+d.

Noch mal anders erklärt:
Für die Berechnung der Leistung

Nun soll am Display folgendes stehen: *.*W

Also zb.: Wenn bei meiner Berechnung 8900 das Ergebnis ist soll am
LCD stehen

8.9W
1
usiPuffer1=ulPuffer/1000;
2
usiPuffer2=((ulPuffer%100)/100);

Mit diesen Berechnungen will ich auf die 8 und 9 kommen.

Danach soll, das alles in einen netten String verpackt werden.
1
sprintf(cPuffer,"%d.%dW",usiPuffer1,usiPuffer2);

Leider steht auf meinem Display lediglich 0.0W.

Was mach ich falsch?

MFG

von JTR (Gast)


Lesenswert?

>Hier ist einfach die Kurvengleichung y=kx+d im Spiel.

So sollte dieser Satz lauten.

von Klaus W. (mfgkw)


Lesenswert?

1. der Quelltext wäre interessant
2. Vielleicht ist der Wert ja 0
3. wenn du erst durch 1023 teilst und dann mit 20 multiplizierst,
   ist der Wert nach dem /1023 vielleicht schon 0 und kommt
   mit *20 auch nicht mehr hoch?
4. kannst du ja mal bestimmte Werte fest vorgeben (z.B.
   ulPuffer=8900), dann sieht man ob bis hier falsch gerechnet wird
   oder die restliche Ausgabe verhunzt wird.

von Karl H. (kbuchegg)


Lesenswert?

JTR schrieb:

> Was mach ich falsch?

Grundsätzlich:
Du machst falsch, dass du keinen kompletten, compilierfähigen Quellcode 
postest. Nicht nur die Operationen an sich, sondern auch die Datentypen 
der beteilgten Variablen können wichtig sein.

usiPuffer1=ulPuffer/1000;
usiPuffer2=((ulPuffer%100)/100);

Warum 100?
Warum dividierst du die 'Nachkommastellen' dann noch einmal durch 100?

sprintf(cPuffer,"%d.%dW",usiPuffer1,usiPuffer2);

Aufpassen: Wenn usiPuffer2 ausgegeben wird, müssen führende Nullen 
erhalten bleiben!   2.08 ist etwas anderes als 2.8
1
   // ulPuffer an der "Tausenderstelle trennen"
2
   usiPuffer1 = ulPuffer / 1000;
3
   usiPuffer2 = ulPuffer % 1000;
4
5
   // da ich nicht weiß, welchen Datentyp usiPuffer1 bzw. usiPuffer2
6
   // haben, caste ich vorsichtshalber noch auf int, so wie es %d haben
7
   // will
8
   sprintf( cPuffer, "%d.%03dW", (int)usiPuffer1, (int)usiPuffer2 );

Zur Kontrolle auch vorher ulPuffer mal ausgeben. Denn eine alte Regel 
lautet: Garbage in - Garbage out.  Wenn ulPuffer schon nicht den 
richtigen Wert enthält, kannst du nicht darauf hoffen, dass die 
usiPuffer schon irgendwie den richtigen Wert erhalten werden.

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.