mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

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.