mikrocontroller.net

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


Autor: Malte Struebert (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Malte Struebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Gruß
Malte.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> war kein AT90S2313 sondern ein Tiny26...

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

Autor: Malte Struebert (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Thomas K (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Thomas K (Gast)
Datum:

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

Autor: Thomas K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst!

Autor: OldBug (Gast)
Datum:

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

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.