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

                      Đang tải...
                      X