Forum: Compiler & IDEs double aus EPROM lesen und in String speichern


von Malte Struebert (Gast)


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.

von Joerg Wunsch (Gast)


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...

von Malte Struebert (Gast)


Lesenswert?

Hi,

war kein AT90S2313 sondern ein Tiny26...
aber das mit dem Blockread werd ich mal ausprobieren...

Gruß
Malte.

von Joerg Wunsch (Gast)


Lesenswert?

> war kein AT90S2313 sondern ein Tiny26...

Hat aber auch nur 2 KB ROM.  Das ist der Knackpunkt für echtes
Gleitkomma.

von Malte Struebert (Gast)


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

von Joerg Wunsch (Gast)


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.

von Thomas K (Gast)


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

von Jörg Wunsch (Gast)


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.

von Thomas K (Gast)


Lesenswert?

Das ist ein "fertiges" Makefile >:(
Aber wenn du mir ein Anderes empfehlen kannst, dann sag mir doch bitte
wo dieses zu finden ist.

Danke

von Thomas K (Gast)


Lesenswert?

Problem gelöst!

von OldBug (Gast)


Lesenswert?

Die Antwort hätte mehr Sinn gemacht, wenn Du beschrieben hättest, wie Du
es gelöst hast. Dann haben andere auch eine chance die Antwort auf ein
Problem zu finden...

Gruß,
Patrick...

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.