double aus EPROM lesen und in String speichern

Gast #75900
Lesenswert?

Hi,

ich möchte einen double wert aus dem internen EEPROM lesen und diese
dann in ein char[xx] array als ASCII Zeichenkette speichern um sie
weiter zu verarbeiten (auf einem LCD anzeigen)

kann mir jemand sagen wie ich einen solchen Double wert aus dem EEPROM
auslese und entsprechend umwandeln kann???

Gruß
Malte.
Gast #75901
Lesenswert?

Im Prinzip ja, aber Du bist doch derjenige, der sich daran versucht,
Gleitkomma mit einem AT90S2313 zu machen, oder?  Das halte ich für
ziemlich aussichtslos (zumindest mit AVR-GCC -- IAR scheint hier
besser zu sein, hatten wir neulich schon mal), daher habe ich auch auf
Deine andere Anfrage nicht reagiert.

Prinzipiell mußt Du den double-Wert mit eeprom_read_block() lesen (das
ist so 'ne Art memcpy() für den EEPROM).  Die Umwandlung in den
String
könntest Du dann im Prinzip mit sprintf() machen, aber das hat auf dem
'2313 nichtmal ansatzweise eine Chance, da printf naturgemäß einfach
riesig ist.  Stattdessen mit dtostrf() arbeiten.

Die genannten Funktionen sind alle ordentlich dokumentiert.

Hab's mal spaßeshalber probiert:

#include <avr/eeprom.h>
#include <stdlib.h>

double pi __attribute__((section(".eeprom"))) = 3.1415926;

char s[20];

int
main(void)
{
  double d;

  eeprom_read_block(&d, &pi, sizeof(double));
  dtostrf(d, 15, 6, s);

  return 0;
}

Das Ganze belegt 1816 Bytes ROM...
Gast #75904
Lesenswert?

Hi,

ja das hab ich mir auch schon gedacht...
hab das mit dem Blockread mal ausprobiert und es hat auch einigermaßen
geklappt, nur bekomme ich beim compilieren eine Felermeldung. Ich nehme
an das es was mit dem Linker zu tun hat (in der Doku seht ja auch was
davon das ich nen parameter hinzufügen muß) nur weis nicht net genau wo
und wie?! ich nehme an im Makefile aber da bin ich auch leider noch net
100%ig durchgestiegen.

Hier die Feldermeldung vom Compiler:
avr-gcc -g -Wall -O2 -mmcu=attiny26    -c -o digidash.o digidash.c
avr-gcc -g -Wall -O2 -mmcu=attiny26  -Wl,-Map,digidash.map -o
digidash.elf digidash.o
digidash.o: In function `UpdateDisplay':
S:\Elektrotechnik\Projekte\Digital Dash V2
(LCD)\Programmcode/digidash.c:415: undefined reference to `dtostrf'
make: *** [digidash.elf] Error 1

> Process Exit Code: 2
Gast #75905
Lesenswert?

dtostrf() ist dummerweise in der libm.a versteckt.  Du mußt ein -lm in
die Linkeroptionen mit aufnehmen.  Sollte normalerweise irgendwo im
Makefile schon vorgesehen sein, Du mußt nur das # am Anfang dieser
Zeile löschen.
Gast #75906
Lesenswert?

Es tut mir leid, dass ich diesen Thread wieder ausgrabe.

Aber ich habe fast das gleiche Problem.
Ich will eine double Variable in einen String umwandeln damit ich ihn
dann über UART verschicken kann.
Ich würde gerne die dtostrf()-Funktion benützen, er findet sie aber
anscheinend nicht.

Ich progrmmiere einen ATMega16 mit WinAVR.
Das -lm Flag hab ich schon hinzugefügt. Sollte doch an der richtigen
Stelle sein, oder?
Ich weiß wirklich nicht mehr weiter :(
Hilfe!


> "make.exe"
avr-gcc -g -mmcu=atmega16 -Wall -Wstrict-prototypes  -Os -c
avrledtest.c
avr-gcc -g -mmcu=atmega16 -Wall -Wstrict-prototypes  -lm -o
avrledtest.out -Wl,-Map,avrledtest.map avrledtest.o
avrledtest.o(.text+0xe8): In function `__vector_8':
D:\WinAVR\bin\atmega16/avrledtest.c:73: undefined reference to
`dtostrf'
make.exe: *** [avrledtest.out] Error 1

> Process Exit Code: 2
Gast #75907
Lesenswert?

Die Reihenfolge beim Linken entscheidet!  Aus Bibliotheken wird nur
eingebunden, was zu diesem Zeitpunkt eine undefinierte Referenz
beseitigen hilft (ansonsten bräuchtest Du keine Bibliotheken, weil sie
ja jedesmal komplett gelinkt würden).

Nimm lieber die fertigen Makefile-Templates (oder mfile), dann
passieren Dir solche Fehler nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren