Thông báo

Collapse
No announcement yet.

Giao tiếp hai AVR bằng phần cứng

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

  • Giao tiếp hai AVR bằng phần cứng

    Mình tìm được tài liệu nói về quá trình truyền nhận giữa 2 AVR như sau (Phần người ta hướng dẫn mình đặt sau dấu "//", còn lại là code mình viết theo hướng dẫn):

    Code:
    //Master Receive
       //Set:TWEN, TWSTA, TWINT and wait for TWINT
       TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
       while (!(TWCR & (1<<TWINT)));
      //Transmit address + R
       TWDR = SLA_R;
       TWCR = (1<<TWINT)|(1<<TWEN);
      //Read data out of TWDR every time TWINT cleared
       while (!(TWCR & (1<<TWINT)));
       DATA = TWDR;
      //After last byte, instead of regular ACK, leave line high
       ??????????
      //Set TWSTO to signal stop
      TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
      //Status registers for arbitration
       ??????????
    
    //Slave Transmit
       //Set address in TWAR, TWEN, TWEA (enable ack)
        TWCR = (1<<TWEN)|(1<<TWEA);
        TWAR = Slave_Add;
       //TWSTA, TWSTO cleared
        TWCR = (1<<TWSTA)|(1<<TWSTO);
       //When AVR hears address + R, it’ll enter transmit mode
       ??????????
       //Put bytes into TWDR, set TWINT and TWEA to acknowledge 
        TWDR = DATA;
        TWCR = (1<<TWINT)|(1<<TWEA);
    Nhờ các bác xem giúp em phần trong dấu ?? em phải viết thế nào? Phần code còn lại em đã làm đúng hướng dẫn chưa?
    Last edited by sphinx; 29-03-2009, 04:47. Lý do: đưa mã vào thẻ <CODE>

  • #2
    Nguyên văn bởi Proturtle Xem bài viết
    Mình tìm được tài liệu nói về quá trình truyền nhận giữa 2 AVR như sau (Phần người ta hướng dẫn mình đặt sau dấu "//", còn lại là code mình viết theo hướng dẫn):

    //Master Receive
    //Set:TWEN, TWSTA, TWINT and wait for TWINT
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    //Transmit address + R
    TWDR = SLA_R;
    TWCR = (1<<TWINT)|(1<<TWEN);
    //Read data out of TWDR every time TWINT cleared
    while (!(TWCR & (1<<TWINT)));
    DATA = TWDR;
    //After last byte, instead of regular ACK, leave line high
    ??????????
    //Set TWSTO to signal stop
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    //Status registers for arbitration
    ??????????

    //Slave Transmit
    //Set address in TWAR, TWEN, TWEA (enable ack)
    TWCR = (1<<TWEN)|(1<<TWEA);
    TWAR = Slave_Add;
    //TWSTA, TWSTO cleared
    TWCR = (1<<TWSTA)|(1<<TWSTO);
    //When AVR hears address + R, it’ll enter transmit mode
    ??????????
    //Put bytes into TWDR, set TWINT and TWEA to acknowledge
    TWDR = DATA;
    TWCR = (1<<TWINT)|(1<<TWEA);

    Nhờ các bác xem giúp em phần trong dấu ?? em phải viết thế nào? Phần code còn lại em đã làm đúng hướng dẫn chưa?
    19 lần đọc và không lần trả lời, số mình hẩm hiu thế sao???

    Comment


    • #3
      Thông cảm đi, tao thấy mọi ng thích xem, nhưng mà code toàn giao tiếp AVR & ROM thôi, nên ai chưa làm thì chịu. Cố đợi nhé cu. Tao đi làm loadcell tiếp đây. Khổ thật, ai biết lọc nhiễu trong công nghiệp ko dạy em 1 ít.

      Comment


      • #4
        Bác Falleaf và bác Minh Hà hình như làm cái này ngon rồi, kính mong các bác bớt chút thời gian xem giùm em.
        Bác nào biết ở đâu dạy mấy cái phần giao tiếp truyền thông như kiểu I2C, SPI, CAN, LIN làm ơn chỉ giúp em.
        Bác nào bán code mẫu thì pm em theo số dt 0904098550.
        Cảm ơn các bác vô cùng!

        Comment


        • #5
          Trời, giờ có cả bán code mẫu à, bạn mua đc thì cho mình mua với nhá, thế này thì AVR thua PIC mất rồi

          Comment


          • #6
            Proturtle nói rõ hơn đi! Bạn đang gi.tiếp 1 con 'master' với 1 con 'slaver' hay giữa các con 'master' với nhau? Hai đoạn mã trên là cho 'master', cho 'slaver' hay cho cả 2?
            Nếu đoạn mã 1 là cho con 'master' khi nhận dữ liệu từ 'slaver' thì mình thấy còn thiếu phần truyền xung NACK (mức cao)
            //After last byte, instead of regular ACK, leave line high
            ??????????
            =>:
            TWCR = (1<<TWINT);
            while (!(TWCR & (1<<TWINT)));
            Nếu đoạn mã 2 là của 1 con 'master' khác thì o thấy nó kiểm tra bus xem có rảnh hay o mà truyền
            Còn nếu đoạn mã 2 là của 1 con 'slaver' truyền dữ liệu về thì nó o đc phép tự khởi tạo và truyền địa chỉ(!?)

            Nói chung dùng TWI hơi bị khó, tài liệu hiếm toàn tự mò nên mình ngâm nó cả tuần mà cũng chỉ bì bõm. Nếu giao tiếp nhiều 'master' thì mình chịu!
            Last edited by zemen; 31-03-2009, 17:26.
            !e

            Comment


            • #7
              Nguyên văn bởi zemen Xem bài viết
              Proturtle nói rõ hơn đi! Bạn đang gi.tiếp 1 con 'master' với 1 con 'slaver' hay giữa các con 'master' với nhau? Hai đoạn mã trên là cho 'master', cho 'slaver' hay cho cả 2?
              Nếu đoạn mã 1 là cho con 'master' khi nhận dữ liệu từ 'slaver' thì mình thấy còn thiếu phần truyền xung NACK (mức cao)
              //After last byte, instead of regular ACK, leave line high
              ??????????
              =>:
              TWCR = (1<<TWINT);
              while (!(TWCR & (1<<TWINT)));
              Nếu đoạn mã 2 là của 1 con 'master' khác thì o thấy nó kiểm tra bus xem có rảnh hay o mà truyền
              Còn nếu đoạn mã 2 là của 1 con 'slaver' truyền dữ liệu về thì nó o đc phép tự khởi tạo và truyền địa chỉ(!?)

              Nói chung dùng TWI hơi bị khó, tài liệu hiếm toàn tự mò nên mình ngâm nó cả tuần mà cũng chỉ bì bõm. Nếu giao tiếp nhiều 'master' thì mình chịu!
              Ôi mừng rơi nước mắt, cảm ơn bạn nhiều nha. Mình đã chú thích, có lẽ chưa rõ. Mình giao tiếp một master và một slave. Đoạn mã đầu là của master khi nó làm việc ở chế độ read data từ slave. Đoạn mã sau là của slave khi nó đáp ứng lại lệnh đọc từ master (tức là transmit ấy mà).
              Bạn làm được I2C giữa hai con AVR rồi ah, mình cũng làm đơn giản là một master đọc dữ liều từ một slave thôi. Bạn giúp mình được không?
              Last edited by Proturtle; 01-04-2009, 12:06.

              Comment


              • #8
                Mình có làm qua giao tiếp TWI 1 con chủ, 1 con tớ, đều ATmega32. Con tớ khi nhận đc dữ liệu từ con chủ sẽ truyền lên máy tính qua UART để kiểm tra.
                Về phần cứng, kết nối như I2C, chú ý có điện trở treo 10k
                Về phần mềm, rất tiếc ch.trình tôi để trên m.tính c.ti, vài hôm nữa sẽ trình bày rõ hơn. Còn cái đoạn mã ở trên của bạn, như tôi đã nói ở trên, phần master nhận cần bổ sung thêm xung NACK. Còn phần 'slaver', chắc bạn viết sai nguyên lí rồi! Bạn cần đọc kĩ lại phần "Slave Transmitter Mode" trong datasheet của ATmega(32 chẳng hạn). Mà bạn đã nạp ch.trình cho v.d.k và chạy thử chưa? Bạn phải sửa phần mềm bao nhiêu lần rồi?
                !e

                Comment


                • #9
                  Nguyên văn bởi zemen Xem bài viết
                  Mình có làm qua giao tiếp TWI 1 con chủ, 1 con tớ, đều ATmega32. Con tớ khi nhận đc dữ liệu từ con chủ sẽ truyền lên máy tính qua UART để kiểm tra.
                  Về phần cứng, kết nối như I2C, chú ý có điện trở treo 10k
                  Về phần mềm, rất tiếc ch.trình tôi để trên m.tính c.ti, vài hôm nữa sẽ trình bày rõ hơn. Còn cái đoạn mã ở trên của bạn, như tôi đã nói ở trên, phần master nhận cần bổ sung thêm xung NACK. Còn phần 'slaver', chắc bạn viết sai nguyên lí rồi! Bạn cần đọc kĩ lại phần "Slave Transmitter Mode" trong datasheet của ATmega(32 chẳng hạn). Mà bạn đã nạp ch.trình cho v.d.k và chạy thử chưa? Bạn phải sửa phần mềm bao nhiêu lần rồi?
                  Cảm ơn Zemen nhiều. Mình đã làm phần cứng và có code để test trên đấy rồi, nhưng có j đó ko ổn nên con master chỉ nhận về 255 (tức là 0xFF). Mình sẽ cố gắng đọc lại data sheet vài lần nữa xem có thông được không.

                  Mình có thắc mắc muốn hỏi là cái phần status code trong data sheet để nhận biết lúc nào cần làm j hay chỉ là để kiểm tra xem trạng thái đường truyền (kiểm tra lỗi và kiểm tra bus rảnh). Con slave có phải dùng ngắt I2C khi khởi tạo từ code vision ko, đoạn code để đáp ứng yêu cầu của master để ở phần ngắt I2C hay để ở trong hàm main.
                  Last edited by Proturtle; 04-04-2009, 00:23.

                  Comment


                  • #10
                    Nguyên văn bởi Proturtle Xem bài viết
                    Cảm ơn Zemen nhiều. Mình đã làm phần cứng và có code để test trên đấy rồi, nhưng có j đó ko ổn nên con master chỉ nhận về 255 (tức là 0xFF). Mình sẽ cố gắng đọc lại data sheet vài lần nữa xem có thông được không.

                    Mình có thắc mắc muốn hỏi là cái phần status code trong data sheet để nhận biết lúc nào cần làm j hay chỉ là để kiểm tra xem trạng thái đường truyền (kiểm tra lỗi và kiểm tra bus rảnh). Con slave có phải dùng ngắt I2C khi khởi tạo từ code vision ko, đoạn code để đáp ứng yêu cầu của master để ở phần ngắt I2C hay để ở trong hàm main.
                    Công việc của mình bận và phải coi lại bài về TWI nên o trả lời bạn ngay được. Là thế này:
                    Nếu 'master' chỉ nhận đc toàn 255 thì tức là 2 con IC o bắt tay đc với nhau, 'master' o kiểm tra xung báo về (ACK) mà là nhận đại, mà do điện trở treo lên nguồn nên SDA luôn bằng 1.
                    Cái 'status code' mà bạn nói đó giúp IC biết đc tình trạng của đg truyền (có phản hồi không? đang bận? xung đột bus?...) từ đó nó biết phải làm gì tiếp theo.
                    Để nhận dữ liệu từ 'master' thì 'slaver' có thể dùng ngắt hoặc không dùng ngắt (khi đó phải luôn kiểm tra cờ TWINT). Các lệnh để xử lí sự th.đổi của ph.cứng TWI (như đọc 'status code', ktra TWINT, truyền ACK,...) được đặt trong ngắt hoặc hàm xử lí nhận byte dữ liệu. Các lệnh để đáp ứng theo sự th.đổi của byte dữ liệu thì để hàm ngoài hoặc main().
                    !e

                    Comment


                    • #11
                      nếu bạn dùng codevision thì nó đã hỗ trợ phần này rồi. bạn chỉ việc vào set master, slave và add cho con slave còn lại thì CV lo hết.

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      • bqviet
                        Trả lời cho Đấu tắt điện cho máy tính bảng
                        bởi bqviet
                        Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                        06-12-2025, 17:17
                      • nguyendinhvan
                        Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                        bởi nguyendinhvan
                        Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                        05-12-2025, 19:59
                      • afrendly
                        Trả lời cho Đấu tắt điện cho máy tính bảng
                        bởi afrendly
                        Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                        04-12-2025, 01:27
                      • nick22
                        Trả lời cho Máy điện châm ?
                        bởi nick22
                        Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                        01-12-2025, 13:23
                      Đang tải...
                      X