Thông báo

Collapse
No announcement yet.

Truyền nhận dữ liệu đồng thời

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

  • Truyền nhận dữ liệu đồng thời

    Em mới tìm hiểu về AVR! AVR thực hiện truyền nhận dữ liệu thông qua uart hoặc usart. Nhưng trên VDK chỉ có 1 cổng TxD và 1 cổng RxD. Các anh chị cho em hỏi AVR có thể đồng thời vừa nhận là vừa phát dữ liệu được không? Chẳng hạn em muốn kết nối VDK đến 1 đầu cuối dữ liệu để nhận dữ liệu đồng thời truyền dữ liệu tới 1 IC khác.
    Mong các anh chị giúp đỡ em với!
    (Nếu có sơ đồ kết nối và code chương trình để tham khảo thì tốt quá!)
    EM xin cảm ơn!

  • #2
    Được!
    Có thể truyền-nhận đồng thời được.
    Nhưng lưu ý thế này: thực chất của việc truyền nhận đồng thời là thực hiện luân phiên việc truyền và nhận. Quá trình luân phiên này xảy ra rất nhanh, nên ta vẫn có thể xem như là Truyền nhận đồng thời.
    :-)

    Comment


    • #3
      Đúng là có thể truyền nhận đồng thời, vì USART của AVR là song công. Dữ liệu đi và đến là do 2 khối phần cứng khác nhau trong USART đảm nhiệm, xử lý song song cùng 1 lúc. Tôi không hiểu ý của pavo_lusa khi viết:
      Nhưng lưu ý thế này: thực chất của việc truyền nhận đồng thời là thực hiện luân phiên việc truyền và nhận. Quá trình luân phiên này xảy ra rất nhanh, nên ta vẫn có thể xem như là Truyền nhận đồng thời.
      Việc luân phiên này do user hay phần cứng của AVR thực hiện?

      Thân mến,
      blackmoon.

      Comment


      • #4
        Nguyên văn bởi blackmoon Xem bài viết
        Đúng là có thể truyền nhận đồng thời, vì USART của AVR là song công. Dữ liệu đi và đến là do 2 khối phần cứng khác nhau trong USART đảm nhiệm, xử lý song song cùng 1 lúc. Tôi không hiểu ý của pavo_lusa khi viết:

        Việc luân phiên này do user hay phần cứng của AVR thực hiện?

        Thân mến,
        blackmoon.
        Đúng như bác blackmoon nói avr có thể tryuền nhận đồng thời qua uart do phần ứng đảm nhiệm nếu bạn sử dụng ngắt. bạn phải nói rõ bạn viết code bằng c hay asm để mọi người tiện giúp đở bạn. thân chào!

        Comment


        • #5
          Nguyên văn bởi blackmoon Xem bài viết
          Đúng là có thể truyền nhận đồng thời, vì USART của AVR là song công. Dữ liệu đi và đến là do 2 khối phần cứng khác nhau trong USART đảm nhiệm, xử lý song song cùng 1 lúc. Tôi không hiểu ý của pavo_lusa khi viết:

          Việc luân phiên này do user hay phần cứng của AVR thực hiện?

          Thân mến,
          blackmoon.
          Theo bạn là AVR có thể đồng thời xử lý 2 dòng thông tin nhận và gửi ?
          nói như thế cũng được. Nhưng đó chỉ là cách nói thôi. Mình ko phản đối.
          Mình đang nói đến khả năng vật lý của phần cứng. Nếu xét ở đơn vị thời gian tính bằng micro giây, thì quá trình xử lý đó ko phải là song song nữa, mà là 2 quá trình được thực hiện luân phiên nhau.
          Để rõ ý trên, tôi lấy 1 ví dụ trực quan: người ta đưa cho bạn cùng lúc 2 cái giỏ giỏ, trong đó 1 giỏ đựng cam, 1 giỏ đựng quýt, yêu cầu bạn bóc vỏ. đầu tiên, bạn nhặt 1 quả cam bóc vỏ xong rồi vứt cho ngừoi ta, sau đó nhặt 1 quả quýt bóc vỏ rồi vứt cho người ta, rồi lại 1 quả cam khác, rồi lại quả quýt khác ...Hoặc có thể đợi khi bóc xong hết, thì bạn có thể dùng 2 tay đẩy trả 2 cái giỏ đó cho người ta cùng lúc. Người ta sẽ nói rằng: bạn có khả năng đồng thời nhận, bóc(xử lý) và đẩy đi (gửi đi) đồng thời 2 giỏ quýt và cam. Nhưng thực ra là bạn bóc(xử lý) luân phiên 2 loại quả, chứ ko phải cùng 1 lúc tay bạn bóc cả quýt và cam.
          Trong AVR cũng vậy. 2 dòng thông tin sẽ được xử lý luân phiên nhau với những khoảng thời gian luân phiên rất rất rất nhỏ. Ta ko nhận ra được khoản thời gian này bằng giác quan thường... nên có thể nói 2 dòng thông tin được xử lý đồng thời.

          Mình nói vậy ko biết có gì sơ sót ? mong được góp ý!
          Last edited by pavo_lusa; 24-02-2009, 21:05.
          :-)

          Comment


          • #6
            @pavo_lusa:
            Có thể chúng ta đều hiểu đúng về việc truyền nhận dữ liệu đồng thời trong AVR. Chỉ có điều tôi đưa ra quan điểm trên phương diện đường truyền vật lý thực sự, còn bạn đưa ra quan điểm để đánh giá cách thức xử lý dữ liệu.
            Đối với đường truyền vật lý, tức là nói về việc thu nhận (hoặc phát đi) các bit dữ liệu, thì việc này được thực hiện một cách hoàn toàn tự động bởi 2 khối phần cứng khác nhau thuộc USART. Các bit dữ liệu trong bộ đệm phát đi sẽ được 1 khối phần cứng phụ trách việc phát đi trên chân TxD. Ngược lại, các bit dữ liệu trên chân RxD sẽ được 1 khối phần cứng khác phân tích và nhận về, đưa vào bộ đệm nhận. Hai phần cứng, kể cả 2 thanh ghi dữ liệu, là độc lập, nên các bit phát đi/nhận về có thể xảy ra đồng thời, không cần đến sự "quan tâm" của CPU. CPU chỉ quan tâm ở cấp độ byte nhận được/phát đi đầy đủ mà thôi.
            Đối với ý kiến của bạn, đó là về cách thức xử lý của CPU khi bộ đệm truyền/nhận đã đủ 1 byte. CPU thì chỉ có 1, nên phải xử lý lần lượt 2 bộ đệm: truyền và nhận. User phải tính toán code sao cho đủ nhanh, phù hợp với ứng dụng, để việc xử lý bộ đệm này không quá chậm gây ra mất dữ liệu của bộ đệm kia (dữ liệu mới đến sau đè lên). Như đã nói, việc này là việc của CPU (hay chính là của user), không phải việc của USART. Vì vậy nếu nói bản chất của USART là song công (truyền/nhận dữ liệu đồng thời) thì người ta chỉ nói đến khía cạnh truyền nhận vật lý được thực hiện tự động bởi nó chứ không tính đến việc xử lý của user. Nếu user không xử lý kịp dữ liệu, sẽ chẳng có USART nào đảm bảo tính song công cả.

            Thân mến,
            blackmoon.

            Comment


            • #7
              Em tập viết chương trình bằng C. Các bác ơi, ý em là cùng 1 lúc AVR liên kết với 2 đầu cuối mà, trong khi nó chỉ có 1 uart. 2 chân Tx và Rx của AVR nối với đầu cuối này, còn đầu cuối kia thì kết nối thê nào? (nếu ko dùng loại AVR có 2 usart). Kết nối với đầu cuối còn lại qua SPI đc ko các bác? Nếu được thì cơ chế của nó thế nào khi vừa dùng SPi lại vừa dùng uart???

              Comment


              • #8
                Nguyên văn bởi blackmoon Xem bài viết
                @pavo_lusa:
                Có thể chúng ta đều hiểu đúng về việc truyền nhận dữ liệu đồng thời trong AVR. Chỉ có điều tôi đưa ra quan điểm trên phương diện đường truyền vật lý thực sự, còn bạn đưa ra quan điểm để đánh giá cách thức xử lý dữ liệu.
                Đối với đường truyền vật lý, tức là nói về việc thu nhận (hoặc phát đi) các bit dữ liệu, thì việc này được thực hiện một cách hoàn toàn tự động bởi 2 khối phần cứng khác nhau thuộc USART. Các bit dữ liệu trong bộ đệm phát đi sẽ được 1 khối phần cứng phụ trách việc phát đi trên chân TxD. Ngược lại, các bit dữ liệu trên chân RxD sẽ được 1 khối phần cứng khác phân tích và nhận về, đưa vào bộ đệm nhận. Hai phần cứng, kể cả 2 thanh ghi dữ liệu, là độc lập, nên các bit phát đi/nhận về có thể xảy ra đồng thời, không cần đến sự "quan tâm" của CPU. CPU chỉ quan tâm ở cấp độ byte nhận được/phát đi đầy đủ mà thôi.
                Đối với ý kiến của bạn, đó là về cách thức xử lý của CPU khi bộ đệm truyền/nhận đã đủ 1 byte. CPU thì chỉ có 1, nên phải xử lý lần lượt 2 bộ đệm: truyền và nhận. User phải tính toán code sao cho đủ nhanh, phù hợp với ứng dụng, để việc xử lý bộ đệm này không quá chậm gây ra mất dữ liệu của bộ đệm kia (dữ liệu mới đến sau đè lên). Như đã nói, việc này là việc của CPU (hay chính là của user), không phải việc của USART. Vì vậy nếu nói bản chất của USART là song công (truyền/nhận dữ liệu đồng thời) thì người ta chỉ nói đến khía cạnh truyền nhận vật lý được thực hiện tự động bởi nó chứ không tính đến việc xử lý của user. Nếu user không xử lý kịp dữ liệu, sẽ chẳng có USART nào đảm bảo tính song công cả.

                Thân mến,
                blackmoon.
                Bạn nói đúng, ví dụ chứng minh nhé: Thử nối chân RX và TX của VĐK, nhận dữ liệu bằng ngắt, thử gởi 1 byte dữ liệu xem rồi sau đó kiểm tra byte nhận được, có giống với byte đã truyền không là biết liền thôi

                @traitimkho: Mình biết 1 cách thế này, dùng bộ đệm 16byte đễ nhận dữ liệu
                PHP Code:
                unsigned char RxR=0RxW=0buffer[16];
                //receiver serial interrupt 
                void rda_isr() {
                   
                buffer[RxW] = getc();
                   
                RxW++;
                   
                RxW&=0x0F;
                }

                void main() {
                   
                //init UART, interrupt...
                  
                while(1) {
                  
                putc('c');//gởi du lieu
                  
                if(RxR != RxW) {
                     
                //xử lý byte nhận được ở đây
                    
                RxR++;
                    
                RxR&=0x0F;
                  }
                 }

                thử xem nhé
                Diễn đàn Vi điều khiển:

                Comment


                • #9
                  Đồng ý là AVR có thể truyền nhận song song do 2 khối phần cứng thực hiện độc lập. Nhưng chưa thể nói là xử lý song song được !
                  tôi hiểu ý bạn, và cũng tin rằng bạn hiểu ý tôi.
                  Cảm ơn bạn vì đã bổ sung !
                  Thân mến!
                  :-)

                  Comment


                  • #10
                    Nguyên văn bởi minhtuan04 Xem bài viết
                    Bạn nói đúng, ví dụ chứng minh nhé: Thử nối chân RX và TX của VĐK, nhận dữ liệu bằng ngắt, thử gởi 1 byte dữ liệu xem rồi sau đó kiểm tra byte nhận được, có giống với byte đã truyền không là biết liền thôi

                    thử xem nhé
                    Cách thử này ko thể khẳng định được về khả năng xử lý dữ liệu song song! Nhận cùng kết quả thì chưa có nghĩa là 2 lệnh được xử lý cùng lúc.
                    Xét trong khoảng thời gian dT nào đó đủ lớn thì có cảm giác như 2 dòng thông tin truyền và nhận đồng thời, nhưng nếu băm thời gian ra nhỏ hơn, bạn sẽ thấy chúng làm việc ko song song.
                    :-)

                    Comment


                    • #11
                      Cái gì cũng có giới hạn mà bạn. Băm nhỏ đến đâu thì nhận ra dc giới hạn đó!?
                      VDK là hệ thống tích hợp nhiều khối vi mạch trong đó. Khối RXD và TXD là 2 vi mạch độc lập, do đó 2 dòng thông tin truyền nhận sẽ độc lập=> đồng thời. CPU o can thiệp dc vào quá trình đó mà chỉ tác động đến đầu ra và đầu vào của nó thôi! Bạn đã thử cùng một lúc cho 1 con truyền và 1 con nhận xem 2 dòng thông tin có đc truyền nhận đồng thời không!?
                      !e

                      Comment


                      • #12
                        Kết nối AVR với 2 đầu cuối

                        Nguyên văn bởi traitimkho Xem bài viết
                        Em tập viết chương trình bằng C. Các bác ơi, ý em là cùng 1 lúc AVR liên kết với 2 đầu cuối mà, trong khi nó chỉ có 1 uart. 2 chân Tx và Rx của AVR nối với đầu cuối này, còn đầu cuối kia thì kết nối thê nào? (nếu ko dùng loại AVR có 2 usart). Kết nối với đầu cuối còn lại qua SPI đc ko các bác? Nếu được thì cơ chế của nó thế nào khi vừa dùng SPi lại vừa dùng uart???
                        Nếu là kết nối với 2 đầu cuối, bạn có thể dùng AVR làm master, 2 đầu cuối kia như 2 slave.
                        Kết nối vật lý: TxD của AVR nối với 2 RxD của 2 đầu cuối. RxD của AVR nối với 2 TxD của 2 đầu cuối.
                        Giao thức: áp dụng Multi-Processor Communication Mode của USART của AVR. Master sẽ lần lượt trao đổi thông tin với 2 Slave, đảm bảo không xung đột dữ liệu trên bus.

                        Thân mến,
                        blackmoon.

                        Comment


                        • #13
                          Nguyên văn bởi pavo_lusa Xem bài viết
                          Theo bạn là AVR có thể đồng thời xử lý 2 dòng thông tin nhận và gửi ?
                          nói như thế cũng được. Nhưng đó chỉ là cách nói thôi. Mình ko phản đối.
                          Mình đang nói đến khả năng vật lý của phần cứng. Nếu xét ở đơn vị thời gian tính bằng micro giây, thì quá trình xử lý đó ko phải là song song nữa, mà là 2 quá trình được thực hiện luân phiên nhau.
                          Để rõ ý trên, tôi lấy 1 ví dụ trực quan: người ta đưa cho bạn cùng lúc 2 cái giỏ giỏ, trong đó 1 giỏ đựng cam, 1 giỏ đựng quýt, yêu cầu bạn bóc vỏ. đầu tiên, bạn nhặt 1 quả cam bóc vỏ xong rồi vứt cho ngừoi ta, sau đó nhặt 1 quả quýt bóc vỏ rồi vứt cho người ta, rồi lại 1 quả cam khác, rồi lại quả quýt khác ...Hoặc có thể đợi khi bóc xong hết, thì bạn có thể dùng 2 tay đẩy trả 2 cái giỏ đó cho người ta cùng lúc. Người ta sẽ nói rằng: bạn có khả năng đồng thời nhận, bóc(xử lý) và đẩy đi (gửi đi) đồng thời 2 giỏ quýt và cam. Nhưng thực ra là bạn bóc(xử lý) luân phiên 2 loại quả, chứ ko phải cùng 1 lúc tay bạn bóc cả quýt và cam.
                          Trong AVR cũng vậy. 2 dòng thông tin sẽ được xử lý luân phiên nhau với những khoảng thời gian luân phiên rất rất rất nhỏ. Ta ko nhận ra được khoản thời gian này bằng giác quan thường... nên có thể nói 2 dòng thông tin được xử lý đồng thời.

                          Mình nói vậy ko biết có gì sơ sót ? mong được góp ý!
                          bro đi lạc đề so với câu hỏi!
                          thế nào là truyền nhận đồng thời? truyền nhận đồng thời có nghĩa là trong lúc nó đang truyền dữ liệu nó vẫn có thể nhận dữ liệu. còn vấn đề xử lý dữ liệu truyền và nhận lại là một vấn đề khác tùy thuộc vào trình độ lập trình của mỗi người( có sử dụng ngắt hay không).nếu bạn đã lập trình bằng ngôn ngữ asm thì bạn sẽ thấy rõ điều đó.
                          có gì đụng chạm đến lòng tự ái của bạn thì xin bỏ qua cho! bởi lẽ khoa học là chính xác bạn ạ

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X