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

                      • tuyennhan
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi tuyennhan
                        Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
                        Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
                        Hôm qua, 07:44
                      • vi van pham
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi vi van pham
                        Cám ơn những lời chúc tốt đẹp của em.

                        Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

                        Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
                        Hôm qua, 02:00
                      • nhathung1101
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi nhathung1101
                        Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                        Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                        Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                        22-02-2025, 22:18
                      • dinhthuong80
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi dinhthuong80
                        Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                        Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                        22-02-2025, 14:51
                      • dinhthuong80
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi dinhthuong80
                        Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                        Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                        22-02-2025, 14:39
                      • dinhthuong80
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi dinhthuong80
                        Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                        Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                        22-02-2025, 14:28
                      • bqviet
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi bqviet
                        Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                        21-02-2025, 20:26
                      • mèomướp
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi mèomướp
                        Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                        21-02-2025, 12:32
                      • vi van pham
                        Trả lời cho Tiếng Anh cho người Việt
                        bởi vi van pham
                        Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                        Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                        20-02-2025, 21:31
                      • bqviet
                        Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                        bởi bqviet
                        Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                        20-02-2025, 17:22
                      Đang tải...
                      X