Chào các bạn!
Mình đang gặp khó khăn trong giao tiếp I2C. Bài toán của mình là giao tiếp giữa 2 con PIC 16F877A. Khi mình sử dụng thạch anh 4 Mhz thì nó chạy tốt. Nhưng khi thay con thạch anh 20 Mhz thì không còn chạy được nữa
code master:
Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=20000000)
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
void write_I2C(int8 value, int8 slave_addr)
{
i2c_start();
delay_ms(1);
i2c_write(slave_addr);
delay_ms(1);
i2c_write(value);
delay_ms(1);
i2c_stop();
}
int8 read_I2C(int8 slave_addr)
{
int8 value_re;
i2c_start();
delay_ms(1);
i2c_write(slave_addr + 1);
delay_ms(1);
value_re = i2c_read(0);
delay_ms(1);
i2c_stop();
return value_re;
}
void main()
{
int8 value_re=2;
int8 i;
const int8 N = 8;
const int8 slave_addr = 0x10;
set_tris_b(0x00);
while(1){
write_I2C(1, slave_addr);
delay_ms(500);
value_re = read_I2C(slave_addr);
output_b(value_re);
delay_ms(500);
write_I2C(0, slave_addr);
delay_ms(500);
value_re = read_I2C(slave_addr);
output_b(value_re);
delay_ms(500);
}
}
************************************************** ***********
code slave:
Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(Clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 value = 0x01;
#INT_SSP
void i2c_isr()
{
int8 state;
state = i2c_isr_state();
if(state < 0x80 && state>0)
value = i2c_read();
if(state == 0x80){
i2c_write(value);
}
}
void main()
{
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
set_tris_b(0x00);
while(1){
output_b(value);
}
}
//xin loi vi chua cho code vao khung duoc, mong cac ban thong cam. Giup minh nha!