|
|
View previous topic :: View next topic |
Author |
Message |
amboleos
Joined: 13 Oct 2010 Posts: 8
|
i2c state problem |
Posted: Wed Oct 13, 2010 7:57 am |
|
|
Hi all,
I have problems with I2C. I need to connect 3 PIC to one master but after six hour, I could only write to one slave. I tried every tutorial and code that I found but in proteus they don't work.
I can see that master passes the info to slave and slave executes
Code: | i2c_write(buffer[address]); |
but master reads this value as 0x80 which equal to the state value in that period.
Here is my master code
Code: |
#include <16F877A.h>
#include "2401.c"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3)
int8 data=0;
int8 data1=0;
void main()
{
init_ext_eeprom(); //Call before the other functions are used ////
delay_ms(100);
data=read_ext_eeprom(2); //Read the byte d from the address a ////
delay_ms(100); ////
write_ext_eeprom(2, 15); // Write the byte d to the address a ////
delay_ms(100);
data=read_ext_eeprom(2); //Read the byte d from the address a ////
////
data1 = ext_eeprom_ready(); //Returns TRUE if the eeprom is ready ////
//to receive opcodes ////
///
} |
and slave
Code: | #include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xA0)
BYTE address, buffer[0x10];
BYTE incoming, state;
#INT_SSP
void ssp_interupt ()
{
state = i2c_isr_state();
if(state <= 0x80) //Master is sending data
{
incoming = i2c_read();
if(state == 1) //First received byte is address
address = incoming;
if(state == 2) //Second received byte is data
buffer[address] = incoming;
}
if(state == 0x80) //Master is requesting data
{
i2c_write(buffer[address]);
}
}
void main ()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
buffer[0]=23;
buffer[1]=24;
buffer[2]=25;
buffer[3]=26;
buffer[4]=27;
while (TRUE) {}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
amboleos
Joined: 13 Oct 2010 Posts: 8
|
|
Posted: Thu Oct 14, 2010 2:51 am |
|
|
Thank you for links, I tried the these codes that are supposed to be working.
Meanwhile my complier is PCWHD 4.112
Master
Code: | #include <18f4520.h>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)
#define SLAVE1_WRT_ADDR 0x14
#define SLAVE1_READ_ADDR 0x15
#define SLAVE2_WRT_ADDR 0x28
#define SLAVE2_READ_ADDR 0x29
#define SLAVE3_WRT_ADDR 0x42
#define SLAVE3_READ_ADDR 0x43
//====================================
void main()
{
int8 data1,data2,data3;
while(1)
{
output_high(pin_d4);
delay_ms(60);
output_low(pin_d4);
i2c_start();
i2c_write(SLAVE1_READ_ADDR);
data1 = i2c_read(0);
i2c_stop();
delay_ms(10);
i2c_start();
i2c_write(SLAVE2_READ_ADDR);
data2 = i2c_read(0);
i2c_stop();
delay_ms(10);
i2c_start();
i2c_write(SLAVE3_READ_ADDR);
data3 = i2c_read(0);
i2c_stop();
printf(" [ %3U %3U %3U ] \r\n", data1,data2,data3);
output_high(pin_d6);
delay_ms(60);
output_low(pin_d6);
}
} |
my slave (just one slave is connected to the bus)
Code: | #include <18F4520.h>
#device adc=8
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x14)
int8 adc_result;
#INT_SSP
void ssp_interrupt()
{
int8 incoming, state;
state = i2c_isr_state();
if(state < 0x80) // Master is sending data
{
incoming = i2c_read();
}
if(state >= 0x80) // Master is requesting data from slave
{
i2c_write(14);
}
}
//======================================
void main ()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);
adc_result = read_adc();
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
while(1)
{
adc_result = read_adc();
delay_ms(500);
}
} |
My results
Code: | [14 255 255]
[255 255 255]
[255 255 255]
[255 255 255]
.... |
Just the first time, value is correctly readed.
I also tried to clear all other slave codes and just let 1 slave and master communicate, but again it didnt work.
Problem is that slave never enters interrupt again after first one. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Thu Oct 14, 2010 5:39 am |
|
|
If this is a simulator (proteus) it may not be your code but the simulator!
I've never trusted any simulator in the 35 years I've been cutting code.
NONE will work 100% properly all of the time.
If real hardware, check the pullups for right values for your speed, board layout, etc. |
|
|
|
|
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
|