I am having some difficulty understanding the results I am getting, maybe it is due to something simple but I've been trying to figure it out for the past few hours.
I am using 16F628A reading and writing to 24LC16 and displaying results on LCD.
I am also using another application called PonyProg to read/write to my same EEPROM.
So here is the story;
I write to the 2416 these values:
then I read back the values and display on the LCD in this way:Code: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
Now I am expecting to get errchk = 741 but I get 716.Code:i2caddr = 0 i2cread d1,d2,i2cdevice,i2caddr,[dat[0],dat[1],dat[2],dat[3],dat[4],dat[5],dat[6],dat[7],dat[8],dat[9],dat[10],dat[11],dat[12],dat[13],dat[14],dat[15]] pause 10 errchk = 0 for i = 0 to 15 errchk = errchk + dat[i] next LCDOUT $FE,1 lcdout $FE,$80,dec errchk: pause 3000
I cycled through each value after the addition within the loop and the last number to add up is 230 although the value I wrote was $FF = 255
Furthermore if I display on the LCD all values I see this:
1113c3c3c3c3c
3c888212121cc
but $cc = 204
Reading the content of 2416 with PonyProg shows properly:
01 01 01 3c 3c 3c 3c 3c 3c 08 08 08 21 21 21 ff
My code is not cleaned up because I was trying different ways but I always get to the same results I tried changing dat[] to word instead of byte but all the data gets messed up on the 2416.
Thanks for any help.Code:@ __config _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _LVP_OFF & _CP_OFF clear DEFINE OSC 4 TRISB = 0 ' Make PORTB all outputs CMCON = 7 ' Disable comparator Dat VAR byte[15] I var byte D1 var PORTA.2 D2 VAR PORTA.3 I2CAddr Var byte I2CDevice var byte ERRchk var word OK VAR PORTA.4 ;NOTOK var PORTA.5 ERRStatus var bit LCD_DB4 VAR PORTB.7 ' Set port for 4 bits bus LCD_DB5 VAR PORTB.6 LCD_DB6 VAR PORTB.5 LCD_DB7 VAR PORTB.4 LCD_RS VAR PORTB.0 ' Set RS bit port LCD_E VAR PORTB.1 ' Set Enable bit port LCD_Lines CON 2 ' # of Lines on LCD, 1 or 2 (Note: use 2 for 4 lines) LCD_DATAUS CON 50 ' Data delay time in us LCD_COMMANDUS CON 2000 ' Command delay time in us INCLUDE "LCD_AnyPin.pbp" ' Must go after LCD initialization Pause 500: LCDOUT $FE,1: pause 250 ' clear screen and relax Start: i2cdevice =160 LCDOUT $FE,$80,"Start" pause 500 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 i2caddr = 0 i2cread d1,d2,i2cdevice,i2caddr,[dat[0],dat[1],dat[2],dat[3],dat[4],dat[5],dat[6],dat[7],dat[8],dat[9],dat[10],dat[11],dat[12],dat[13],dat[14],dat[15]] pause 10 errchk = 0 for i = 0 to 15 errchk = errchk + dat[i] next LCDOUT $FE,1 lcdout $FE,$80,dec errchk: pause 3000 if errchk = 741 then ERRStatus = 0 i2caddr = 2032 i2cread d1,d2,i2cdevice,i2caddr,[dat[0],dat[1],dat[2],dat[3],dat[4],dat[5],dat[6],dat[7],dat[8],dat[9],dat[10],dat[11],dat[12],dat[13],dat[14],dat[15]] pause 10 Errchk = 0 for i = 0 to 15 errchk = errchk + dat[i] ; LCDOUT $FE,1 ; lcdout $FE,$80,dec ERRCHK: pause 2000 next if errchk = 741 and errstatus = 0 then high ok pause 10000 low ok else lcdout $FE,$C0,dec ERRCHK LCDOUT $FE,$80,hex dat[0],hex dat[1],hex dat[2],hex dat[3],hex dat[4],hex dat[5],hex dat[6],hex dat[7] LCDOUT $FE,$C0,hex dat[8],hex dat[9],hex dat[10],hex dat[11],hex dat[12],hex dat[13],hex dat[14],hex dat[15] endif END
Mike







Bookmarks