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


von ultra-vatah (Gast)


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

von Massa (Gast)


Lesenswert?

1
char str [20];
2
...
3
sprintf (str, "%.2f\n", result_new);
4
...

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

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

und nicht vergessen die entsprechende library mit einzubinden

gruss
hans

--

von citb (Gast)


Lesenswert?

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

Tolle Begruendung!

citb

von qwertzuiopü (Gast)


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)

von normie (Gast)


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;

von Walter (Gast)


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 ;-)

von Christian H. (netzwanze) Benutzerseite


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:
1
> bringe_mir_eine_tasse_kaffee
2
Der Befehl "bringe_mir_eine_tasse_kaffee" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

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

Kann er auch nicht :-(

von Helfer (Gast)


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.

von bitte löschen (Gast)


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.

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.