mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf und LCD


Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich möchte einen ADC wert vom mega32 auf ein LCD schicken. leider 
bekomme ich an der stelle wo die berechnete spannung angezeigt werden 
sollte immer nur ein ? zu sehen. woran kann das liegen?

der ADC wert liegt in der variablen result
int max_spannung = 5;
char buffer[5];
float spannung;
spannung = (max_spannung / 1023) * result;

sprintf(buffer,"%2.2f V",spannung);
display_ptext(buffer,3,10);

auf die selbe art und weise gebe ich die variable result auf dem display 
aus. mit dem unterschied das es sich dort um einen integer handelt und 
ich daher mit sprintf(buffer2,"%i",result) arbeite. Dort klappt es ohne 
probleme.

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, dass die float-libs für die printf-Routinen 
standardmäßig nicht mitgelinkt werden, weil die recht groß sind.

Schau mal hier nach:

http://winavr.scienceprog.com/avr-gcc-tutorial/usi...

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Floatlib und ein sprintf() auf einem Mega32 ? Seid Ihr verrueckt ? 
Dann ist der Flashspeicher weg. Und das nur fuer eine idiotische Nummer 
?

Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was wäre denn da die bessere alternative? Taugen die funktionen am ende 
von olivers link eher für meine zwecke?

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verschneiter Tag schrieb:
> Seid Ihr verrueckt ?

Nein ganz und garnicht ;)
Er wird schon merken, was diese Bequemlichkeit an Code-Overhead mit sich 
bringt. Habe ich in meinen Anfängen auch mal so probiert. Aber das 
Verhältnis von Nutzen und Codegröße ist für ein ernsthaftes Projekt 
keineswegs vertretbar. Da sollte man sich schon selber was proggen.

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Idee wäre, dass du die Gleitkommazahl nimmst und mit der potenz 
10^nachkommastellen mutiplizierst.

Beispiel 4.777777  2 Nachkommastellen     4.777777*10^2=477.7777

Daraus machst du eine Integer Zahl mit dem c-cast "(int)"

(int)477.7777 --> 477

Jetzt machst du eine Ganzahldivision durch 10^nachkommastellen.

vor=477/100=4   das ist die Zahl vorm komma

Nun noch die Nachkommastellen:

nach=477%100=77

Abschließend printf("%i.%02i",vor,nach);

%02i heißt integer mit 2 Stellen und führenden Nullen,

Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und printf() ist kein problem für den mega32?
wie bekomme ich denn die ausgabe von printf in eine variable? als 
parameter beim aufruf wird  keine übergeben und buffer = printf(..) geht 
auch nicht. an meine lcd routinen kann ich aber nur variablen übergeben.

Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe das ganze jetzt mit der dtostrf() funktion gelöst. meine frage 
ist nun, ob das von der rechenzeit und speicherauslastung eine 
angemessene lösung ist.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mal ganz simpel gesagt: es hängt von diesem konkreten Projekt ab...

Wenn ich einen Mega16 einsetze, weil ich die Portpins o.ä. brauche und 
meine direkt nötigen Software sowieso nur 2k belegen würden, kann ich 
den Rest ohne Nachdenken mit Float o.ä vollmachen.

Wenn ich einen 4k Tiny einsetzen will und schon 3,5k für da nötige 
Programm brauche, werde ich sparen, wo immer es möglich ist.

Gruß aus Berlin
Michael

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dEx schrieb:
> und printf() ist kein problem für den mega32?
Natürlich kannst du nicht so ohne weiteres printf nehmen. Dachte das 
wäre dir klar, weil du ja schon mit sprintf gearbeitet hat.
Das ganze sollte als allgemeine Lösung dienen.

dEx schrieb:
> ich habe das ganze jetzt mit der dtostrf() funktion gelöst. meine frage
> ist nun, ob das von der rechenzeit und speicherauslastung eine
> angemessene lösung ist.

Was bringt dtostrf() an Overhead mit sich?   4kb?
Angemessen wäre das Auskommen ohne floats, weil die FPU ja nur aufwendig 
emuliert wird.

Die integer zahl (bsp 477) könntest du dir auch so erzeugen:

 ZAHL=(AD_VAL*V_MAX*100)/AD_MAX     BSP.: (1953*500)/2047


 AD_VAL  0..2047
 V_MAX   5      [V]
 AD_MAX  2047

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ein Floatlib und ein sprintf() auf einem Mega32 ? Seid Ihr verrueckt ?
>Dann ist der Flashspeicher weg.

Das ist purer Unsinn. Von den 32 kB sind nur 10..15% weg.

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.