poste doch mal deinen programmcode
Hallo,
meine Routine verwendet eine Wartezeit von 10ms nach dem Schreiben, um sicherzustellen, dass das EEPROM das Byte geschrieben hat.
Dies funktioniert gut, nur dauert es mir zu lange (2048 Byte * 10ms).
Ich möchte nun diese Zeit durch das im Datenblatt beschriebene ACKNOWLEDGE POLLING verkürzen.
Hat jemand eine Idee, wie das mit Bascom geht ?
(z.B. ACKNOWLEDGE vom 24LC16 lesen).
- AVR Mega8, 8MHz int. RC Oszi
- Bascom Compiler Vollversion
Gruss
poste doch mal deinen programmcode
Code:'----------[ I2C EEPROM Schreib Routine ]--------------------------------------- Sub Write_eeprom(byval Adresse As Byte , Byval Block As Byte , Byval Wert As Byte) I2cstart 'start condition Waitms 1 24c16_w = Block * 2 ' Blockstart im EEPROM 24c16_w = 24c16_w + &B1010_0000 ' + Bausteinadresse I2cwbyte 24c16_w ' Bausteinadresse Waitms 1 I2cwbyte Adresse ' Adresse im IC Waitms 1 I2cwbyte Wert ' Byte schreiben Waitms 1 I2cstop ' Stopbedingung Waitms 10 ' int. Schreibzeit abwarten End Sub
probiers doch mal so, weiß zwar nicht ob das so richtig ist, sollte aber gehen. vielleicht weiß jemand anderes noch wie man das besser machen kann. wenn der schreibvorgang noch nicht fertig ist reagiert der baustein nicht auf seine adresse...
kannst ja auch mal die sache mit page write probieren das sollte das ganze nochmal ein bischen beschleunigen - und gib mir dann bescheid wie das funktioniert mit page write ich habs nämlich noch nicht hinbekommen.
nochmal:
Err =0
I2cstart
I2cwbyte 24c16_w
If Err = 1 Then
goto nochmal
end if
I2cwbyte 24c16_w
I2cwbyte Adresse
I2cwbyte Wert
I2cstop
ps. wie kann man eigentlich das als programmcode posten??
also das mit dem automatisch ins forum einloggen funktioniert wohl auch nicht so richtig ich schreib immer als gast
gruß Werner...
danke für den Tipp.
Leider bleibt die Routine damit am Anfang hängen,
das ACk wird nicht erkannt.
Ich werde mir Messequipment besorgen, mit dem
ich (hoffentlich) das ACK vom EEPROM messen kann.
Pagewrite bringt sicherlich auch nochmal was,
allerdings muss ich da meine anderen Routinen anpassen.
PS : den Programmcode habe ich mit der Formatierung
"CODE" eingefügt.
ich glaub ich hab was vergessen klar bleibts hängen..Zitat von Anonymous
probiers mal so:
eventuell kannst auch das erste wait weglassen beim 2ten kommts auf dein eprom an bzw. die länge des wait ist auch unterschiedlich bei den eproms.Code:nochmal: Err =0 I2cstart I2cwbyte 24c16_w If Err = 1 Then waitus 10 i2cstop waitus 10 goto nochmal end if I2cwbyte 24c16_w I2cwbyte Adresse I2cwbyte Wert I2cstop
gruß werner...
Es klappt !
Der Test dauert jetzt 6 Sek statt 25 Sek.
Ich hatte noch ein Hardware-Problem, zwei in SCL und SDA eingefügte
ESD-Schutzbauelemente haben mit ihrer Kapazität die Flanken zu stark
verschliffen.
Nachfolgend der Code:
Code:Sub Write_eeprom_ack(byval Adresse As Byte , Byval Block As Byte , Byval Wert As Byte) 24c16_w = Block * 2 ' Blockstart im EEPROM 24c16_w = 24c16_w + &B1010_0000 ' + Bausteinadresse Nochmal: Err = 0 ' allg. Fehlervar. auf Null I2cstart ' I2C Start I2cwbyte 24c16_w ' "Device Adres Word" If Err = 1 Then Waitus 1 ' Bus free time Goto Nochmal End If I2cwbyte Adresse ' Adresse im Block I2cwbyte Wert I2cstop ' I2C Stopp End Sub
um einen wert zu schreiben 6 sek? das is lang.
würde mich jetzt nur noch interessieren wie das mit block write geht hat das schon jemand Erfahrungen?
gruß Werner...
Der ganze Test, also 2048 Byte schreiben, lesen und vergleichen, dauert jetzt 6 Sek mit ACK Polling statt 25 Sek mit fester Wartezeit von 10ms nach dem Schreiben.Verfasst am: 01.12.2004, 19:23 Titel:
--------------------------------------------------------------------------------
um einen wert zu schreiben 6 sek? das is lang.
würde mich jetzt nur noch interessieren wie das mit block write geht hat das schon jemand Erfahrungen?
gruß Werner...
Lesezeichen