lab.cdt
03-11-2012, 04:44 AM
Chào các cậu. Tớ đang tự học CCS C và đến phần giao tiếp I2C. Tớ đã đọc code mẫu trong help của CCS C và đã đọc code mẫu của các bạn hoanf và ha trong topic I2C nhưng tớ chưa hiểu lắm. Ý tưởng ban đầu của tớ đơn giản chỉ là truyền một byte (chỉ 1 byte và 1 lần) từ con mater xuống con slave.
////////////////////////////////////////////////////////////////////////////////////////////////
//dùng PIC 16f877a ////////////
//các đoạn khai báo ban đầu tương tự như các bài hướng dẫn trên diễn đàn////////////
//nên tớ không viết lại (vì admin có yêu cầu là chỉ post phần thắc mắc và ý tưởng)////
////////////////////////////////////////////////////////////////////////////////////////////////
//code cho con mater:
#define slave_address 0x10
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
void write_I2C(int8 value)
{
i2c_start();//mater tao tin hieu start
i2c_write(slave_addr);//Gửi địa chỉ và bít hướng R/W = 0 (Mode write) đến Slave
i2c_write(value);//Gửi dữ liệu byte thứ nhất
i2c_stop();// Master tạo tín hiệu Stop
}
void main()
{
int8 a = 0xFF;
write_I2C(a);
}
//code cho slave
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 value;
#INT_SSP
void i2c_isr()
{
int8 state;
state = i2c_isr_state();
if(state == 0)
i2c_read();
else if(state < 0x80)
value = i2c_read();
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
set_tris_b(0);
output_b(value);
}
Khi tớ mô phỏng trên protues thì 8 con led ở portB của con slave ko sáng cùng lúc (giá trị tại các pin của portB ở con slave là mức cao thì led sáng) mà nó chớp tắt như là tớ truyền liên tục một byte xuống từ con master với giá trị khởi tạo là " a = 0x01 " và cứ mỗi lần truyền thì a tăng lên 1 đơn vị (giá trị tiếp theo của a là " a = 0x02 " và cứ thế..) đến khi " a = 0xFF" (8 con sáng cùng 1 lúc) thì nó lại tắt và bắt đầu lại từ đầu. Tớ suy nghĩ nhiều lần mà không hiểu dc, vì tớ chỉ truyền 1 lần thì con slave chỉ nhận 1 lần chứ. Như vậy thì 8 con led ở con slave sáng đồng thời và giữ nguyên...nhưng ở đây thì nó lại chớp tắt như trên. Mong các cậu biết giải thích hộ tớ. Tớ gửi lời cảm ơn và lời chúc sứ khỏe đến các cậu..
..thân...
////////////////////////////////////////////////////////////////////////////////////////////////
//dùng PIC 16f877a ////////////
//các đoạn khai báo ban đầu tương tự như các bài hướng dẫn trên diễn đàn////////////
//nên tớ không viết lại (vì admin có yêu cầu là chỉ post phần thắc mắc và ý tưởng)////
////////////////////////////////////////////////////////////////////////////////////////////////
//code cho con mater:
#define slave_address 0x10
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
void write_I2C(int8 value)
{
i2c_start();//mater tao tin hieu start
i2c_write(slave_addr);//Gửi địa chỉ và bít hướng R/W = 0 (Mode write) đến Slave
i2c_write(value);//Gửi dữ liệu byte thứ nhất
i2c_stop();// Master tạo tín hiệu Stop
}
void main()
{
int8 a = 0xFF;
write_I2C(a);
}
//code cho slave
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 value;
#INT_SSP
void i2c_isr()
{
int8 state;
state = i2c_isr_state();
if(state == 0)
i2c_read();
else if(state < 0x80)
value = i2c_read();
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
set_tris_b(0);
output_b(value);
}
Khi tớ mô phỏng trên protues thì 8 con led ở portB của con slave ko sáng cùng lúc (giá trị tại các pin của portB ở con slave là mức cao thì led sáng) mà nó chớp tắt như là tớ truyền liên tục một byte xuống từ con master với giá trị khởi tạo là " a = 0x01 " và cứ mỗi lần truyền thì a tăng lên 1 đơn vị (giá trị tiếp theo của a là " a = 0x02 " và cứ thế..) đến khi " a = 0xFF" (8 con sáng cùng 1 lúc) thì nó lại tắt và bắt đầu lại từ đầu. Tớ suy nghĩ nhiều lần mà không hiểu dc, vì tớ chỉ truyền 1 lần thì con slave chỉ nhận 1 lần chứ. Như vậy thì 8 con led ở con slave sáng đồng thời và giữ nguyên...nhưng ở đây thì nó lại chớp tắt như trên. Mong các cậu biết giải thích hộ tớ. Tớ gửi lời cảm ơn và lời chúc sứ khỏe đến các cậu..
..thân...