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.
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/using-sprintf--function-for-float-numbers-in-avr-gcc.html
Ein Floatlib und ein sprintf() auf einem Mega32 ? Seid Ihr verrueckt ? Dann ist der Flashspeicher weg. Und das nur fuer eine idiotische Nummer ?
Was wäre denn da die bessere alternative? Taugen die funktionen am ende von olivers link eher für meine zwecke?
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.
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,
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.
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.
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
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
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.