Re: floats im I2C-EE speichern Kategorie: Sonstige Hardware (von Hannes - 26.03.2008 8:44) | ||
Als Antwort auf EEPROM über I²C von Marcel - 25.03.2008 18:24 | ||
| ||
Hi, Nachkommastellen verschluckt?? Ich weis ja nicht wie Du die float`s im EEPROM speicherst aber prinzipiell kann man das I2C-EEPROM nur byteweise ansprechen. Das C-Control Pro verwendet float-Zahlen, als 4Byte, nach IEEE 754. Ob man mit dem System die float manuell in die 4Byte umrechnen kann weis ich nicht, die Frage kann evtl. PeterS beantworten. Ich hab mal ein kleines Programm geschrieben um positive Messwerte als Float im I2C-EE zu speichern. Dabei zerlege ich die float in die Vorkomma- und Nachkommastellen und speichere diese mit 3Byte im I2C-EE ab. Geht also nur bis 32767,xx mit einer kleinen Ungenauigkeit in der letzten Komma- stelle, für mich ein brauchbares Ergebnis. Gruss /* Eine Float-Zahl im I2C-EEPROM speichern + lesen Achtung: Rundungsfehler entstehen bereits ab der 2. Stelle hinterm Komma!!! z.B. 3.33000 -> 3.32 */ #define LF 0x0A #define CR 0x0D #define SPACE 0x20 void main(void) { float Zahlf; word EE_Adr; byte EE_Byte; EE_Adr=0; I2C_Init(I2C_100kHz); // I2C Bit Rate: 100 kHz for (Zahlf = 0.0; Zahlf <= 20.0; Zahlf= Zahlf + 1.11) { WriteFloat_24C64(EE_Adr, Zahlf); EE_Adr = EE_Adr + 3; Msg_WriteFloat(Zahlf); Msg_WriteChar(SPACE); } Msg_WriteChar(0x3D); // " = " for (EE_Adr=0; EE_Adr <= 54; EE_Adr = EE_Adr + 3) // aus dem I2C-EE lesen { Zahlf= ReadFloat_24C64(EE_Adr); Msg_WriteFloat(Zahlf); Msg_WriteChar(SPACE); } } // ----------------------- eine Float-Zahl als 3 Byte ins I2C-EEPROM schreiben ------------------ // void WriteFloat_24C64(word EE_Adresse, float zahlf) { float VKSf, NKSf; word VKSw; byte NKSb; word high_byte, low_byte, teiler; teiler=256; VKSw = zahlf; // Vorkommastellen als word VKSf = VKSw; // Vorkommastellen als float NKSf = zahlf - VKSf; // Nachkommastellen als float NKSb = NKSf *100.0; // Nachkommastellen als byte (2-stellig) high_byte = VKSw / teiler; // VKS (word) in ein high-byte low_byte = VKSw % teiler; // und low-byte zerlegen Write_24C64(EE_Adresse, high_byte); // die VKS im EE speichern Write_24C64(EE_Adresse+1, low_byte); Write_24C64(EE_Adresse+2, NKSb); // die NKS im EE speichern } // ---------------------- eine Float-Zahl (3 Byte) aus dem I2C-EEPROM lesen -------------------- // float ReadFloat_24C64(word EE_Adresse) { float zahlf; word VKSw; byte NKSb; VKSw= Read_24C64(EE_Adresse)*256 + Read_24C64(EE_Adresse+1); // die Vorkommastelle (2Byte) lesen NKSb= Read_24C64(EE_Adresse+2); // die Nachkommastelle (1Byte) lesen zahlf= VKSw + NKSb/100.0; return zahlf; } //------------------------------------------------------------------------------ // Daten in das 24C64 (8k x 8) EEPROM schreiben // void Write_24C64(word Adresse, byte Daten) { I2C_Start(); I2C_Write(0xA0); // DEVICE ADDRESS : A0 I2C_Write(Adresse>>8); // HIGH WORD ADDRESS I2C_Write(Adresse); // LOW WORD ADDRESS I2C_Write(Daten); // write Data I2C_Stop(); AbsDelay(5); // delay for EEPROM Write Cycle } //------------------------------------------------------------------------------ // Daten aus dem 24C64 (8k x 8) EEPROM lesen // byte Read_24C64(word Adresse) { byte I2C_DATA; I2C_Start(); I2C_Write(0xA0); // DEVICE ADDRESS : A0 I2C_Write(Adresse>>8); // HIGH WORD ADDRESS I2C_Write(Adresse); // LOW WORD ADDRESS I2C_Start(); // RESTART I2C_Write(0xA1); // DEVICE ADDRESS : A1 I2C_DATA=(I2C_Read_NACK()); I2C_Stop(); return I2C_DATA; // return I2C Data Register } /* Interpreter gestartet - 2kb RAM 0.00000 1.11000 2.22000 3.33000 4.44000 5.55000 6.66000 7.77000 8.88000 9.99000 11.10000 12.21000 13.32000 14.43000 15.54000 16.64999 17.75999 18.86999 19.97999 =0.00000 1.11000 2.22000 3.32000 4.43000 5.54000 6.65000 7.76000 8.87000 9.9800 0 11.09000 12.20000 13.31000 14.42000 15.53000 16.64000 17.75000 18.86000 19.970 00 Zeit: 460ms Interpreter gestoppt */ | ||
Antwort schreiben Antworten: Re: floats im I2C-EE speichern (von Marcel - 26.03.2008 8:59) Re: floats im I2C-EE speichern (von Hannes - 26.03.2008 9:20) Re: floats im I2C-EE speichern (von Marcel - 26.03.2008 18:02) Re: floats im I2C-EE speichern (von Hannes - 27.03.2008 10:24) Re: floats im I2C-EE speichern (von Marcel - 27.03.2008 11:46) Re: floats im I2C-EE speichern (von Hannes - 27.03.2008 13:36) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum