www.mikrocontroller.net

Forum: Compiler & IDEs Formatierte Ausgabe mit sprintf()


Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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
usiPuffer1=ulPuffer/1000;
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.
sprintf(cPuffer,"%d.%dW",usiPuffer1,usiPuffer2);

Leider steht auf meinem Display lediglich 0.0W.

Was mach ich falsch?

MFG

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hier ist einfach die Kurvengleichung y=kx+d im Spiel.

So sollte dieser Satz lauten.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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
   // ulPuffer an der "Tausenderstelle trennen"
   usiPuffer1 = ulPuffer / 1000;
   usiPuffer2 = ulPuffer % 1000;

   // da ich nicht weiß, welchen Datentyp usiPuffer1 bzw. usiPuffer2
   // haben, caste ich vorsichtshalber noch auf int, so wie es %d haben
   // will
   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

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.