Thông báo

Collapse
No announcement yet.

Gặp vấn đề về truyền thông I2C 1 master 2 slave (pic16f887)

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Gặp vấn đề về truyền thông I2C 1 master 2 slave (pic16f887)

    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:
    #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 slave 1:

    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 slave2:
    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
    Click image for larger version

Name:	Untitled.jpg
Views:	2
Size:	127.6 KB
ID:	1416423
    đây là file proteus + CCS + hex
    LAN 11.rar

  • #2
    bạn thử thay : dulieu=i2c_read(); thành dulieu=i2c_read(0); xem thế nào

    Comment


    • #3
      có mạch truyền thống rs485 kô?

      Comment

      Về tác giả

      Collapse

      khanh my Tìm hiểu thêm về khanh my

      Bài viết mới nhất

      Collapse

      Đang tải...
      X