in een PIC16F877 heb ik een PID-regelaar zitten. Nu wil ik via CAN-bus de waardes van de PID kunnen veranderen. Hiervoor moeten de waardes van de PID in het eeprom worden gezet.
De waardes van de PID zitten in een drietal floats. Deze floats probeer ik in het eeprom te schieten, maar de conversie gaat op een of andere manier niet goed.
Floats worden in 24 bits gezet door de PICC compiler. Ik heb eerst geprobeerd om doubles (32-bit) te gebruiken, maar ook dit gaat niet goed.
De code die ik heb gebruikt:
float Eeprom_Read_Float(word addr) {
float result;
byte *ptr=&result;
byte i;
for (i=0;i<4;i++) {
*(ptr++)=eeprom_read(addr++);
}
return result;
}
void Eeprom_Write_Float(word addr,float data)
{
byte *ptr=&data;
byte i;
for (i=0;i<4;i++) {
myeeprom_write(addr++,*(ptr++));
}
}
verder heb ik geprobeerd om met unions te werken, maar hier krijg ik foutmeldingen van de compiler: "probable missing '}' in previous block".
union floatcharconv
{
signed float si;
unsigned float ui;
unsigned char c[4];
} floatchar;
Heeft iemand een goed idee voor me?
Een float bestaat ook gewoon uit een aantal bytes.
Via shiften en bitmasken gewoon elke keer 8 bit wegschrijven naar het EEPROM. Voor uitlezen gewoon byte voor byte uitlezen en bitwise schrijven naar de float weer.
voorbeeldje (waarbij een float 3 byte, 24 bit, groot is):
schrijven naar EEPROM:
EEPROM_BYTE_1 = FLOAT_NUMBER & 0x0000FF;
EEPROM_BYTE_2 = (FLOAT_NUMBER >> 8) & 0x0000FF;
EEPROM_BYTE_3 = (FLOAT_NUMBER >> 16) & 0x0000FF;
lezen uit het EEPROM op vergelijkbare methode, maar daar moet ik iets meer voor nadenken. 
edit: even aangepast naar 24 bit float
[Bericht gewijzigd door Neen op (11%)]
Opgelost!
De code die ik gebruikt heb was nog gebaseerd op 32-bit floats... Heb er nu 24-bit van gemaakt en nu werkt het wel.
float Eeprom_Read_Float(word addr) {
float result;
byte *ptr=&result;
byte i;
for (i=0;i<3;i++) {
*(ptr++)=eeprom_read(addr++);
}
return result;
}
void Eeprom_Write_Float(word addr,float data)
{
byte *ptr=&data;
byte i;
for (i=0;i<3;i++) {
myeeprom_write(addr++,*(ptr++));
}
}