Thông báo

Collapse
No announcement yet.

I2C Cho AVR dùng CodeVision!!!

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

  • I2C Cho AVR dùng CodeVision!!!

    Chào các bạn!
    Mình đang test AVR Mega16 dùng Codevision. Mình đang thử chức năng I2C của nó. Trong CodeVision có hỗ trợ hàm I2C sẵn rồi. Mình viết chương trình (dựa vào Code mẫu của CodeVision) ghi một byte vào EEPROM 24C02, sau đó đọc lại và xuất ra PortD. Nhưng không hiểu sao, giá trị xuất ra PORTD chỉ là 0xff. Bạn nào làm qua rồi giúp mình với, chương trình của mình như sau:
    (Phần cứng con 24C02 mình nối A2,A1,A0 xuống GND, WP lên Vcc, 2 chân SDA và SCL kéo lên dùng R = 10K)

    //Example how to access an Atmel 24C02 256 byte I2C EEPROM:


    /* the I2C bus is connected to PORTB */

    /* the SDA signal is bit 3*/

    /* the SCL signal is bit 4 */

    #asm

    .equ __i2c_port=0x18

    .equ __sda_bit=3

    .equ __scl_bit=4

    #endasm

    /* now you can include the I2C Functions */

    #include <mega16.h>
    #include <i2c.h>

    /* function declaration for delay_ms */
    #include <delay.h>

    #define EEPROM_BUS_ADDRESS 0xa0

    /* read a byte from the EEPROM */
    unsigned char eeprom_read(unsigned char address) {
    unsigned char data;
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS);
    i2c_write(address);
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS | 1);
    data=i2c_read(0);
    i2c_stop();
    return data;
    }

    /* write a byte to the EEPROM */
    void eeprom_write(unsigned char address, unsigned char data) {

    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS);
    i2c_write(address);
    i2c_write(data);
    i2c_stop();

    /* 10ms delay to complete the write operation */
    delay_ms(10);
    }


    void main(void) {

    unsigned char i;

    DDRD = 0xff;
    PORTD = 0x00;

    delay_ms(1000);

    /* initialize the I2C bus */
    i2c_init();

    /* write the byte 55h at address AAh */
    eeprom_write(0xaa,0x55);

    /* read the byte from address AAh */
    i=eeprom_read(0xaa);
    PORTD = i;

    while (1); /* loop forever */
    }

  • #2
    Nguyên văn bởi lahodu Xem bài viết
    Chào các bạn!
    Mình đang test AVR Mega16 dùng Codevision. Mình đang thử chức năng I2C của nó. Trong CodeVision có hỗ trợ hàm I2C sẵn rồi. Mình viết chương trình (dựa vào Code mẫu của CodeVision) ghi một byte vào EEPROM 24C02, sau đó đọc lại và xuất ra PortD. Nhưng không hiểu sao, giá trị xuất ra PORTD chỉ là 0xff. Bạn nào làm qua rồi giúp mình với, chương trình của mình như sau:
    (Phần cứng con 24C02 mình nối A2,A1,A0 xuống GND, WP lên Vcc, 2 chân SDA và SCL kéo lên dùng R = 10K)

    //Example how to access an Atmel 24C02 256 byte I2C EEPROM:


    /* the I2C bus is connected to PORTB */

    /* the SDA signal is bit 3*/

    /* the SCL signal is bit 4 */

    #asm

    .equ __i2c_port=0x18

    .equ __sda_bit=3

    .equ __scl_bit=4

    #endasm

    /* now you can include the I2C Functions */

    #include <mega16.h>
    #include <i2c.h>

    /* function declaration for delay_ms */
    #include <delay.h>

    #define EEPROM_BUS_ADDRESS 0xa0

    /* read a byte from the EEPROM */
    unsigned char eeprom_read(unsigned char address) {
    unsigned char data;
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS);
    i2c_write(address);
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS | 1);
    data=i2c_read(0);
    i2c_stop();
    return data;
    }

    /* write a byte to the EEPROM */
    void eeprom_write(unsigned char address, unsigned char data) {

    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS);
    i2c_write(address);
    i2c_write(data);
    i2c_stop();

    /* 10ms delay to complete the write operation */
    delay_ms(10);
    }


    void main(void) {

    unsigned char i;

    DDRD = 0xff;
    PORTD = 0x00;

    delay_ms(1000);

    /* initialize the I2C bus */
    i2c_init();

    /* write the byte 55h at address AAh */
    eeprom_write(0xaa,0x55);

    /* read the byte from address AAh */
    i=eeprom_read(0xaa);
    PORTD = i;

    while (1); /* loop forever */
    }
    Tui cũng đang gặp vấn đề này, nhưng tôi dùng 24C256. Hình như chân WP nối GND thì mới ghi được bác ạ, bác thử kiểm tra lại xem thế nào.
    Có bác nào làm qua vụ này rồi giúp anh em tôi với. Cảm ơn trước
    Nỏ biết chữ mần răng ký được??!! Thôi nhé.

    Comment


    • #3
      Sorry! Mình nối chân WP xuống GND chứ hông phải Vcc. Nhưng cũng không được luôn. Mình đang dùng phần mềm mô phỏng Proteus. Bạn nào biết chỉ giúp với. Thanks nhé.

      Comment


      • #4
        Wai thiet!!! Thử mô phỏng trên Proteus thì không duoc. Tuc qua minh` thử mắc mạch phần cứng thuc te, ai dze` no lai chay đúng. Pó tay. Các bạn sử dụng Proteus nên chú ý nhé. .

        To thangktvta: Khi bạn dùng con 24C256 thì bạn phải gửi 2 byte Bus address trong khi con 24C02 thì chỉ cần một byte Bus address như trên thôi. Chúc vui.

        Comment


        • #5
          Các bác ạ, em mới nghiên cứu về lĩnh vực này, bác nào gửi cho em phần mềm Proteus cùng key nữa ạ. Em chờ mong tin của các bác.
          thank so.

          Comment


          • #6
            [QUOTE=lahodu;To thangktvta: Khi bạn dùng con 24C256 thì bạn phải gửi 2 byte Bus address trong khi con 24C02 thì chỉ cần một byte Bus address như trên thôi. Chúc vui.[/QUOTE]

            Bác lahodu có thể nói rõ hơn cho em với được không? 2byte address là thế nào? Sao lại phải 2 byte nhỉ?
            Thanks bác!
            Nỏ biết chữ mần răng ký được??!! Thôi nhé.

            Comment


            • #7
              Nguyên văn bởi thangktvta Xem bài viết
              Bác lahodu có thể nói rõ hơn cho em với được không? 2byte address là thế nào? Sao lại phải 2 byte nhỉ?
              Thanks bác!
              Có gì đâu. Nếu bộ nhớ của IC mà vượt 256 byte thì phải dùng 2 byte địa chỉ thôi chứ sao!
              !e

              Comment


              • #8
                Nguyên văn bởi zemen Xem bài viết
                Có gì đâu. Nếu bộ nhớ của IC mà vượt 256 byte thì phải dùng 2 byte địa chỉ thôi chứ sao!
                Bác có thể viết cho em đoạn Code được không? Sao em làm mãi chẳng được!
                Nỏ biết chữ mần răng ký được??!! Thôi nhé.

                Comment


                • #9
                  Nguyên văn bởi thangktvta Xem bài viết
                  Bác có thể viết cho em đoạn Code được không? Sao em làm mãi chẳng được!
                  //Viết thử bằng codevision cho 24c64 nhé

                  //Lúc đầu là khai báo:
                  #asm
                  .equ __i2c_port=0x18 ;PORTB
                  .equ __sda_bit=6
                  .equ __scl_bit=7
                  #endasm
                  #include <i2c.h>

                  #define i2c_addr 0xA0

                  //Sau đó viết hàm đọc và viết 1 byte eeprom qua i2c
                  void I2C_viet(unsigned int dchi, unsigned char dlieu)
                  {
                  i2c_start();
                  i2c_write(i2c_addr);
                  i2c_write(dchi/256); //byte cao
                  i2c_write(dchi%256); //byte thap
                  i2c_write(dlieu);
                  i2c_stop();
                  delay_ms(10); //10ms de viet xong
                  }

                  unsigned char I2C_doc(unsigned int dchi)
                  {
                  unsigned char dlieu;
                  unsigned char dchi_cao;
                  unsigned char dchi_thap;
                  dchi_cao = dchi / 256;
                  dchi_thap = dchi % 256;

                  i2c_start();
                  i2c_write(i2c_addr);
                  i2c_write(dchi_cao);
                  i2c_write(dchi_thap);
                  i2c_start(); //start repeat
                  i2c_write(i2c_addr | 1);
                  dlieu = i2c_read(0); //read end
                  i2c_stop();
                  return dlieu;
                  }

                  //và cuối cùng là trong chương trình main thì gọi hàm tương ứng
                  !e

                  Comment


                  • #10
                    Tôi dùng con 24c512, cũng viết chương trình như bác zemen sao không chạy được. Không biết sai ở đâu. Chán quá.

                    Comment


                    • #11
                      Nguyên văn bởi zemen Xem bài viết
                      //Viết thử bằng codevision cho 24c64 nhé

                      //Lúc đầu là khai báo:
                      #asm
                      .equ __i2c_port=0x18 ;PORTB
                      .equ __sda_bit=6
                      .equ __scl_bit=7
                      #endasm
                      #include <i2c.h>

                      #define i2c_addr 0xA0

                      //Sau đó viết hàm đọc và viết 1 byte eeprom qua i2c
                      void I2C_viet(unsigned int dchi, unsigned char dlieu)
                      {
                      i2c_start();
                      i2c_write(i2c_addr);
                      i2c_write(dchi/256); //byte cao
                      i2c_write(dchi%256); //byte thap
                      i2c_write(dlieu);
                      i2c_stop();
                      delay_ms(10); //10ms de viet xong
                      }

                      unsigned char I2C_doc(unsigned int dchi)
                      {
                      unsigned char dlieu;
                      unsigned char dchi_cao;
                      unsigned char dchi_thap;
                      dchi_cao = dchi / 256;
                      dchi_thap = dchi % 256;

                      i2c_start();
                      i2c_write(i2c_addr);
                      i2c_write(dchi_cao);
                      i2c_write(dchi_thap);
                      i2c_start(); //start repeat
                      i2c_write(i2c_addr | 1);
                      dlieu = i2c_read(0); //read end
                      i2c_stop();
                      return dlieu;
                      }

                      //và cuối cùng là trong chương trình main thì gọi hàm tương ứng
                      chào bác ! chúc bác năm mới, sức khỏe và thành cồng mới ! em cũng đang tìm hiểu về con 24c64 và con d1307 với avr .bác làm ơn cho e hỏi ghép 2 con 24c64 và con ds1307 cung lúc với avr được không ak ? (chân sda và scl của mỗi con kết nối với 1 chân của avr ). em dung codevision mà mở muc i2c thi chi thấy có mỗi con ds1307 mà khoong có con 24cxx nào cả vậy thiết lập chân cẳng cho em nó sao đây a ? và cho em hỏi thêm ! bác giải thích giúp e câu lênh trong chương trình trên của a nhé ! #define i2c_addr 0xA0 em xin chân thanh cảm ơn chỉ bảo của a !

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X