Formatierte Ausgabe mit sprintf()

Gast #1594652
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
#1594662
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.
#1594758
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.