Forum: Mikrocontroller und Digitale Elektronik Funktion zum Schreiben in externes EEPROM - uint und int


von Fridolin (Gast)


Lesenswert?

Hallo!

Wenn ich sowohl unsigned int wie auch signed int in ein EEPROM schreiben 
will, so sind die Funktionen zum schreiben ja generell gleich. In beiden 
Varianten nehme ich die zu schreibenden Daten und wandele sie in uint8 
um und schreibe sie sequentiell ins EEPROM.

Muss ich für beide Varianten eigene Funktionen haben, oder die mache ich 
es?

Beispiel:

int16_t wird zu

(uint8_t) (daten >> 8)     - Byte 1
(uint8_t) (daten)          - Byte 2

der uint wird genauso behandelt.

Aber beim Funktionsaufruf zum Schreiben muss ich ja unterscheiden 
zwischen

void write_eeprom (int16_t daten, uint16_t addresse)

und

void write_eeprom (uint16_t daten, uint16_t addresse)


Wie kann man das elegant lösen, oder muss ich zwei Funktionen dafür 
haben? Genauso halt beim zurückholen...

von Fridolin (Gast)


Lesenswert?

Jetzt komm ich glaube ich grad selber drauf...

Ich kann die Adresse übergeben und dann unter Angabe der zu schreibenden 
Bytes mittels (uint8_t*)-Pointer die Daten holen, oder?

von sebastians (Gast)


Lesenswert?

Wenn du mit einer Warnung leben kannst, brauchst du garnichts tun.
Da wird der unsigned automatisch auf signed gecastet oder andersrum.
Das Ergebnis ist dann vielleicht undefiniert, aber es wird 
wahrscheinlich trotzdem tun was du willst.
Die Warnung kannst du loswerden, indem du
- Einen typecast beim Aufruf reinschreibst
- Ein Makro schreibst (Das z.B. den Typecast für dich macht)
- templates verwendest (C++)

von Andreas B. (Gast)


Lesenswert?

Mach doch

void write_eeprom(void *data, uint16_t address, size_t size)

Das funktioniert für alle Datentypen. Wegen void-Pointer werden auch 
keine casts gebraucht. Nachteil: Die zu sendenden Daten müssen im 
Speicher abgelegt sein (also mindestens lokale Variable), einfach eine 
Konstante zum Schreiben übergeben geht nicht direkt.

von Fridolin (Gast)


Lesenswert?

Andreas B. schrieb:
> void write_eeprom(void *data, uint16_t address, size_t size)

Dankesehr!

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.