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.
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...
Hi, war kein AT90S2313 sondern ein Tiny26... aber das mit dem Blockread werd ich mal ausprobieren... Gruß Malte.
> war kein AT90S2313 sondern ein Tiny26...
Hat aber auch nur 2 KB ROM. Das ist der Knackpunkt für echtes
Gleitkomma.
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
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.
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
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.
Das ist ein "fertiges" Makefile >:( Aber wenn du mir ein Anderes empfehlen kannst, dann sag mir doch bitte wo dieses zu finden ist. Danke
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.