View previous topic :: View next topic |
Author |
Message |
EKREMhbx
Joined: 06 Jun 2005 Posts: 27
|
Posted: Thu Oct 20, 2005 2:02 pm Post subject: STRING AND 24C256 EEPROM |
|
|
HELLO
Dim data1 as string *7
data1 = "ekremhb"
How I can write this data1 string to 24c256 eeprom and
how I can read this string from 24c256 eeprom
regards |
|
Back to top |
|
|
DJD XTREEM
Joined: 24 Jun 2004 Posts: 190 Location: 127.0.0.1
|
Posted: Thu Oct 20, 2005 9:38 pm Post subject: |
|
|
Well i geuss that the eeprom is an I²C type?
I'm intressted too in this one.. Need some extra memory in short terms.. _________________ Bascom AVR 1.11.8.8 full version
STK500 Programmer
ISP Programmer |
|
Back to top |
|
|
Funci
Joined: 03 Aug 2005 Posts: 58 Location: CRO
|
Posted: Thu Oct 20, 2005 10:14 pm Post subject: |
|
|
Hi
I have experience with Bascom 8051 and EEPROM's, but I am thinking that principles aer the same and with Bascom AVR.
When you are saving string in EEPROM you must brake it:
"ekremhb" --> "e" + "k" + "r" + "e" + "m" + "b" + "h"
and save this single string on diferent places in EEPROM!
For example:
"e" --> on adress "100"
"k" --> on adress "101"
.
.
.
"h" --> on adress "106"
So, it's very important to know where you are puting this strings for taking them back from EEPROM!
I am hoping that this will helps you |
|
Back to top |
|
|
DToolan
Joined: 14 Aug 2004 Posts: 1384 Location: Dallas / Fort Worth, Texas (USA)
|
Posted: Thu Oct 20, 2005 11:15 pm Post subject: |
|
|
Look at I2CSend in the html help file. Since I2CSend doesn't deal with strings, you can work around that like so...
Code: | Dim Data1 As String * 7
Data1 = "ekremhb"
Dim DataArray(7) As Byte at Data1 Overlay
Dim X As Byte
Dim Y As Byte
Const Slave = &HA0
Y = Len(Data1)
For X = 1 To Y
I2CSend Slave, DataArray(X)
Next X |
There is a lot more to it than this though. As Funci points out, you have to know what address within the chip you want to write to and later, what address within the chip you want to retrieve from.
The procedure for accessing (writing or reading) the 24C256 is as follows...
1. I2C start
2. Send the device write address
3. Send the high byte of the address within the device you wish to write or read
4. Send the low byte of the address within the device you wish to write or read
5. If reading, I2C re-start and then the device read address... else, send data.
6. When done, I2C stop |
|
Back to top |
|
|
EKREMhbx
Joined: 06 Jun 2005 Posts: 27
|
Posted: Sat Oct 22, 2005 5:19 pm Post subject: string and 24c256 |
|
|
thank you for all
inetereting
Iam using ds1307 and 24c256 same port pin
so can write string and then read back whit I2Csend command
regards |
|
Back to top |
|
|
EKREMhbx
Joined: 06 Jun 2005 Posts: 27
|
Posted: Sun Oct 23, 2005 8:54 am Post subject: data write and read + 24c256 |
|
|
I thing I2csend and receive command is not support 24c256 eeprom
so,
I want write 1.st data address 1000 and 2.nd data write address 1001 ,
3.data write address 1002 ,,,,1003,1004 ,1005 and go
How I can write program procedure for I2cread and I2c write command
for big address write to 24c256.
because I2c write command is need two line address address hi and
address lo
regards |
|
Back to top |
|
|
Funci
Joined: 03 Aug 2005 Posts: 58 Location: CRO
|
Posted: Sun Oct 23, 2005 10:12 pm Post subject: |
|
|
Hi Ekrem
This is good question! I don't have experience with EEPROM's larger than 24C16, but I am thinking that D'Toolan will give some answer!
D'Toolan? |
|
Back to top |
|
|
bzijlstra
Joined: 30 Dec 2004 Posts: 1179 Location: Tilburg - Netherlands
|
Posted: Mon Oct 24, 2005 8:29 pm Post subject: I2c commands and 24LC256 |
|
|
Where I found it I don't know, but I use these routines to write to a 24LC256 EEPROM.
'24LC256
Dim E_ah As Byte
Dim E_al As Byte
Dim E_addr As Word
Dim E_dat As Byte
Dim Dat As Byte
'24lc256
Declare Sub E_write(byval E_addr As Word , Dat As Byte)
Declare Sub E_read(byval E_addr As Word , E_dat As Byte)
Declare Sub 24lc256_test
call 24lc256_test
end
' Routine to test the 24LC256
'
Sub 24lc256_test
'Test read and writes
Print "Testing I2C Eeprom"
Dat = 0
For E_addr = &H1000 To &H1010
Call E_write(e_addr , Dat)
Call E_read(e_addr , E_dat)
Print E_dat ; " ";
Incr Dat
Incr Dat
Incr Dat ' +1 +1 +1
Next E_addr
Print
Print "Here a counter should appear from 0, 3, 6, 9, 12, 15, 18, 21, 24, 27 etc."
Print "End of Test"
End Sub
' Routine to write the 24LC256
'
Sub E_write(byval E_addr As Word , Dat As Byte)
E_ah = High(e_addr)
E_al = Low(e_addr)
I2cstart
I2cwbyte E_ctlw
I2cwbyte E_ah
I2cwbyte E_al
I2cwbyte Dat
I2cstop
Waitms 10
End Sub
' Routine to read the 24LC256
'
Sub E_read(byval E_addr As Word , E_dat As Byte)
E_ah = High(e_addr)
E_al = Low(e_addr)
I2cstart
I2cwbyte E_ctlw
I2cwbyte E_ah
I2cwbyte E_al
I2cstart
I2cwbyte E_ctlr
I2crbyte E_dat , Nack
I2cstop '
End Sub
--
Have fun
Ben Zijlstra
http://members.home.nl/bzijlstra |
|
Back to top |
|
|
DToolan
Joined: 14 Aug 2004 Posts: 1384 Location: Dallas / Fort Worth, Texas (USA)
|
Posted: Tue Oct 25, 2005 10:27 pm Post subject: |
|
|
There are some "gotcha's" when working with serial eeproms that you should be aware of. Most have some sort of default "page size". The "page size" for a 24C256 is 64 bytes.
If you write to your eeprom one byte at a time (byte mode), you will notice no problems, although, you must wait 10ms between each write operation and/or a write (wait 10ms) then a read operation. Basically, the write cycle time for a byte is 10ms. The eeprom will not respond to an I2C attempt until any write cycle is complete. An example of byte mode writing might be...
1. I2C start
2. Send the device write address
3. Send the high byte of the address within the device you wish to write
4. Send the low byte of the address within the device you wish to write
5. send a byte of data
6. I2C stop
7. Wait 10ms before repeating or before reading
Page mode writing is where you send the device an address (where within the chip you'd like to write) once, and then send multiple bytes of data. An example of page mode writing might be...
1. I2C start
2. Send the device write address
3. Send the high byte of the address within the device you wish to write
4. Send the low byte of the address within the device you wish to write
5. Send multiple bytes of data
6. When done, I2C stop
7. Wait 10ms before repeating or before reading
Problems can arise when you try writing in "Page Mode" (multiple bytes in one session) but you cross a page boundry. For simplicity sake, I am going to use a 24LC16 as an example. The 24LC16 page size is 16 bytes.
1. I2C start
2. Send the device write address
3. Send the address within the device you wish to write (&H00)
For X = 0 TO 17
5. Send data byte (X)
Next X
6. When done, I2C stop
7. Wait 10ms before repeating or before reading
The example above sent 18 bytes of data (values 0 through 17) to be written into locations 0 through 17 of the eeprom. The result of this attempt would be the following...
Code: | Address Data
00 16
01 17
02 02
03 03
04 04
'continues in order...
14 14
15 15
16 FF
17 FF
18 FF
etc... |
As you can see... the eeprom's internal address counter wrapped around when it hit a page boundry. The data you wanted in locations 16 and 17 ended up in locations 0 and 1. If you plan to write data in "Page Mode" (multiple bytes at once), you must be wary of where the page boundries are and not cross them without pre-planning. |
|
Back to top |
|
|
Funci
Joined: 03 Aug 2005 Posts: 58 Location: CRO
|
Posted: Tue Oct 25, 2005 11:40 pm Post subject: |
|
|
Yes, I am forget "page size"!
That is important to know when you are sending data to EEPROM with DO-LOOP and FOR-NEXT routines!
So, you must very precisiusly plan how you will send large amout of date into EEPROM. |
|
Back to top |
|
|
|