PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] EEPROM 24LC16 schneller Schreiben mit ACKNOWLEDGE POLLING



26.11.2004, 10:25
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

edgar
27.11.2004, 11:54
poste doch mal deinen programmcode

30.11.2004, 08:59
'----------[ 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

30.11.2004, 12:42
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??

edgar
30.11.2004, 12:44
also das mit dem automatisch ins forum einloggen funktioniert wohl auch nicht so richtig ich schreib immer als gast :(
gruß Werner...

01.12.2004, 11:14
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.

edgar
01.12.2004, 12:11
danke für den Tipp.
Leider bleibt die Routine damit am Anfang hängen,


ich glaub ich hab was vergessen klar bleibts hängen..
probiers mal so:



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


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.
gruß werner...

01.12.2004, 17:30
Es klappt ! O:)

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:


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

edgar
01.12.2004, 19:23
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...

02.12.2004, 09:00
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...



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.