PDA

View Full Version : 12F629 I2C problems



AIW128ProGuy
- 10th November 2004, 23:23
Hi everyone. I am trying to simply interface a 12F629 with an external eeprom (24AA00) using PicBasic Pro's I2CWrite and I2CRead commands. However, it never seems to interface correctly. My circuit looks like this:

.................................................. ................
.................+5V.....1...8.....GND............ ....... 12F629
..................LED.....2...7.....--------------|......
..................LED.....3...6.....----------|....|......
.....+5V-->1k-->.....4...5...................|....|......
.................................................. ...|....|.....
.................GND.....1...8.....+5V.........|.. ..|..... 24AA00
.................GND.....2...7.....GND.........|.. ..|......
.................GND.....3...6.....----------|....|......
.................GND.....4...5.....--------------|......
.................................................. ................

Where SDA Pin7-->Pin5 and SCL Pin6-->Pin6
Also, I have a 4.7k resistor connected from +5V-->Pin6 on the 24AA00 to act as a pullup. Same thing for Pin5 on the 24AA00.

My code is very simple too. It is below:

value var byte
I2CWrite GPIO.0,GPIO.1,$A0,1,[3]
pause 20
I2CRead GPIO.0,GPIO.1,$A1,1,[value]
pause 20
if value=3 then
high 5
else
high 4
endif
End

This will simply write to the eeprom and read back from it. If it reads back the value it wrote, then the LED5 should turn on, if not, the LED4 should turn on. It only ever turns on LED4. I am not sure what the problem is. I have tried many many things, but nothing has worked. Please let me know what your thoughts are. Thankyou very much.



Chris

P.S. - Miscellaneous Information:
Programmer: IC-Prog 1.05C
Fuses: WDT, PWRT, MCLR, BODEN
Bandgap: Default
Oscillator: IntOSC GP4
Adding CMCON=7 doesn't seem to matter
Sending a word instead of a byte doesn't seem to matter

mister_e
- 11th November 2004, 06:17
Try this one and post result



CMCON=7 ;disable internal comparator
TRISIO=0 ;set pins to outputs

LED1 VAR GPIO.5 ;define GP5 as LED1
LED2 VAR GPIO.4 ;define GP4 as LED2

cont var byte ;variable for control word of eeprom
value var byte

cont=$A0 ;control word of eeprom

value=3
I2CWrite GPIO.0,GPIO.1,cont,1,[value]
pause 20
I2CRead GPIO.0,GPIO.1,cont,1,[value]
pause 20
if value=3 then
LED1=1
LED2=0
else
LED2=1
LED1=0
endif
End


regards

AIW128ProGuy
- 11th November 2004, 18:40
Hi Steve, Good news. I tried your program and it works! I guess it just wanted me to use variables instead of hard coding the I2C statements. Or, maybe I just needed to add the TRISIO to set the pins as outputs. There is a weird anomaly going on though. Most of the time when I power it on, other leds flash on for a second then are off. To debug this, I put a pause right under the TRISIO statement. The leds stayed on much longer, then started dropping out one by one. Also, if I have GPIO.0 and GPIO.1 connected to a led, as well as the SDA and SCL lines, the program doesn't work. Any ideas on this? Other than that, the program works great!


Thanks for your help.
Chris

mister_e
- 11th November 2004, 23:41
> I tried your program and it works! I guess it just wanted me to use variables instead of hard coding the I2C statements. Or, maybe I just needed to add the TRISIO to set the pins as outputs. There is a weird anomaly going on though. Most of the time when I power it on, other leds flash on for a second then are off.

For sure you must use variable in I2Cread/I2Cwrite statement. It's always safe to assign pin to TRIS statement. Looks in some case on 12Fxxx, if you don't set TRISIO, the output don't work properly .


> There is a weird anomaly going on though. Most of the time when I power it on, other leds flash on for a second then are off.

it can be safe to set LED output on a specific state at the begining.

GPIO.0=0
GPIO.1=0
GPIO......

Be sure to pull down/up unsused pin with resistor <10K. Also i see often an noisy PSU who screw the PIC when starting. Safe if you add 0.1uF + 10uF (tantal or 47uF electrolytic)


>Also, if I have GPIO.0 and GPIO.1 connected to a led, as well as the SDA and SCL lines, the program doesn't work. Any ideas on this? Other than that,

Do you place led to monitor pins of EEPROM? in this case it's absolutely normal, EEPROM may not provide enough current to drive/sink LED.

regards