Re: floats im I2C-EE speichern Kategorie: Sonstige Hardware (von Hannes - 27.03.2008 13:36) | ||
Als Antwort auf Re: floats im I2C-EE speichern von Marcel - 27.03.2008 11:46 | ||
| ||
Wenn ich im u.a. Programm in main() die erste for-Schleife deaktiviere und das Programm neu kompiliere und auf den Mega32 lade und den Mega dann aus- u. einschalte und das Programm starte wird: Interpreter gestartet - 2kb RAM =0.00000 1.11000 2.22000 3.32000 4.43000 5.54000 6.65000 7.76000 8.87000 9.98000 11.09000 12.20000 13.31000 14.42000 15.53000 16.64000 17.75000 18.86000 19.9700 0 Zeit: 80ms Interpreter gestoppt ausgegeben, d.h. alle vorher gespeicherten Daten bleiben erhalten (wzbw). Gruss > Schreibfehler! > AT24C512 von Atmel! > > Das ist derselbe, wie der den du verwendest! > > Ich wei� es nicht an was es liegt, aber wenn die Versorgung getrennt wird, wei� er danach auch keine Daten mehr! > Geht der bei dir einwandfrei? > > Hast du für den ein Routine die geht? > > > Gru� Marcel > > > > > > > AT24V512 kenn ich nicht, was soll das sein? > > > > Ich verwende von Reichelt Elektronik den "ST 24C512 BN6" , der funktioniert einwandfrei. > > > > Gruss > > > > > > > > > > > So, ich habe jetzt die Routine umgeschrieben, dass man Floats auch negativ abspeichern kann! > > > Dabei ist gleich das nächste Problem aufgetreten. > > > > > > Wenn ich etwas abspeichere und dann wieder auslese, scheint es, dass es geht. > > > Wenn ich dann jedoch die Versorgung wegnehme und den Wert auslesen, liefert er 0 zurück. > > > Also einen anderen Wert, wie ich beschieben habe! > > > D.h. es wird nichts gespeichter, da es nach Spannungsversorgung aus und wieder einschalten wieder we ist. > > > > > > Hatte so etwas schon jemand? > > > Hat jemand einen Tipp oder vielleicht eine Routine für den AT24V512???? > > > > > > Gru� Marcel > > > > > > > > > > > > > > > > > Schreibfehler von mir, die pos. floats gehen natürlich bis 65535,xx > > > > Man kann auch neg. Zahlen (Integer) in 2Byte zerlegen, wie kann man nachlesen, habe kein > > > > Programm dazu, geht dann von -32768,xx bis +32767,xx > > > > > > > > Gruss > > > > > > > > > > > > > > > > > > > > > > > > > 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 > > > > > > */ | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum