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

      • bqviet
        Trả lời cho Đấu tắt điện cho máy tính bảng
        bởi bqviet
        Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
        06-12-2025, 17:17
      • nguyendinhvan
        Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
        bởi nguyendinhvan
        Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
        05-12-2025, 19:59
      • afrendly
        Trả lời cho Đấu tắt điện cho máy tính bảng
        bởi afrendly
        Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
        04-12-2025, 01:27
      • nick22
        Trả lời cho Máy điện châm ?
        bởi nick22
        Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
        01-12-2025, 13:23
      Đang tải...
      X