Thông báo

Collapse
No announcement yet.

Giao Tiếp I2c

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

  • Giao Tiếp I2c

    có bạn nào lam về giao tếp I2C thì giúp mình với:
    đoạn code sau của mình ko ghi đọc đc ROM.
    Mình dùng con ROM 24c64



    Code:
    #include <AT89X51.H>
    #include <regx51.h>
    sbit SCL =  P0^4; 
    sbit SDA =  P0^3; 
    void Ack(void);
    void Delay(unsigned int loop); 
    unsigned char ReadROM(unsigned int addr); 
    void WriteROM(unsigned int addr, unsigned char);
    void WriteByte(unsigned char bytout); 
    void Delay(unsigned int loop) 
    {  
     while(loop--) ;
    } 
     
    void BaseClock(void)  //tao xung nhip tren SCL
    { 
     Delay(4); 
      SCL = 1; 
     Delay(4); 
      SCL = 0; 
    }
    void Ack(void) 		   // tin hieu ACK tu Master
    { 
      SDA = 0; 
     BaseClock(); 
      SDA = 1;
    } 
    void StartBit(void) 	  //Tao bit Start
     { 
      SCL = 1; 
      SDA = 1; 
      Delay(4); 
      SDA = 0;  
      Delay(4); 
      SCL = 0; 
       }  
    void StopBit(void) 		   //Bit Stop
    { 
      SCL = 0;
      SDA = 0; 
      SCL = 1; 
      Delay(4); 
      SDA = 1; 
      Delay(4); 
      SCL = 0; 
    } 
    void SetupRom(void)		  // Thiet lap ROM
    {
    unsigned char i;
    SCL = 1;
    SDA = 1;
    Delay(2);
    for(i=0;i<8;i++)
    BaseClock();
    StartBit();
    } 
    void NoAck(void) 
    { 
      SDA = 1; 
      BaseClock(); 
    } 
    void WaitTwr(void) 
    { 
        Delay(400); 
    } 
     void WriteByte(unsigned char bytout) 	   // Ghi 1 Byte len ROM
    {  	
     unsigned char i; 
    for(i=0;i<8;i++) 
    { 
      if((bytout & 0x80) == 0x00) 
      SDA = 0; 
     else 
      SDA = 1; 
     BaseClock(); 
      bytout = bytout << 1; 
    } 
     }
    unsigned char ReadByte(void) 			   //Doc 1 Byte tu ROM
    { 
      unsigned char i,bytin; 
      bit read;
      bytin = 0;   
      bytin = bytin | SDA; 
     for(i=0;i<8;i++) 
     { 
      BaseClock(); 
        read  = SDA;
        bytin = bytin << 1; 
        bytin = bytin | read; 
     } 
        return(bytin); 		
    }
    void WriteROM(unsigned int addr, unsigned char ch) 		//ghi ch vao ROM  tai dia chi addr
    { 
     StartBit(); 
     WriteByte(0xA0); 
     Ack(); 
     WriteByte(addr&0xF0); 
     Ack();
     WriteByte(addr&0x0F); 
     Ack();  
     WriteByte(ch); 
     Ack(); 
     StopBit(); 
     WaitTwr();   
    } 
     
    unsigned char ReadROM(unsigned int addr) 			  //Doc ROM tu dia chi addr
    { 
      unsigned char ch; 
      StartBit(); 
      WriteByte(0xA0); 
      Ack();
      WriteByte(addr&0xF0);
      Ack();  
      WriteByte(addr&0x0F); 
      Ack(); 
      StartBit(); 
      WriteByte(0xA1); 
      Ack();
      ch = ReadByte();  
      NoAck(); 
      StopBit(); 
      return(ch); 
    }
    Last edited by VNarmy; 06-07-2007, 18:19.

  • #2
    Tương tự cho 24Cxx , không có gì là khác biệt :
    ---------------------------------------------------------------------

    Code:
    #include <reg51.h>
    #include <stdio.h>
    sbit scl=P3^5;  //24c02 SCL
    sbit sda=P3^4;  //24c02 SDA
    sbit P1_0 = P1^0;
    sbit P1_1 =P1^1;
    sbit P1_2 = P1^2;
    sbit P1_3 = P1^3;
    unsigned char x24c02_read(unsigned char address);  //
    void x24c02_write(unsigned char address,unsigned char info);  //
    void x24c02_init();   //
    void delay1(unsigned char x);
    void start();
    void stop();
    void writex(unsigned char j);
    unsigned char readx();
    void clock();
    void delay1(unsigned char x)
    {
       unsigned int i;
       for(i=0;i<x;i++);
    }
    
    void x24c02_init()
    {
       scl=1;
       sda=1; 
    }
    void start()
    {
       sda=1; 
       scl=1; 
       sda=0; 
       scl=0; 
    }
    void stop()
    {
       sda=0; 
       scl=1; 
       sda=1; 
    }
    void writex(unsigned char j)
    {
       unsigned char i,temp;
       temp=j;
       for (i=0;i<8;i++){
          temp=temp<<1; 
    	  scl=0; 
    	  sda=CY; 
    	  scl=1; 
       }
       scl=0; 
       sda=1; 
    }
    unsigned char readx()
    {
       unsigned char i,j,k=0;
       scl=0; 
       sda=1;
       for (i=0;i<8;i++){
           scl=1; 
          if (sda==1) j=1;
          else j=0;
          k=(k<<1)|j; scl=0;
       }
       return(k);
    }
    void clock()
    {
       unsigned char i=0;
       scl=1; 
       while ((sda==1)&&(i<255))i++;
       scl=0; 
    }
    unsigned char x24c02_read(unsigned char address)
    {
       unsigned char i;
       start(); writex(0xa0);
       clock(); writex(address);
       clock(); start();
       writex(0xa1); clock();
       i=readx(); stop();
       delay1(10);
       return(i);
    }
    void x24c02_write(unsigned char address,unsigned char info)
    {
       EA=0;
       start(); writex(0xa0);
       clock(); writex(address);
       clock(); writex(info);
       clock(); stop();
       EA=1;
       delay1(50);
    }
    
    void main()  // qde code
    {x24c02_init();
    P1_1 = x24c02_read(0);
    P1_2 = x24c02_read(1);
    P1_3 = x24c02_read(2);
    
    while(1)
    {
    if(P1_0 == 0)
    {P1_1 =0;
     P1_2 = 1;
     P1_3 = 0;
    x24c02_write(0,P1_1);
    x24c02_write(1,P1_2);
    x24c02_write(2,P1_3);
    }
    }}
    Last edited by VNarmy; 06-07-2007, 18:21.
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      Đoạn chương trình trên ( chỗ màu đỏ ) là test thử với một số đèn led .

      Bấm 1 phím các led sáng lên, eeprom được ghi lại . Rút điện ra và cắm lại các led sáng ===> OK , eeprom đã lưu thông tin khi mất điện
      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

      Comment


      • #4
        Thanks.
        bác QD ơi, code của bác chỉ test đc với 1 bít. Em test cho cả 8 bit thì ko đc.
        #include <reg51.h>
        #include <stdio.h>
        sbit scl=P0^4; //24c02 SCL
        sbit sda=P0^3; //24c02 SDA

        sbit P1_0 = P1^0;
        sbit P2_0 = P2^0;
        sbit P2_1 =P2^1;
        sbit P1_2 = P1^2;
        sbit P1_3 = P1^3;
        unsigned char x24c02_read(unsigned char address); //
        void x24c02_write(unsigned char address,unsigned char info); //
        void x24c02_init(); //
        void delay1(unsigned char x);
        void start();
        void stop();
        void writex(unsigned char j);
        unsigned char readx();
        void clock();
        void delay1(unsigned char x)
        {
        unsigned int i;
        for(i=0;i<x;i++);
        }

        void x24c02_init()
        {
        scl=1;
        sda=1;
        }
        void start()
        {
        sda=1;
        scl=1;
        sda=0;
        scl=0;
        }
        void stop()
        {
        sda=0;
        scl=1;
        sda=1;
        }
        void writex(unsigned char j)
        {
        unsigned char i,temp;
        temp=j;
        for (i=0;i<8;i++){
        temp=temp<<1;
        scl=0;
        sda=CY;
        scl=1;
        }
        scl=0;
        sda=1;
        }
        unsigned char readx()
        {
        unsigned char i,j,k=0;
        scl=0;
        sda=1;
        for (i=0;i<8;i++){
        scl=1;
        if (sda==1) j=1;
        else j=0;
        k=(k<<1)|j; scl=0;
        }
        return(k);
        }
        void clock()
        {
        unsigned char i=0;
        scl=1;
        while ((sda==1)&&(i<255))i++;
        scl=0;
        }
        unsigned char x24c02_read(unsigned char address)
        {
        unsigned char i;
        start(); writex(0xa0);
        clock(); writex(address);
        clock(); start();
        writex(0xa1); clock();
        i=readx(); stop();
        delay1(10);
        return(i);
        }
        void x24c02_write(unsigned char address,unsigned char info)
        {
        EA=0;
        start(); writex(0xa0);
        clock(); writex(address);
        clock(); writex(info);
        clock(); stop();
        EA=1;
        delay1(50);
        }

        void main() // qde code
        {x24c02_init();
        while(1)
        {
        if(P2_1 ==0)
        {
        x24c02_write(1,0x00); // Ghi 00
        }
        if(P2_0==0)
        {P1= x24c02_read(1); //
        delay1(500); }
        }}


        //P1= x24c02_read(1); kết quả la P1 = 0F ??????

        Bác QD có thể giúp em lần nữa đc ko.
        Attached Files

        Comment


        • #5
          Sao mấy cậu cứ lôi Proteus ra mà test nhỉ ???

          Test bằng Proteus thì chẳng bao giờ khá được đâu.

          Thử mạch thật xem thế nào , tôi vẫn chạy rầm rầm đấy thôi.

          --- code này là của bọn nước ngoài nó viết , trước đây khi làm điều khiển từ xa với 89 tôi dùng nó để lưu lại trạng thái rơ le phòng khi mất điện . Chạy có vấn đề gì đâu nhỉ .
          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

          Comment


          • #6
            Vì sao ... vì sao... và vì sao...

            Nguyên văn bởi queduong Xem bài viết
            Sao mấy cậu cứ lôi Proteus ra mà test nhỉ ???

            Test bằng Proteus thì chẳng bao giờ khá được đâu.

            Thử mạch thật xem thế nào , tôi vẫn chạy rầm rầm đấy thôi.

            --- code này là của bọn nước ngoài nó viết , trước đây khi làm điều khiển từ xa với 89 tôi dùng nó để lưu lại trạng thái rơ le phòng khi mất điện . Chạy có vấn đề gì đâu nhỉ .
            Đó là tư duy giáo dục của VN đó. Thầy lúc nào cũng dạy các em nên mô phỏng này mô phỏng nọ trước khi làm mạch thật. Thậm chí tôi còn biết có trường kỹ thuật nhất nhì ở VN này còn yêu cầu học viên cao học làm bài tập lớn là mô phỏng 8051 trên proteus cơ. Pó tay các cụ
            AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
            Xem thêm tại Online Store ---> Click here
            Mob: 0982.083.106

            Comment


            • #7
              Tôi đã từng làm cái mạch điều khiển động cơ với PIC , mô phỏng trên Proteus . Thậm chí Proteus ngu đến nỗi không nhận biết được 0 và 1.
              Ở mạch thực tế tôi cho các điện trở kéo xuống GND , trong Proteus tôi để kéo lên VCC 5V . Mã nguồn trong proteus chạy tít lắm .
              Đưa thử vào mạch thật - im như thóc . Không chạy được.

              Thậm chí tôi thay đổi lại trong Proteus là các điện trở nối GND , nó vẫn chạy như nối lên VCC .

              " Hình như bọn này nó thích NỊNH người dùng "

              --- Trong proteus , đôi khi nối đầu out của vi điều khiển và trực tiếp vào Transistor thì cũng có thể không chạy , mà lại qua 1 ông điện trở mới chạy.

              --- Mạch Thực tế thì chẳng cần điện trở ( đừng nói thiết kế thế này sơ suất và không bền nhé ) - Chạy hàng chục năm vô sờ tư.


              ------- Khả năng của nó hạn hẹp quá ==> tôi nghĩ quăng nó vào sọt rác nhưng lại thấy nó vẽ sơ đồ nguyên lý nhanh . Nên giữ lại để vẽ sơ đồ .

              Mấy sơ đồ tôi POST lên diễn đàn chẳng hạn
              Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

              Comment


              • #8
                Tôi rất muốn tìm hiểu I2C nhưng mà tôi chỉ biết hợp ngữ thôi, còn các bác cứ viết = C thì tôi pótay.
                Có ai đó viết thử 1 đoạn = hợp ngữ cho con 89xx nào đó không, đọc và ghi dữ liệu vào con 24C64, nhớ là giải thích cách kết nối đấy nhé.
                |

                Comment


                • #9
                  Nguyên văn bởi 090 Xem bài viết
                  Tôi rất muốn tìm hiểu I2C nhưng mà tôi chỉ biết hợp ngữ thôi, còn các bác cứ viết = C thì tôi pótay.
                  Có ai đó viết thử 1 đoạn = hợp ngữ cho con 89xx nào đó không, đọc và ghi dữ liệu vào con 24C64, nhớ là giải thích cách kết nối đấy nhé.
                  C không phải mã nguồn mở vì thế nên ít mã nguồn C free hơn ASM.

                  C thuộc lập trình có cấu trúc , dễ quản lý , sửa đổi . Biến dạng . Càng nhạy cảm như vậy thì C càng ít source code free .


                  CÒN ASM là mã phát triển, free và có rất nhiều ví dụ .
                  Tìm trên internet đi . Lười thì chịu .
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    I2C và 89xx

                    Thích hợp ngữ thì có hợp ngữ.
                    Thích C thì có C.
                    Nhưng xin nói trước là thằng hợp ngữ tôi chỉ mới down về cho nó phong phú thư viện thôi còn chưa thử bao giờ nên chẳng biết nó có hoạt động ko. Còn nếu đồng chí muốn giải thích cách kết nối thì phải có biiiiiiiiiiiiiiiia. Hehe.
                    AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                    Xem thêm tại Online Store ---> Click here
                    Mob: 0982.083.106

                    Comment


                    • #11
                      Nguyên văn bởi VNarmy Xem bài viết
                      Thích hợp ngữ thì có hợp ngữ.
                      Thích C thì có C.
                      Nhưng xin nói trước là thằng hợp ngữ tôi chỉ mới down về cho nó phong phú thư viện thôi còn chưa thử bao giờ nên chẳng biết nó có hoạt động ko. Còn nếu đồng chí muốn giải thích cách kết nối thì phải có biiiiiiiiiiiiiiiia. Hehe.

                      Làm hợp ngữ cũng hay phết nhưng " nhức đầu lém "

                      tôi bỏ xó cái ASM từ lâu roài , thỉnh thoảng cần tốc độ hoặc những cái C không áp dụng tốt mới dùng ASM ( inline là chủ yếu ).

                      Giải thích mấy dòng cũng không khó nhưng giải thích xong cũng toát hết mồ hôi . Bia để hạ nhiệt là đúng rồi .

                      Gần mực thì ... bia
                      Gần đèn thì ... hút
                      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                      Comment


                      • #12
                        Đang làm hợp ngữ hay thì vào một ngày đẹp trời down được bộ Keil từ TTVNOL . Thế là từ đó trở đi chẳng còn biết hợp ngữ là gì nữa. Bây giờ nhìn lại mấy chương trình hợp ngữ ngày xưa viết vẫn còn phục mình sát đất.
                        AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                        Xem thêm tại Online Store ---> Click here
                        Mob: 0982.083.106

                        Comment


                        • #13
                          xin các anh hướng dẫn em cách dùng visual basic de giao tiếp với PC

                          Em đang làm dề tai tot nghiệp có phần nay xin nho cac anh chỉ giup dum.Thanhk

                          Comment


                          • #14
                            cấu hình hoạt động cho modul I2c bằng hợp ngữ và C như nhau, vẫn viết bấy nhiêu dòng lệnh ...tui yêu cả C và hợp ngữ !
                            |

                            Comment


                            • #15
                              Nguyên văn bởi chunhatonlin Xem bài viết
                              cấu hình hoạt động cho modul I2c bằng hợp ngữ và C như nhau, vẫn viết bấy nhiêu dòng lệnh ...tui yêu cả C và hợp ngữ !
                              Vấn đề đâu chỉ nằm ở chỗ dòng lệnh mà nó còn liên quan đến nhiều thứ khác nữa. Hầu hết những ai đã từng viết C rồi thì đều nhì hợp ngữ với con mắt ngán ngẩm. Chỉ trong trường hợp bắt buộc mới phải dùng hợp ngữ thôi.
                              AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                              Xem thêm tại Online Store ---> Click here
                              Mob: 0982.083.106

                              Comment

                              Về tác giả

                              Collapse

                              chimgokien Tìm hiểu thêm về chimgokien

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

                              Collapse

                              Đang tải...
                              X