So your Hardware is OK.
There must be something wrong with your code.
So your Hardware is OK.
There must be something wrong with your code.
regards
Ralph
_______________________________________________
There are only 10 types of people:
Those who understand binary, and those who don't ...
_______________________________________________
Hmm.. I am keeping trying to unravel this -- I have a version of your program, but it won't compile.. Can you tell my why I have a 'bad expression'??? It says the I2Cwrite, I2Cread commands are wrong.. I cannot for the life of me make them compile - defining X as a word, byte, whatever..
TG
'on my DataLoggers I have 16F876 or 18F252 and 2x 24LC512.
'The following code is tested.
'could you give it a try and let us know what the result was?
' -----[ Fuses ]------------------------------------------------
@ __CONFIG _CONFIG1H, _OSC_INTIO67_1H
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & 0bfh ;_XINST_OFF_4L
'
' -----[ Includes/Defines ]---------------------------------------------------------
include "modedefs.bas" 'include serout defines
OSCCON=%01111000
DEFINE OSC 8
While OSCCON.2=0:Wend
SCL var PortC.3 ' I2C Clock
SDA var PortC.4 ' I2C Data
ROM0 con %10100000 ' address of chip1
ADDR VAR word ' ROM Location
portout var PortC.6
portin var PortC.7
Mode con 16572 ' 4800 Baud 8N1 for Monitor Port
Test var byte[21] ' Test Array
I2Cdelay con 10 ' Delay after I2Cwrite
Temp var byte
X var byte
dta var byte
CLEAR
loop:
SEROUT2 portout,Mode,[13,10,"** MCU started",13,10,13,10]
serout2 portout, mode, ["enter 1 to write data, 2 to read it"]
serin2 portin, mode, [DEC temp]
select case temp
case 1
for X = 0 to 256
I2Cwrite SDA, SCL,ROMO,X,[X],failw
pause 10
next x
case 2
for x = 0 to 256
I2Cread SDA,SCL,ROMO,X,[X],failr
Serout2 portout, mode, ["Address: ",#addr," Data:",#dta]
pause 100
next x
end select
goto loop:
failr:
serout2 portout, mode,["failure to read",10,13]
return
failw:
serout2 portout, mode,["failure to write",10,13]
return
END
... ahem nevermind.. I was using ROMO instead of ROM0... shortened it to ROM so I could not make that mistake, and it works.
NOW I have a program that tests memory.. and the use of WORD or BYTE.. This will read or write to memory. VERY odd behavour tho, leading me to think I am missing some key understanding:
I write 0-640 to memory 0-640.. When I read it back I get REALLY odd stuff... NOT 0-640:
'on my DataLoggers I have 16F876 or 18F252 and 2x 24LC512.
'The following code is tested.
'could you give it a try and let us know what the result was?
' -----[ Fuses ]------------------------------------------------
@ __CONFIG _CONFIG1H, _OSC_INTIO67_1H
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & 0bfh ;_XINST_OFF_4L
'
' -----[ Includes/Defines ]---------------------------------------------------------
include "modedefs.bas" 'include serout defines
OSCCON=%01111000
DEFINE OSC 8
While OSCCON.2=0:Wend
SCL var PortC.3 ' I2C Clock
SDA var PortC.4 ' I2C Data
ROM con %10100000 ' address of chip1
ADDR VAR word ' ROM Location
portout var PortC.6
portin var PortC.7
Mode con 16572 ' 4800 Baud 8N1 for Monitor Port
Test var byte[21] ' Test Array
I2Cdelay con 10 ' Delay after I2Cwrite
Temp var byte
X var word
dta var word
CLEAR
Addr=100
loop:
SEROUT2 portout,Mode,[13,10,"** MCU started",13,10,13,10]
serout2 portout, mode, ["enter 1 to write data, 2 to read it"]
serin2 portin, mode, [DEC1 temp]
select case temp
case 1
for X = 0 to 640
I2Cwrite SDA, SCL,ROM,X,[X],failw
Serout2 portout, mode, ["Write Address: ",#x," Data:",#X,10,13]
pause 10
next x
case 2
for x = 0 to 640
I2Cread SDA,SCL,ROM,X,[dta.byte0],failr
I2Cread SDA,SCL,ROM,X+1,[dta.byte1],failr
Serout2 portout, mode, ["Address: ",#x," Data:",#dta,10,13]
pause 10
next x
case else
goto loop
end select
goto loop:
failr:
serout2 portout, mode,["failure to read",10,13]
return
failw:
serout2 portout, mode,["failure to write",10,13]
return
END
OK, I am drained.. here is the last program. I have been experimenting with BYTE and WORD and notice they make the memory behaviour REALLY different.. In any event, I have noticed:
1. I can WRITE from 0-640 to memory
2. When I READ this back, it is all '0's..
3. When I ERASE it ($FFFF), and read it back it is all 65355..
I THINK somehow I am writing PAGES using the [x] brackets..(???) I want to write to SPECFIC memory locations.. but can't figure out the syntax for that. maybe that is why the data is all messed up? So I tried putting it in increments of 128.. still reading back '0'..
Anyway - here is the sample program that lets you write, read and erase from an external 24LC512... and get back zeros..
TG
------------------------
'on my DataLoggers I have 16F876 or 18F252 and 2x 24LC512.
'The following code is tested.
'could you give it a try and let us know what the result was?
' -----[ Fuses ]------------------------------------------------
@ __CONFIG _CONFIG1H, _OSC_INTIO67_1H
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & 0bfh ;_XINST_OFF_4L
'
' -----[ Includes/Defines ]---------------------------------------------------------
include "modedefs.bas" 'include serout defines
OSCCON=%01111000
DEFINE OSC 8
While OSCCON.2=0:Wend
SCL var PortC.3 ' I2C Clock
SDA var PortC.4 ' I2C Data
ROM con %10100000 ' address of chip1
ADDR VAR word ' ROM Location
portout var PortC.6
portin var PortC.7
Mode con 16468 ' 4800 Baud 8N1 for Monitor Port
Test var byte[21] ' Test Array
I2Cdelay con 10 ' Delay after I2Cwrite
Temp var byte
X var word
dta var word
CLEAR
Addr=100
loop:
SEROUT2 portout,Mode,[13,10,"** MCU started",13,10,13,10]
serout2 portout, mode, ["enter 1 to write data, 2 to read it, 3 to erase"]
serin2 portin, mode, [DEC1 temp]
select case temp
case 1
for X = 0 to 640 step 128
I2Cwrite SDA, SCL,ROM,X,[X],failw
Serout2 portout, mode, ["Read Address: ",#X," Data:",#X,10,13]
pause 10
next x
case 2
for x = 0 to 640 step 128
I2Cread SDA,SCL,ROM,X,dta,failr
Serout2 portout, mode, ["Read Address: ",#X," Data:",#dta,10,13]
next x
Case 3
for x = 0 to 640 step 128
I2Cwrite SDA,SCL,ROM,X,[$FFFF],failw
Serout2 portout, mode,["Erasing Address: ",#X," Data:",$FFFF,10,13]
pause 10
next x
case else
goto loop
end select
goto loop:
failr:
serout2 portout, mode,["failure to read",10,13]
return
failw:
serout2 portout, mode,["failure to write",10,13]
return
END
Tom,
your code works as designed.
In the FOR...NEXT loop to write the eeprom you are counting from 0 to 640.
X is a WORD size variable and being used as EEPROM address as well as value to be written.
This means you are writing a WORD (two BYTES) to the EEPROM.
This requires two BYTE locations in your EEPROM.
By incrementing the address counter by 1 the LowByte of the last WORD written will always be overwritten with the HighByte oft the current WORD.
here is a working example:
Code:for X = 0 to 640 I2Cwrite SDA, SCL,ROM,X*2,[x] pause 10 Serout2 portout, mode, ["Write Address: ",#x*2," Data:",#x,10,13] dta=dta+1 next x for x = 0 to 640 I2Cread SDA,SCL,ROM,X*2,[dta] Serout2 portout, mode, ["Address: ",#x*2," Data:",#dta,10,13] pause 100 next x
regards
Ralph
_______________________________________________
There are only 10 types of people:
Those who understand binary, and those who don't ...
_______________________________________________
Thanks! That makes sense, and the program now pulls it right - partially. I have a routine (below)
1. writes data
2. reads data
3. erases data
4. reads a specific location in memory
problem is this - When I READ, I get for example "1" stored in location "2".. this makes sense.
BUT when I read from a specific location using a lookup, it returns a totally different value.. Example:
Enter 1 to write data, 2 to read it, 3 to erase, 4 to select -> "4"
Enter the memory location you want (000-255) - > "002"
Reading: 2 Data stored there: 21332
I'd expect the "002" memory location to match the one above and return a "1".. instead I get "21332"... Something is wrong with my DEC3 collection?
Thanks for helping me understand how these words/byte, etc equate to memory space.
Tom
- Updated CODE ------------------------------------------------------
'on my DataLoggers I have 16F876 or 18F252 and 2x 24LC512.
'The following code is tested.
'could you give it a try and let us know what the result was?
' -----[ Fuses ]------------------------------------------------
@ __CONFIG _CONFIG1H, _OSC_INTIO67_1H
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & 0bfh ;_XINST_OFF_4L
'
' -----[ Includes/Defines ]---------------------------------------------------------
include "modedefs.bas" 'include serout defines
OSCCON=%01111000
DEFINE OSC 8
While OSCCON.2=0:Wend
SCL var PortC.3 ' I2C Clock
SDA var PortC.4 ' I2C Data
ROM con %10100000 ' address of chip1
ADDR VAR word ' ROM Location
portout var PortC.6
portin var PortC.7
Mode con 16468 ' 4800 Baud 8N1 for Monitor Port
I2Cdelay con 10 ' Delay after I2Cwrite
Temp var byte
X var word
dta var word
stuff var word ' Test Array
CLEAR
Addr=100
loop:
SEROUT2 portout,Mode,[13,10,"** MCU started",13,10,13,10]
serout2 portout, mode, ["Enter 1 to write data, 2 to read it, 3 to erase, 4 to select",10,13]
serin2 portin, mode, [DEC1 temp]
select case temp
case 1
for X = 0 to 128
I2Cwrite SDA, SCL,ROM,X*2,[X],failw
pause 10
Serout2 portout, mode, ["write Address: ",#X*2," Data:",#X,10,13]
next x
case 2
for x = 0 to 128
I2Cread SDA,SCL,ROM,X*2,[dta],failr
Serout2 portout, mode, ["Read Address: ",#X*2," Data:",#dta,10,13]
next x
Case 3
for x = 0 to 128
I2Cwrite SDA,SCL,ROM,X*2,[x],failw
Serout2 portout, mode,["Erasing Address: ",#X*2," Data:",$FFFF,10,13]
pause 10
next x
Case 4
Serout2 portout, mode,["Enter the memory location you want (000-255)",10,13]
serin2 portin, mode, [DEC3 temp]
I2Cread SDA,SCL,ROM,temp,[stuff],failr
Serout2 portout, mode,["Reading: ",#temp," Data stored there: ",#stuff,10,13]
pause 10
case else
goto loop
end select
goto loop:
failr:
serout2 portout, mode,["failure to read",10,13]
return
failw:
serout2 portout, mode,["failure to write",10,13]
return
END
Tom,
in this example you are using the BYTE size variable "Temp" as address.Code:Temp var byte I2Cread SDA,SCL,ROM,temp,[stuff],failr
Do you remember that the 25LC512 requires a WORD size variable as address ;-)
regards
Ralph
_______________________________________________
There are only 10 types of people:
Those who understand binary, and those who don't ...
_______________________________________________
Bookmarks