Em đang lập trình I2C gồm 1 master và 2 slave, khi dùng 1 master 1 slave thì dử liệu từ slave truyền về master chính xác, nhưng khi dùng 2 slave thì dử liệu truyền về lúc nào củng 255, mọi người ai đã làm fix lổi dùm em cái
code master
code slave 1:
code slave2:
hình ảnh em nó đây

đây là file proteus + CCS + hex
LAN 11.rar
code master
Code:
#include <16f887.h>
#fuses hs,nolvp,nowdt
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use i2c(master,sda=pin_c4,scl=pin_c3 )
#define slave_add 0x10
#define slave_add2 0x40
unsigned int doc,doc2;
void hienthi_lcd(void);
unsigned int read_slave(void);
unsigned int read_slave2(void);
void main() {
set_tris_d(0x00);
lcd_init();
while(true){
doc=read_slave();
doc2=read_slave2();
hienthi_lcd();
}
}
unsigned int read_slave(void) {
unsigned int dulieu;
i2c_start(1);
i2c_write(0x10);
dulieu=i2c_read();
i2c_stop();
return dulieu;
}
unsigned int read_slave2(void) {
unsigned int dulieu2;
i2c_start(1);
i2c_write(0x40);
dulieu2=i2c_read();
i2c_stop();
return dulieu2;
}
void hienthi_lcd() {
lcd_putcmd(line_1);
lcd_putchar("MASTER");
lcd_putcmd(line_2);
printf(lcd_putchar,"H0=%3u H1=%3u",doc,doc2);
}
Code:
#include <16f887.h>
#fuses hs,nolvp,nowdt
#device adc=10
#use delay(clock=20000000)
#use i2c(slave,sda=pin_c4,scl=pin_c3,address=0x10)
#include <lcd_lib_4bit.c>
float doc;
unsigned int16 a;
void doc_adc(void);
void xuly_adc(void);
void hienthi_lcd(void);
#int_ssp
void ssp_interupt () {
if(i2c_isr_state()==0x80) {
i2c_write((unsigned int)doc);
}
}
void main (void) {
set_tris_a(0xff);
set_tris_d(0x00);
lcd_init();
setup_adc_ports(san0);
setup_adc(adc_clock_internal);
enable_interrupts(int_ssp);
clear_interrupt(int_ssp);
enable_interrupts(global);
while (true) {
doc_adc();
xuly_adc();
hienthi_lcd ();
}
}
void doc_adc () {
set_adc_channel(0);
delay_us(10);
a=read_adc ();
}
void xuly_adc () {
doc=((float)a*4.88)/10;
}
void hienthi_lcd () {
lcd_putcmd(line_1);
lcd_putchar("SLAVE 1");
lcd_putcmd(line_2);
printf(lcd_putchar,"H0=%3.0f",doc);
}
Code:
#include <16f887.h>
#fuses hs,nolvp,nowdt
#device adc=10
#use delay(clock=20000000)
#use i2c(slave,sda=pin_c4,scl=pin_c3,address=0x40)
#include <lcd_lib_4bit.c>
float doc2;
unsigned int16 a2;
void doc_adc(void);
void xuly_adc(void);
void hienthi_lcd(void);
#int_ssp
void ssp_interupt () {
if(i2c_isr_state()==0x80) {
i2c_write((unsigned int)doc2);
}
}
void main (void) {
set_tris_a(0xff);
set_tris_d(0x00);
lcd_init();
setup_adc_ports(san0);
setup_adc(adc_clock_internal);
enable_interrupts(int_ssp);
clear_interrupt(int_ssp);
enable_interrupts(global);
while (true) {
doc_adc();
xuly_adc();
hienthi_lcd ();
}
}
void doc_adc () {
set_adc_channel(0);
delay_us(10);
a2=read_adc ();
}
void xuly_adc () {
doc2=((float)a2*4.88)/10;
}
void hienthi_lcd () {
lcd_putcmd(line_1);
lcd_putchar("SLAVE 2");
lcd_putcmd(line_2);
printf(lcd_putchar,"H1=%3.0f",doc2);
}
hình ảnh em nó đây
đây là file proteus + CCS + hex
LAN 11.rar

Comment