|
|
View previous topic :: View next topic |
Author |
Message |
Guest
|
Need help to understand include file |
Posted: Sat Oct 15, 2005 9:37 am |
|
|
I want to read data from a 24LC128. I'm using the include file 24128.
My code hangs in my for loop:
Also, after reading data sheet and lots of other people's code here, I don't understand where in the include file the contents of the address are advanced.
-I thought a pointer would be needed here?
-I also don't understand why shifting 5 (not 4, not 8) bits?
-Also can someone tell me what significance is this number - #define EEPROM_SIZE 16384
-What controls the timing of the eeprom?
The following is an excerpt from the include file 24128- where do the contents of the address advance?
Code: | byte read_ext_eeprom(long int address) {
byte data;
i2c_start();
i2c_write(((0xa0)|(hi(address)>>5))&0xfe);
i2c_write(hi(address)&0x3f);
i2c_write(address);
i2c_start();
i2c_write((0xa1)|(hi(address)>>5));
data=i2c_read(0);
i2c_stop();
return(data);
} |
And here's my code where it hangs in the for loop, just after the LED blinks. I only need to read a long file from the memory, only writing to send control bits. ps. I can't access a scope until Monday.
Code: | #include <16F877.H>
#fuses HS,NOWDT,NOPROTECT, PUT, BROWNOUT, NOLVP // changed to HS for 20 mHz
#use delay(clock=20000000) // adjust for resonator frequency
#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3) // set up options (pic is master + pinouts)
#include <LCD_16f877A.c>
#use standard_io(c)
#use fast_io(a)
#include <24128.c>
//test eeprom
int hex, i;
int test;
long int address;
main()
{
lcd_init();
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
disable_interrupts(global);
init_ext_eeprom();
i2c_start(); // built in function to start
output_high (PIN_A0); // test
output_low (PIN_A0); // test
i2c_write(0xA1); // send control byte to eeprom 'read'
i2c_start(); // restart to read
for (i=0; i<50; i++) // this loop = # bytes in hex file "hex"
{
hex = read_ext_eeprom(0x00); //what I think I am doing here is reading the contents of the eeprom starting at address 0000
output_high (PIN_A0); // init test
printf(lcd_putc,"\feeprom", hex); // test LCD
output_low (PIN_A0); // LED off
}
} |
Any help/advice thank you!
SophE |
|
|
Ttelmah Guest
|
|
Posted: Sat Oct 15, 2005 10:05 am |
|
|
If you want the address to 'advance', _you_ advance it. The driver just accesses the specified address.
You don't need to access the I2C controls themselves. Just use the read routine on it's own. It already sends the address, and starts/stops the transaction.
So:
Code: |
for (i=0; i<50; i++) // this loop = # bytes in hex file "hex"
{
hex = read_ext_eeprom(i); //read from address 'i'
output_high (PIN_A0); // init test
printf(lcd_putc,"\feeprom", hex); // test LCD
output_low (PIN_A0); // LED off
}
|
Get rid of your own I2C code in the initialisation, and it should work.
Best Wishes |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|