Forum: Mikrocontroller und Digitale Elektronik Double und sprintf gehen nur zur halb?!


von Michael (Gast)


Lesenswert?

Hallo,

ich habe da folgendes Problem. Ich werte mit dem ADC eine Spannung aus. 
Die AD-Werte sind anedren Werten zugeordnet, die ich über eine Tabelle 
suche. Anschließend soll alles auf einem Display mit Kommastalle 
ausgegeben werden. Wenn ich das so wie unten mache, dann bleibt mein 
Display komplett leer. Editiere ich die Zeile "Spannung = a[result]" in 
"Spannung = 10.67", dann gibt mir das Display die gewünschten 10.67 
aus....

Daher gehe ich davon aus, dass  irgendwas mit der Zeile "static const 
double a[391] = { 5.56, 5.77, 6.87, 8.98, ...};" nicht stimmt.



Hier mal einige Auszüge:


#include <avr/io.h>
#include <stdlib.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <stdio.h>
#include <stdint.h>

double temperatur;
char Buffer[20];

Auszug aus der Displayausgabe

    static const double a[391] = { 5.56, 5.77, 6.87, 8.98, ...};
    Spannung= a[result];
    sprintf(Buffer,"%.2f", Spannung) ;
    lcd_string(Buffer);






Ich nutze die sprintf funktion, die ich wie hier im Wiki eingebunden 
habe. Über Sinn und Unsinn sei nun mal nicht gesprochen! :) Mir geht es 
nun erst ma drum zu verstehen warum es nicht funktioniert. Anschließend 
kann ich mir noch immer Gedanken machen, das Ganze anders zu lösen aber 
mich Interssiert erst einmal der Fehler! :)


Ich hoffe jemand kann mir bei meinem Problem helfen!

mfg Michael

von Jörg G. (joergderxte)


Lesenswert?

"static const double a[391]"ist mindestens 391*4=1564 Byte groß, passt 
das da noch auf den Stack? -- sonst willst du das wahrscheinlich in den 
Flash verschieben, Stichw.: "PROGMEM".

von Michael (Gast)


Lesenswert?

danke für die schnelle Antwort! :) Ich hab mal testweise nur 4 Werte 
eingegeben und siehe da es geht!

Also muss ich das ganze in den Flash verschieben?!

Habe das Tutorial an der Stelle mal gelesen aber son bissl happert es da 
mit dem Verständnis!

Leider sind da immer nur Beispiele wie einzelne Werte geschrieben werden 
aber nicht wie ich so eine ganze Tabelle verschiebe bzw lese?!

Ich stehe noch am Anfang meines µC Wissens daher wäre ich für einen Tipp 
nochmals sehr dankbar!

mfg Michael

von Klaus W. (mfgkw)


Lesenswert?

Wenn du die ganze Tabelle auf einmal lesen willst, steht sie ja
wieder im RAM, wo nicht genug Platz ist.

Du musst sie im Flash anlegen (PROGMEM beim Deklarieren, siehe
Tutorial) und nur die aktuell benötigten Werte herausholen,
z.B. die benachbarten Stützstellen für eine lineare
Interpolation.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> Die AD-Werte sind anedren Werten zugeordnet, die ich über eine Tabelle
> suche.
Wie kommst du auf diese Zuordnung?
Kannst du da evtl. eine (lineare, quadratische, kubische) Annäherung in 
einer Formel abbilden und den Wert berechnen?

von Peter D. (peda)


Lesenswert?

Ich halte double für leicht übertrieben, ich habe jedenfalls noch keinen 
64Bit-ADC gesehen.

Man sollte den Benutzer nicht völlig auf den Arm nehmen.
Ausgaben sollten keine utopischen Genauigkeiten vorgaukeln.


Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Man sollte den Benutzer nicht völlig auf den Arm nehmen.
Manchmal lassen sich solche "Fehler" als verkaufsförderndes Argumtnet 
nehmen...

> Ausgaben sollten keine utopischen Genauigkeiten vorgaukeln.
Ich hatte da mal eine Waage mit 4 Wägezellen gebastelt und das Gewicht 
von Brettern (je ca. 40kg) bis auf 10g genau (2 Nachkommastellen) 
angezeigt. Das gab der 10-Bit-Wandler schon nicht her....
Und viel schlimmer: wegen eines Programmierfehlers wurde das Gewicht in 
337-Gramm-Schritten quantisiert. Der Kunde war schlichtweg beeindruckt, 
dass sich das Gewicht der beiden Bretter, die auf der Messe zur 
Verfügung standen, immer so schön reproduzierbar war... ;-)

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.