Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > Hi, > > das ist eine gute Idee. > So habe ich mir das auch gedacht, allerdings bisher ohne Erfolg. > Ich will den Float auch in einen Vorkomma- und Nachkommabereich teilen und dann abspeichern. > Geht das so wie du es gezeigt hast auch mit - Zahlen? > > Gruß Marcel > > > > > 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 > > */