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

                              • mèomướp
                                Trả lời cho Công thức điện tử
                                bởi mèomướp
                                Dạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
                                Hôm qua, 21:21
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
                                Hôm qua, 20:31
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                Ok , thanks bác đã chỉ...
                                Hôm qua, 15:06
                              • nguyendinhvan
                                Công thức điện tử
                                bởi nguyendinhvan
                                Sau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !

                                Chập thì thay. Cháy thì tháo
                                Làm thì láo. Báo thì hay
                                May thì khoe. Rủi thì bỏ
                                Thành tích nhỏ. Báo thành to
                                Làm cho có. Báo chi li
                                Sai cả li. Báo
                                ...
                                Hôm qua, 00:35
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
                                25-11-2024, 22:31
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
                                25-11-2024, 22:14
                              • bactho
                                Trả lời cho Tự làm máy đo Cuộn cảm
                                bởi bactho
                                Hay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
                                25-11-2024, 21:48
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
                                25-11-2024, 21:43
                              • bactho
                                Trả lời cho các bạn giúp mình về file HEX với!!!
                                bởi bactho
                                Bạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
                                25-11-2024, 21:21
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
                                25-11-2024, 20:43
                              Đang tải...
                              X