Using EEPROM to store variables...


Closed Thread
Results 1 to 22 of 22

Hybrid View

  1. #1
    Join Date
    Feb 2005
    Location
    Bellevue
    Posts
    125


    Did you find this post helpful? Yes | No

    Question

    ... 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

  2. #2
    Join Date
    Feb 2005
    Location
    Bellevue
    Posts
    125


    Did you find this post helpful? Yes | No

    Default

    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

  3. #3
    Join Date
    Feb 2004
    Location
    Germany
    Posts
    762


    Did you find this post helpful? Yes | No

    Default

    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 ...
    _______________________________________________



  4. #4
    Join Date
    Feb 2005
    Location
    Bellevue
    Posts
    125


    Did you find this post helpful? Yes | No

    Thumbs up

    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

  5. #5
    Join Date
    Feb 2004
    Location
    Germany
    Posts
    762


    Did you find this post helpful? Yes | No

    Default

    Tom,

    Code:
    Temp var byte
    I2Cread SDA,SCL,ROM,temp,[stuff],failr
    in this example you are using the BYTE size variable "Temp" as address.

    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 ...
    _______________________________________________



  6. #6
    Join Date
    Feb 2005
    Location
    Bellevue
    Posts
    125


    Did you find this post helpful? Yes | No

    Default

    Argghh! Thanks very much.. I am sure that will make a difference.

    Had a question also about the notion of Page Write vs Byte Write. I notice in the data sheets that the chip does either one.

    For some reason I though the use of [ ] indicated a page write, and ( ) was for a byte write, but that does not seem to hold up. So -

    How do you tell the memory to do a Byte write vs a Page write? In my program I am writing a STR FOO\XXX - and am incrementing the counter by 128, assuming this is approximating a page write. It seems to be.

    However, when I just want to write values like:

    "1" - needing only a 'byte' sized space..

    or

    "16472" - needing a 'word' sized space no doubt...

    to specific memory locations, I'd assume I'd be writing these a byte or a word at a time.. How do we tell the program to write a Byte vs a Page?

    Then, to get the data back out - I am OK on how to get a byte out, but for a word, i'd need to read the memory location, and memory location +1, reading the lowbyte and highbyte, correct? In this example, I need to retrieve "16472" which is more than a byte.


    Tom

  7. #7
    Join Date
    Feb 2004
    Location
    Germany
    Posts
    762


    Did you find this post helpful? Yes | No

    Default

    Then, to get the data back out - I am OK on how to get a byte out, but for a word, i'd need to read the memory location, and memory location +1, reading the lowbyte and highbyte, correct? In this example, I need to retrieve "16472" which is more than a byte.
    Tom,

    looks like you are getting lost with bits, bytes and words.

    you should take a break, have a cup of coffee or tea, and look at my last code example, it does read and write a word at a time.
    regards

    Ralph

    _______________________________________________
    There are only 10 types of people:
    Those who understand binary, and those who don't ...
    _______________________________________________



Similar Threads

  1. Can't read sequential addresses in external EEPROM
    By tjkelly in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 18th February 2010, 14:46
  2. Problem with I2C EEPROM addressing
    By Atom058 in forum General
    Replies: 14
    Last Post: - 3rd November 2009, 03:17
  3. How to write/read strings EEPROM/LCD
    By g-hoot in forum mel PIC BASIC Pro
    Replies: 22
    Last Post: - 11th February 2007, 06:26
  4. eeprom how many data can store
    By DragonBall_6 in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 5th December 2006, 11:39
  5. word variable to 25lc640
    By TONIGALEA in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 6th July 2004, 19:59

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts