I2C with 16F628A mystery


Closed Thread
Results 1 to 18 of 18

Hybrid View

  1. #1
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default

    Thank you Peter,

    I understand the first part of your response but not sure about the second part:
    Now the PBP manual states "The Address size sent (byte or word) is determined by the size of the variable that is used. If a byte-sized variable is used for the Address, an 8-bit address is sent. If a word-sized variable is used, a 16-bit address is sent. Be sure to use the proper sized variable for the device you wish to communicate with."

    I suspect this is in fact not correct and looking at the assembler code that PBP generates, in fact I2CWRITE seems to send a word, using I2CAddr, I2CAddr2 as the (word) address in my example, or the case of your code, actually I2CAddr, I2CDevice (=$A0) which is I suspect somewhere other than you intended in memory!
    I will continue to read it over and over, some times it takes me a few times to understand.

    Now again I am running into some mystery and I wish I could understand better...

    If I run this code:
    Code:
    i2cdevice =$A0
    for i2caddr = 0 to 2048 step 16
        i2cwrite d1,d2,i2cdevice,i2caddr,[$01]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$01]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$01]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$3c]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$3c]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$3c]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$3c]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$3c]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$3c]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$08]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$08]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$08]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$21]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$21]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$21]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[$ff]:pause 10
    next
    Then I read the EPROM with Ponyprog and observed everything as expected.
    Name:  pony1.png
Views: 3285
Size:  35.7 KB

    Then I rewrote my code by changing:
    Code:
    for i2caddr = 0 to 2048 step 16
    to
    Code:
    for i2caddr = 0 to 1024 step 16
    and the 3 first line I replaced $01 by $ff.

    I was expecting to see half of the memory filled with my changes but it got filled all the way to address $7FF:
    Name:  pony2.png
Views: 3199
Size:  35.2 KB

    The more I test the more I get confused!

    Mike

  2. #2
    Join Date
    Jun 2005
    Location
    Surrey, England
    Posts
    35


    Did you find this post helpful? Yes | No

    Default

    Actually I was wrong about the Addressing - I hadn't noticed you were using a 24C16 - I normally use larger chips - in fact the 24C16 needs a byte for the address. Unfortunately the addressing you require is a little more complex - the 2K memory is organised in 8 x 256 byte blocks and the A10, A9, A8 are conveyed as the lower 3,2,1 bits of the Control byte, and A7-0 in the Address byte - a rewrite of your addressing is needed!
    Control Byte: 1010XXX0 where XXX are the high order 3 bits of the address
    Address Byte: XXXXXXXX = A7-0
    You will need to create the Control byte for each successive write. Get back to me if you need any more help.
    Peter

  3. #3
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default

    Ok so maybe I need more help.
    There is obviously something I don't understand.

    Looking at the 24CL16 datasheet:
    Name:  24cl16.png
Views: 3271
Size:  23.1 KB

    Based on this I changed the address to word and my understanding is:
    Control byte = 1010 000 0 = $A0
    I want to write $aa at address $400 so I wrote this code:

    Code:
    i2cdevice =$A0
    i2caddr = $400
    
        i2cwrite d1,d2,i2cdevice,i2caddr,[$aa]:pause 10
    I was expecting to see only address $400 showing value $aa but this is the result:
    Name:  pony3.png
Views: 3236
Size:  38.4 KB

    the value $aa is now showing at address $004 and at every next 16 locations all the way to 2048.

    ???

    Mike

  4. #4
    Join Date
    Jun 2005
    Location
    Surrey, England
    Posts
    35


    Did you find this post helpful? Yes | No

    Default

    I suggest you use a data array to send your bytes, and then you need to construct the ControlByte and address as in this example:
    Code:
    Dat         VAR byte[16]
    i           var word
    j           var Byte
    SDA         var PORTA.2
    SCL         VAR PORTA.3
    CntrB       var Byte
    Addr        var byte
        for i = 0 to 15
            lookup i, [$01,$01,$01,$3c,$3c,$3c,$3c,$3c,$3c,$08,$08,$08,$21,$21,$21,$FF], j
            Dat[i] = j
        next
        for i = 0 to $7F0 step 16  'End at 2048-16 = $7F0
            CntrB = %10100000
            CntrB.3 = i.10
            CntrB.2 = i.9
            CntrB.1 = i.8
            Addr = i.lowbyte
            i2cwrite SDA,SCL,CntrB,Addr,[str Dat\16]
            pause 10
        next
    Peter

  5. #5
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default

    ok I have created a new file and inserted your code with some of my code required for access to the EEPROM but when I run this code nothing gets written to the chip.

    This is the complete code:
    Code:
    @ __config _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _LVP_OFF & _CP_OFF
    clear
    DEFINE OSC 4
    TRISB = %00001000           
    CMCON = 7                   ; Disable comparator
    OPTION_REG = 0
    
    Activate    var PORTB.2     ; 1 = access eeprom / 0 = normal operation
    GO          VAR PORTB.3     ; Start switch
    OK          VAR PORTB.4     ; Green LED
    NOTOK       var PORTB.5     ; Red LED
    
    Dat         VAR byte[16]
    i           var word
    j           var Byte
    SDA         var PORTA.2
    SCL         VAR PORTA.3
    CntrB       var Byte
    Addr        var byte
    
    activate = 1
    
    
    
        for i = 0 to 15
            lookup i, [$01,$01,$01,$3c,$3c,$3c,$3c,$3c,$3c,$08,$08,$08,$21,$21,$21,$FF], j
            Dat[i] = j
        next
        for i = 0 to $7F0 step 16  'End at 2048-16 = $7F0
            CntrB = %10100000
            CntrB.3 = i.10
            CntrB.2 = i.9
            CntrB.1 = i.8
            Addr = i.lowbyte
            i2cwrite SDA,SCL,CntrB,Addr,[str Dat\16]
            pause 10
        next
    activate = 0   
    end
    I've been struggling with this almost nonstop for a couple of days and I believe that either I think I am working with a 24LC16 chip and it is not or I have a hardware issue. The EEPROM chip is not visually accessible but my PonyProg application is detecting it as"2416" - Device type "2402-16"
    This is my hardware and I ruled out any discrepancies between my drawing and actual PCB:
    Name:  hw.png
Views: 3624
Size:  19.5 KB

    Thanks for your time,

    Mike

  6. #6
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default

    sorry, Your code did write to the chip, what I did was to zero out the complete memory using this code:
    Code:
    I2CAddr = $0
    I2CDevice = $A0
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
        i2cwrite d1,d2,i2cdevice,i2caddr,[0]:i2caddr = i2caddr + 1:pause 10
    Then I ran your code (as previous post) and I see that it wrote value FF on every 16th location from memory 0 to 2032 as such:
    Name:  pony4.png
Views: 3298
Size:  27.6 KB

    Mike

  7. #7
    Join Date
    Jun 2005
    Location
    Surrey, England
    Posts
    35


    Did you find this post helpful? Yes | No

    Default

    I am not familiar with PonyProg, are you using the SI-Prog baseboard hardware and the I²CBus eeprom adapter - I note that the adaptor does not have any pullup resistors on SDA and SCL and the baseboard does not provide these either - You have implemented the R2/R3 4K7 pullups shown on your schematic, havent you?? I have had many frustrating experiences with I2C Memory chips instantly solved by a pair of pull up resistors.

    Failing this, I dont understand why the memory chip is visually inaccessible, but these results suggest you may not be dealing with a 24C16 chip - other chips may need different addressing.

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