www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie benutze ich den Befehl "sprintf" richtig ?


Autor: ultra-vatah (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich hoffe ihr könnt mir helfen. Und zwar mache ich eine Spannungs - 
Messung mit dem ADC vom ATMEGA88. So nun habe ich meine Ergebnis 
result=ADCW
Das Ergebnis wird ja in der Form Vin*1024/Vref gespeichert. Mein Bsp: 
4.12V*1024/5,12V (=824). Nun möchte ich eine Rückkonvertierung in den 
tatsächlichen Wert machen und es auf dem Display anzeigen :
result_new=result*5.12V/1024 (=4.12)

Wie kriege ich diese 4.12 mit möglichst kleinem Aufwand aufs Display ? 
Die Variante mit modulo finde ich nicht so elegant, zudem ich modulo 
schon in der vorlesung nicht verstanden habe.

Wäre toll, wenn ihr mir die paar Zeilen Code schreiben könntet

Autor: Massa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char str [20];
...
sprintf (str, "%.2f\n", result_new);
...

Das Ergebniss steht nun im Array Char und das kannst du mit einer 
For-Schleife durchlaufen und jedes Zeichen einzeln am Display ausgeben.

Autor: Hans Mayer (Firma: mayer) (oe1smc) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und nicht vergessen die entsprechende library mit einzubinden

gruss
hans

--

Autor: citb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>zudem ich modulo schon in der vorlesung nicht verstanden habe.

Tolle Begruendung!

citb

Autor: qwertzuiopü (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ultra-vatah schrieb:
> zudem ich modulo schon in der vorlesung nicht verstanden habe.

das lässt sich recht einfach lösen:
wenn du an die division denkst, wie sie in der volks-/grundschule 
gelehrt wird, kommt immer eine ganze zahl als ergebnis heraus und falls 
notwendig ein rest.

z.b.
10:3 = 3 mal, 1 rest
10%3 = 1 -> modulo liefert den rest der ganzzahligen division (rest von 
vorher)

Autor: normie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versteh nicht wie man modulo nicht verstehen kann....
modulo gibt immer den rest zurück
124%100 =24

6%3=0

12%10 = 2

1024%2=0

usw...
ganz einfach
und wenn du 3 var für ne 3 stellige ziffer hast dann bsp:
321 soll ausgeg werden
char zahl, min,mid,max;

zahl=321;
min = 321%10; //ergibt 1 für niederwertigste stelle
zahl= zahl -min;(oder zahl -= min;) //321-1=320
mid = zahl %100;//damit ergibt sich aus 320%100 = 20
zahl-=mid;      //320-20 = 300
max=zahl/100;   //300/100=3

ich hoffe ich habe in aller eile keinen fehler eingebaut;

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
normie schrieb:
> ich versteh nicht wie man modulo nicht verstehen kann....

braucht man doch alles heutzutage nicht mehr, das macht doch alles der 
Computer ;-)

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter schrieb:
> braucht man doch alles heutzutage nicht mehr, das macht doch alles der
> Computer ;-)

Tja, trotzzdem musst du wissen, wass Modulo macht.

Wenn alles der Computer macht, sage ich ihm jetzt folgendes:
> bringe_mir_eine_tasse_kaffee
Der Befehl "bringe_mir_eine_tasse_kaffee" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Ok, falscher Computer; dann halt ein anderer:
[root@kaffeemaschine]# hole_mir_eine_tasse_kaffee
bash: hole_mir_eine_tasse_kaffee: command not found

Kann er auch nicht :-(

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Modulo nutzt dir bei Fliesskommazahlen (4.12) nix. Nimm dafür die Lösung 
von Massa mit sprintf().

Oder wechsele zu Ganzzahlen und Fixkommarechnung in dem du z.B. intern 
mit dem hundertfachen Wert rechnest (412). Modulo ist Grundhandwerk beim 
µC programmieren. Bring dir das schleunigst selber bei, sonst hast du 
nicht viel Spaß beim Hobby!

Statt Modulo kannst du auch durch Subtrahieren und Vergleichen 
herausfinden, wie viele Hunderter, Zehler und einer in deiner Zahl 
vorhanden sind. Diese Ergebnisse (4 Hunderter, 1 Zehner, 2 einer) kannst 
du durch Addition von '0' in ASCII-Ziffern ('4', '1', '2') umwandeln und 
zusammen mit einem Dezimaltrennzeichen (',' oder neudeutsch '.') an der 
richtigen Stelle ("nach den Hundertern, wenn intern mit dem 
Hundertfachen gerechnet wurde") aus geben.

Autor: bitte löschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß ja nicht, wie das bei Mikrocontrollern aussieht, aber unter 
Umgebungen mit Betriebssystemen gilt es mittlerweile nicht mehr als 
guter Stil, sprintf bzw. printf zu verwenden. Das Auswerten eines 
Format-Strings zur Laufzeit habe ich eh' noch e als schönes Konzept 
empfunden.
Diese Funktionen sind eine gute Möglichkeit, kleine Fehler so 
unterzubringen, dass sie nicht nur große Auswirkungen haben, sondern 
auch noch schwer zu finden sind.
Abgesehen vom Geschwindigkeitsgewinn verbrät es außerdem meistens 
deutlich weniger Programmspeicher, diese Funktionen nicht mit in sein 
Programm zu linken sondern stattdessen die Formatierung mit ftoa(), 
itoa(), strncpy() etc.. selbst vorzunehmen.

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.