www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Float in I2C-EEPROM und zurück


Autor: Gregor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich sollte auf einem 8051, in C programmiert, Floatvariablen aus dem Ram 
(Xdata) über einen I2C-Bus in ein EEPROM schreiben und auch wieder 
auslesen. Die Kommunikation mit dem EEPROM selbst funktioniert, nur habe 
ich das Problem, die Floatvariable in einzelne Bytes zu zerlegen bzw. 
aus den einzelnen Bytes aus dem EEPROM wieder die gewünchte Variable im 
Ram zusammen zu bauen.

Gruss
Gregor

Autor: HGSTaBRF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich würd in vc++ sowas machen....

float *fTmp=new float;
char *cTmp=(char *)fTmp;

*fTmp=<float-wert>;

for (int i=0;i<sizeof(float);i++) {
  I2C_Write(cTmp[i]);
}

so in die richtung sollte das hinhaun...
einfach einen float-pointer in einen char-pointer umcasten und dann die 
bytes durchgehn (ich hoff mal es gibt ein sizeof bei dir...sonnst im 
manual nachschaun wie viele byte der float hat)

73 HG

Autor: Gregor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so bekomme ich das nicht zum laufen. Mein Compiler versteht erstens 
nur reines ANSI-C und zum zweiten sind meine C-Kenntnisse in bezug auf 
Pointer recht dürftig. Vielleicht hat ja jemand einen fertigen C-Code ??

Gregor

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch ANSI-C.

Aber mit "so bekomme ich das nicht zum laufen" kann keiner was anfangen.

Du must Dir schon die Fehlermeldung des Compilers anschauen und im 
C-Manual nachsehen, was sie bedeutet.

Ohne genügend C-Kenntnisse wirst aber nicht weiterkommen bzw. wirst Du 
nicht in der Lage sein, auch ein fix und fertiges Beispiel in Deinen 
Code mit einzubinden.


Peter

Autor: Gregor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
also, ich habe jetzt eine lauffähige Lösung.

@Peter: Wenn ich den obigen code compiliert habe, habe ich über 20 
Warnungen und Fehler vom Compiler bekommen und wenig Lust verspürt, die 
alle einzeln zu beheben.
Nachdem ich mich jetzt eine Weile mit den Pointern beschäftigt habe, 
läuft das ganze.

Trotzdem vielen Dank.

Gregor

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gregor,
für solche Zwecke legt man doch am Besten ein union an:

   ...
   union {
     float f;
     char c[4];
   } u;
   ...

   ...
   u.f = 'float-value';
   for ( i = 0; i < 4; i++ )
     I2C_Write(u.c[i]);
   ...

Gruß,
Olaf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gregor,

durch die Anzahl der Fehler darf man sich nicht entmutigen lassen.

Es kann durchaus sein, daß ein einziger Fehler über 1000 Folgefehler 
verursacht. Deshalb kann man bei den meisten Compilern einstellen, nach 
wieviel Fehlern sie abbrechen.


Am sinnvollsten ist es daher, nur den ersten Fehler zu beheben und dann 
neu zu compilieren.


Peter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das da oben ist kein C, sieht wohl eher nach C++ aus. Wenn man die 
Variablendeklaration repariert sollte es aber funktionieren.

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.