Autor Thema: Float in EEPROM ablegen  (Gelesen 6109 mal)

Offline Max Pohl

  • Jr. Member
  • **
  • Beiträge: 65
    • Profil anzeigen
Float in EEPROM ablegen
« am: April 22, 2010, 12:08:27 Nachmittag »
Hallo zusammen,
habe mal wieder eine Frage...
Ich möchte eine Float Variable im EEPROM abspeichern.
Muss ich jedes Byte einzeln ablegen oder gibt es einen eleganteren Weg?
MfG
Max

Offline Master Snowman

  • Sr. Member
  • ****
  • Beiträge: 293
    • Profil anzeigen
    • You never know until you go
Re: Float in EEPROM ablegen
« Antwort #1 am: April 22, 2010, 15:02:25 Nachmittag »
du musst jedes byte einzeln ablegen. ich habe mir damals eine funktion geschrieben, die ein byte ins EEProm schreibt, und habe diese für 16bit-integer/float/etc. entsprechend oft mit pointer-arithmetik aufgerufen.

Offline Bernd

  • Hero Member
  • *****
  • Beiträge: 3820
    • Profil anzeigen
Re: Float in EEPROM ablegen
« Antwort #2 am: April 22, 2010, 16:41:32 Nachmittag »
Zitat
Muss ich jedes Byte einzeln ablegen oder gibt es einen eleganteren Weg?

Vielleicht so etwas wie hier skizziert?


Viele Grüße

Bernd

Offline Master Snowman

  • Sr. Member
  • ****
  • Beiträge: 293
    • Profil anzeigen
    • You never know until you go
Re: Float in EEPROM ablegen
« Antwort #3 am: April 22, 2010, 18:04:14 Nachmittag »
@Bernd: in deinem link geht's ums flash und nicht ums EEProm
@Max: als übergabe gibst du jeweils die EEProm-adresse (addr = [0..255]) und die adresse deiner variable (dest*/source* = [float, int,..]) und wählst die entsprechende funktion anhand der anzahl bits, die deine variable belegt

// für C18

void ReadEEdata8(unsigned char *dest, unsigned char addr) {
// EECON1bits.CFGS = 0; // VERY important, alternatively it can be set also in the init()
EECON1bits.EEPGD = 0; // READ step #1
EEADR = addr; // READ step #2
EECON1bits.RD = 1; // READ step #3
*dest = EEDATA;   // READ step #4
}

void ReadEEdata16(unsigned char *dest, unsigned char addr) {
unsigned char *p = (unsigned char *)dest;
ReadEEdata8(p++, addr++);
ReadEEdata8(p, addr);
}

void ReadEEdata32(unsigned char *dest, unsigned char addr) {
unsigned char *p = (unsigned char *)dest;
ReadEEdata8(p++, addr++);
ReadEEdata8(p++, addr++);
ReadEEdata8(p++, addr++);
ReadEEdata8(p, addr);
}


void WriteEEdata8(unsigned char *source, unsigned char addr) {
// EECON1bits.CFGS = 0; // VERY important, alternatively it can be set also in the init()
EECON1bits.EEPGD = 0; // WRITE step #1
EECON1bits.WREN = 1; // WRITE step #2
EEADR = addr; // WRITE step #3
EEDATA = *source; // WRITE step #4
INTCONbits.GIEH = 0;    // disable/enable interrupts
INTCONbits.GIEL = 0;    // disable/enable interrupts
EECON2 = 0x55; // WRITE step #5
EECON2 = 0xaa; // WRITE step #6
EECON1bits.WR = 1; // WRITE step #7
INTCONbits.GIEH = 1;    // disable/enable interrupts
INTCONbits.GIEL = 1;    // disable/enable interrupts
while (!PIR2bits.EEIF); // WRITE step #8
PIR2bits.EEIF = 0; // WRITE step #9
}

void WriteEEdata16(unsigned char *source, unsigned char addr) {
unsigned char *p = (unsigned char *)source;
WriteEEdata8(p++, addr++);
WriteEEdata8(p, addr);
}

void WriteEEdata32(unsigned char *source, unsigned char addr) {
unsigned char *p = (unsigned char *)source;
WriteEEdata8(p++, addr++);
WriteEEdata8(p++, addr++);
WriteEEdata8(p++, addr++);
WriteEEdata8(p, addr);
}
« Letzte Änderung: April 22, 2010, 18:31:35 Nachmittag von Master Snowman »

Offline Bernd

  • Hero Member
  • *****
  • Beiträge: 3820
    • Profil anzeigen
Re: Float in EEPROM ablegen
« Antwort #4 am: April 22, 2010, 21:52:30 Nachmittag »
Zitat
@Bernd: in deinem link geht's ums flash und nicht ums EEProm

Nein, nicht wirklich. In meinem Link geht es um jede Form von NVM (non volatile memory, sei es FLASH, EEPROM, FRAM oder was auch immer), welches byteweisen Zugriff gestattet.  Der dort vorgestellte Code ist universell und die einzig nötige Anpassung auf den verwendeten Speicher ist die Bereitstellung von byteweisen Lese- und Schreibfunktionen auf den selbigen.

Der große Vorteil des von mir dargestellten Konzepts liegt einfach darin, daß er auf jede Form von NVM durch minimale Anpassungen verwendbar ist, solange das NVM über byteweise Schreib- und Lesefunktionen verfügt. Nebenbei bemerkt ist es dabei auch vollkommen egal, ob es sich um einen 8-Bit, 16-Bit oder 32-Bit µC handelt und der Compiler das Little-Endian- oder Big-Endian-Format verwendet. Zudem spielen Compiler- und µC-abhängige Größen wie sizeof (int) in meinem Beispiel keine Rolle und sind automatisch immer „richtig“.

Viele Grüße

Bernd

Offline Max Pohl

  • Jr. Member
  • **
  • Beiträge: 65
    • Profil anzeigen
Re: Float in EEPROM ablegen
« Antwort #5 am: April 22, 2010, 22:44:50 Nachmittag »
Alles klar.
Vielen Dank es funktioniert.
MfG Max

 


* Recent Topics