RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Giao tiếp I2C

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • minhkhoa1990
    Nhập môn đệ tử
    • Oct 2010
    • 8

    #181
    ko có bác nào giúp em ah. hix

    Comment

    • truongvanquan
      Nhập môn đệ tử
      • Oct 2010
      • 3

      #182
      Nguyên văn bởi minhkhoa1990 View Post
      //
      int16 read_I2C_2byte(int8 slave_address)
      {
      int16 value_read;
      i2c_start();
      i2c_write(slave_address+1);?????????
      high=i2c_read(1);
      delay_us(10);
      low=i2c_read(0);
      i2c_stop();
      value_read=make16(high,low);
      value_read=value_read/5.2;
      printf(" %Ld\n\r",value_read);
      return value_read;
      }
      ///////////
      các bác cho em hỏi hàm i2c_write(slave_address+1) có ý nghĩa như thế nào và địa chỉ:slave_address+1 là sao.......... thanks các bác nhiều

      Theo em nghĩ thì đây là một chương trình con.

      ở trên bác dùng một biến: int16 read_I2C_2byte(int8 slave_address)
      nên ở dưới nó sẽ dùng biến này!

      VD như bác điều khiển DS1307 thì địa chỉ của nó là 0b1101000x. (0xD..)
      như vậy i2c_write(slave_address+1) sẽ là i2c_write(0xD1) ->> đọc thông tin từ DS1307

      thân,

      Comment

      • moonlight_mta
        Nhập môn đệ tử
        • Jul 2011
        • 3

        #183
        Mình mới học về giao tiếp I2C,mình viết code cho PIC6F877A và DS1307 hiển thị LCD.Mình không sử dụng các hàm có sẵn của CCS.Khi chạy thì nó không thoát ra được khỏi vòng lặp wait_ngắt,tức chờ cho cờ ngắt SSPIF = 1.Code của nó như sau,các bạn giúp mình nhé
        #include<16f877a.h>
        #include<def_877.c>
        #include<LCD_mod.h>
        #use delay(clock = 20000000)
        void wait_ngat(void);
        unsigned char DECBCD2(unsigned char);
        void main()
        {
        unsigned char s,p,h,d,m,y;
        TRISB = 0x00;
        TRISD = 0x00;
        wrcmd(0x38);
        wrcmd(0x01);
        wrcmd(0x0e);

        SSPCON = 0x38; //ko truyen du lieu vao sspbuf khi che do truyen du lieu chua san sang
        //ko du lieu dc nhan vao sspbuf khi du lieu cu chua dc doc
        // cho phep cong giao tiep mssp
        // che do I2C master mode,cl SCL= Fosc/(4*(SSPADD+1)
        SSPADD = 0;
        INTCON7 = 1; //cho phep tat ca ngat
        INTCON6 = 1; //cho phep ngat ngoai vi

        PIE13 = 1; // cho phep ngat ssp

        // bat dau wa trinh truyen nhan du lieu
        TRISC3 = 0; // cac pin sda va scl
        TRISC4 = 0;
        PORTC3 = 1;
        PORTC4 = 1;
        SSPCON20 = 1; // sspcon2<0> = 1 thiet lap start
        wait_ngat();
        SSPBUF = 11010000; // address and write
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0x01;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0x01;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0x01;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0x11;
        PIR13 = 0;

        SSPCON22 = 1;
        wait_ngat();
        PIR13 = 0;

        //................................
        SSPCON20 = 1;
        wait_ngat();
        SSPBUF = 11010000;
        PIR13 = 0;

        wait_ngat();
        SSPBUF = 0;
        PIR13 = 0;

        wait_ngat();
        SSPCON22 = 1;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        //.....................................
        TRISC3 = 1;
        TRISC4 = 1;
        SSPCON20 = 1;
        wait_ngat();
        SSPBUF = 11010001;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        wait_ngat();
        s = SSPBUF;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        wait_ngat();
        p = SSPBUF;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        wait_ngat();
        h = SSPBUF;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        wait_ngat();
        d = SSPBUF;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        wait_ngat();
        m = SSPBUF;
        PIR13 = 0;

        wait_ngat();
        PIR13 = 0;
        wait_ngat();
        y = SSPBUF;
        PIR13 = 0;

        SSPCON22 = 1;
        wait_ngat();
        PIR13 = 0;

        //...........................
        DECBCD2(s);
        DECBCD2(p);
        DECBCD2(h);
        DECBCD2(d);
        DECBCD2(m);
        DECBCD2(y);
        wrdata(s);
        wrdata(p);
        wrdata(h);
        wrdata(d);
        wrdata(m);
        wrdata(y);
        }
        //........................
        void wait_ngat(void)
        {
        while(PIR13 == 0);
        }
        //........................
        unsigned char DECBCD2(unsigned char BCD)
        {
        unsigned char L,H;
        L = BCD & 0x0f;
        H = (BCD>>4) *10;
        return(L+H);
        }

        Comment

        • tan_truong
          Đệ tử 1 túi
          • Nov 2010
          • 17

          #184
          I2C...........slave-&gt;master

          Đụng lại vấn đề cũ của mấy huynh
          Em mô phỏng chuẩn I2C giữa 2 con 18f4431, tình hình là nó chạy rất tào lao( tại người làm chuối quá)
          Em gửi kèm file mô phỏng, mấy anh xem hộ cho thèn em với
          Cảm ơn mọi người
          Attached Files

          Comment

          • tan_truong
            Đệ tử 1 túi
            • Nov 2010
            • 17

            #185
            I2C-----&gt;&gt;Master&lt;==&gt;Slave

            Chào tất cả mọi nguời, sau 1 khi tìm hiểu về I2C để giải quyết vấn đề mình có đặt ra bên trên thì tạm thời mình mô phỏng được việc truyền nhận dữ liệu 2 chiều Master<==>Slave
            Mọi nguời có hứng thì tham khảo và góp ý nhé
            P/S: 1) Cảm ơn anh Hoanf và tất cả mọi nguời đã đóng góp xây dựng thread này
            2) Vấn đề mình thắc mắc ở trên thì vẫn chưa giải quyết ^^, tiếp tục help me nhé
            Attached Files

            Comment

            • chuvanhuu
              Nhập môn đệ tử
              • Nov 2011
              • 5

              #186
              các bác ơi, cho em hỏi chút, có phải I2C là nhất thiết phải dùng ngắt ko ạ?
              ko biết là có bác nào từng nghiên cứu vấn đề này chưa, nhưng mình thấy là dùng lệnh while đi kèm lệnh điều kiện thì chức năng cũng có thể gần giống ngắt, ví dụ như chương trình này, (mình làm ko thành công, nên thuật giải cũng ko chắc chắn đúng)
              <code>//chuong trinh cho slave
              #include <16f877a.h>
              #include <def_877a.h>
              #fuses XT,NOWDT,NOPROTECT,NOLVP
              #use delay(clock= 4000000)
              #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
              int8 data, state;
              #define slave 0x10
              void main()
              {
              data=0;
              trisd=0;
              while(1)
              {
              state= i2c_isr_state();
              switch (state)
              {
              case 0x80:
              {
              data++;
              if( data==255 )
              {
              data= 0;
              }
              i2c_write(data);
              break;
              }
              case 0x81: i2c_write(slave);
              break;
              }
              portd= data;
              }
              }</code>

              Comment

              • tan_truong
                Đệ tử 1 túi
                • Nov 2010
                • 17

                #187
                Chào bạn,
                Thứ 1, bạn viết chương trình cho Slave mà sao hok có hàm nhận mà chỉ có hàm truyền ko vậy?
                Thứ 2, nếu bạn dùng ccs thì vào phần help để xem lại lệnh state=i2c_isr_state(); bạn xem thử giá trị state bằng bao nhiêu thì gửi, bao nhiêu thì nhận.
                Thứ 3, nếu con vđk của bạn còn làm việc khác nữa thì nên xem lặp cách dùng vòng lặp thế này.
                Chúc bạn thành công.

                Comment

                • chuvanhuu
                  Nhập môn đệ tử
                  • Nov 2011
                  • 5

                  #188
                  cảm ơn bạn, đây là code con master, cái này thực ra ko phải mình viết
                  <code>
                  // chuong trinh cho master
                  #include <16f877a.h>
                  #include <def_877a.h>
                  #fuses HS,NOWDT,NOPROTECT,NOLVP
                  #use delay(clock= 4000000)
                  #use i2c(master, SDA=PIN_C4, SCL=PIN_C3)
                  int8 data, bo, i;
                  #define slave 0x10
                  void doc_i2c()
                  {
                  i= 0;
                  while( i!=2)
                  {
                  i++;
                  i2c_start();
                  i2c_write( slave+1); //nhan du lieu tu Slave
                  switch ( i)
                  {
                  case 1: data= i2c_read( 1);
                  break;
                  case 2: bo= i2c_read( 0);
                  break;
                  }
                  }
                  }
                  void main()
                  {
                  trisd= 0;
                  portd= 0;
                  while(true)
                  {
                  doc_i2c();
                  portd= data;
                  delay_ms( 100);
                  }
                  }
                  </code>
                  ===============================================

                  còn đây là code cho Slave nguyên mẫu, code slave bên trên do mình chỉnh sửa từ đây
                  <code>
                  // chuong trinh cho master
                  #include <16f877a.h>
                  #include <def_877a.h>
                  #fuses HS,NOWDT,NOPROTECT,NOLVP
                  #use delay(clock= 4000000)
                  #use i2c(master, SDA=PIN_C4, SCL=PIN_C3)
                  int8 data, bo, i;
                  #define slave 0x10
                  void doc_i2c()
                  {
                  i= 0;
                  while( i!=2)
                  {
                  i++;
                  i2c_start();
                  i2c_write( slave+1); //nhan du lieu tu Slave
                  switch ( i)
                  {
                  case 1: data= i2c_read( 1);
                  break;
                  case 2: bo= i2c_read( 0);
                  break;
                  }
                  }
                  }
                  void main()
                  {
                  trisd= 0;
                  portd= 0;
                  while(true)
                  {
                  doc_i2c();
                  portd= data;
                  delay_ms( 100);
                  }
                  }

                  </code>

                  Comment

                  • slove
                    Nhập môn đệ tử
                    • Jul 2011
                    • 1

                    #189
                    Có bạn nào truyền giữa 1 master với nhiều slave chưa? Không hiểu sao không đúng địa chỉ mà của mình mà slave vần nhảy vào ngắt nhận và đọc giá trị từ buffer về.
                    Mình truyền cho 5 con slave thì cả 5 lần cả 5 con đều nhảy vào ngắt nhận. Không hiểu tại sao nữa.

                    Comment

                    • vangtranglanh
                      Nhập môn đệ tử
                      • Jun 2010
                      • 1

                      #190
                      Cần anh chị giúp I2C

                      Em mới chập chững học i2c nên còn nhiều thắc mắc và nhiều chỗ không hiểu ,anh chị cho em hỏi giả sử bên slave của em có một biến đếm n,cứ sau 1 giây thì n++;bây h em mún gởi giá trị của n qua máter thì code ở mater và slave sẽ được viết như thế nào ạ?
                      Mong anh chị giúp dỡ ,xin cảm ơn!

                      Comment

                      • truong298
                        Nhập môn đệ tử
                        • Mar 2012
                        • 2

                        #191
                        các anh ơi. e mới học pic. giờ đang phải làm giao tiếp giữa pic và eeprom(truyền dữ liệu cho eeprom) và giao tiếp với ds1307. e kô biết phải làm sao. mong các anh giúp đỡ

                        Comment

                        • neunhu50
                          Nhập môn đệ tử
                          • Oct 2010
                          • 6

                          #192
                          có bạn nào làm 1 pic master điều khiển 3 pic slave để điều khiển 12 động cơ step chưa (1pic 4 stepmotor), chia sẽ mình với.

                          Comment

                          • quyen bk
                            Nhập môn đệ tử
                            • Mar 2012
                            • 5

                            #193
                            giao tiếp với eeprom ngoài(24c64)

                            Help!
                            Các anh(chị) ơi help me em với!
                            Em có nhận bài tập của ông thầy với nội dung đề ra:
                            Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ:
                            Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng)
                            Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok”

                            + nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai”
                            Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)?
                            Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi!
                            Em thank trước nha!!!!!!!!!!!!

                            Comment

                            • quyen bk
                              Nhập môn đệ tử
                              • Mar 2012
                              • 5

                              #194
                              giaotiếp với eeprom ngoài(24c64)

                              Help!
                              Các anh(chị) ơi help me em với!
                              Em có nhận bài tập của ông thầy với nội dung đề ra:
                              Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ:
                              Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng)
                              Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok”

                              + nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai”
                              Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)?
                              Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi!
                              Em thank trước nha!!!!!!!!!!!!
                              mail của em nề: vanquyen1690@gmail.com
                              Attached Files

                              Comment

                              • quyen bk
                                Nhập môn đệ tử
                                • Mar 2012
                                • 5

                                #195
                                giaotiếp với eeprom ngoài(24c64)

                                Help!
                                Các anh(chị) ơi help me em với!
                                Em có nhận bài tập của ông thầy với nội dung đề ra:
                                Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ:
                                Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng)
                                Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok”

                                + nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai”
                                Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)?
                                Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi!
                                Em thank trước nha!!!!!!!!!!!!
                                mail của em nề: vanquyen1690@gmail.com
                                Attached Files
                                Last edited by quyen bk; 20-05-2012, 10:22 AM. Lý do: thiếu phần file đính kèm

                                Comment

                                Working...