Giao thức TCP/IP và Web server với AVR

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • nttam79
    Thành viên tích cực
    • Feb 2009
    • 152

    #226
    Nguyên văn bởi sotuoi Xem bài viết
    Chào Thầy,

    Module WIFI giao tiếp mạng MRF24WB0MA có thể mua ở đâu vậy? Em muốn mua một cái về nghiên cứu.
    Driver cho module này có phức tạp không, mình có thể sài chung TCP/IP stack dùng cho con ENC28j60
    Em thử vào microchip tìm mà không down được source code cho con wifi này. Thầy có thể gởi em source code hay driver để có thể sử dụng với webserver không?

    Cám ơn thầy,
    THANH NHI
    Module này ở SG mua tại Công ty TNHH Thương Mại và Giao Nhận R&P, 58/48 Nguyễn Minh Hoàng – Phường 12 – Quận Tân Bình, Tel (08) 38119870.
    Nó xài chung TCP/IP stack với ENC28j60, chỉ khác NIC driver.
    Thư viện driver cho MRF24WB0MA, sample code, TCP/IP stack,... download ở đây: Microchip Application Libraries. File lớn nên ko thể gửi qua mail được. Bạn down và cài vào sẽ có đầy đủ source code.

    Comment

    • nttam79
      Thành viên tích cực
      • Feb 2009
      • 152

      #227
      Nguyên văn bởi vuxuansyhut Xem bài viết
      Em chào thày Tâm và các bạn. Em mới tìm hiểu về ethernet sử dụng avr theo hướng dẫn của thày Tâm. Em có 1 số điều không hiểu lắm xin Thày Tâm và các bạn giải thích giúp.
      1. Trong file ethernet.h có đoan khai báo macro
      #ifndef ETHERNET_BUFFER_SIZE
      #define ETHERNET_BUFFER_SIZE (700+ETH_HEADER_LEN+IP_HEADER_LEN+TCP_HEADER_LEN)
      #endif
      số 700 đó có phải là do mình tự chọn không để phù hợp với dung lượng Ram của MCU.
      2. Ở trong file icmp.c trong hàm icmpEchoReply. Nếu theo như sơ đồ về luồng dữ liệu vào ra các lớp và các hàm sử dụng thì hàm này sẽ cung cấp dữ liệu cho hàm ipsend rồi tới hàm ethSendFrame sẽ tiếp tục gửi dữ liệu. Nhưng trong code lại không có sự tham gia của các hàm theo trình tự như vậy.
      .Xin mọi người giúp đỡ[ATTACH=CONFIG]41615[/ATTACH]

      3. Trong file arp.c hàm arpUpdateEntry. Giải thuật áp dụng là tim entry có cùng ip, nếu tìm thấy thì update giá trị time to live. Nếu không tìm thấy entry cùng ip thì tìm entry có time to live =0 rồi tiến hành update. Khi không thỏa mãn các điều kiện trên thì...mặc kệ. Như vậy cảm giác không ổn lắm. Có cách nào vẫn lưu được entry cần update không ah.
      1-Đúng. Số 700 là do mình chọn cho phù hợp với dung lượng RAM của CPU, nó chính là kích thước tối đa của 1 segment TCP mà ta có thể nhận (MSS- Maximum segment size). Theo giao thức TCP/IP thì giá trị này maximum là 1460, do MSS + IP_HEADER_LEN+TCP_HEADER_LEN ≤ MTU (MTU - Maximum Transmission Unit = 1500 đối với ethernet). Tuy nhiên tùy thuộc vào dung lượng bộ nhớ RAM mà ta có thể khai báo nó nhỏ hơn, kích thước này sẽ ảnh hưởng đến việc giao thức TCP chia các gói tin.
      2-Bạn phát hiện rất chính xác. Đúng ra thì phải theo trình tự như vậy, nhưng ở đây ta làm khác đi để giảm công việc cho CPU. Lý do là: đúng ra thì hàm icmpEchoReply phải tạo lại khung icmp, với các field tương ứng với bản tin EchoRequest mà ta nhận được, sau đó gọi ipSend để gửi đi. Nhưng vì khi nhận được bản tin EchoRequest, ta đã có nội dung bản tin này trên buffer. Giữa nội dung bản tin Echo Reply và Echo Request chỉ khác nhau 1 vài trường địa chỉ. Do đó ở đây ta lợi dụng điều nay: chỉ hoán đổi 1 số trường địa chỉ trên bản tin Echo Request có sẵn để biến nó thành bản tin Echo Reply rồi gọi thẳng ARP để phân giải địa chỉ và gọi hàm của lớp Ethernet để gửi dữ liệu đi luôn. Nếu muốn bạn có thể sửa lại cho đúng chuẩn.
      3-À, bạn hỏi toàn những chổ rất thú vị, rất đáng để thảo luận thêm và sửa đổi để hoàn thiện source code thêm. Thực ra ở chổ này mình củng đã tham khảo các code khác và có thể có 1 cách giải quyết khác là xóa entry có TTL nhỏ nhất để update entry mới. Một số code thậm chí xóa đại 1 entry nào đó để cập nhật entry mới. Tất cả cũng chỉ vì RAM nhỏ quá mà thôi .

      Comment

      • nacdanh90
        Thành viên tích cực
        • Feb 2011
        • 181

        #228
        Anh Tâm giải thích giúp em trong hàm đọc dữ liệu từ thanh ghi của ENC28j60(enc28j60SPIRead) qua giao tiếp SPI lại gửi thêm 8 bits 0 nữa nếu address & 0x80 != 0 ạ?

        if(address & 0x80){
        SPDR = 0x00;
        while(!((SPSR) & (1<<SPIF)));
        }

        Comment

        • vuxuansyhut
          Thành viên tích cực
          • Jul 2009
          • 303

          #229
          Xin phép thày Tâm trả lời bạn nacdanh90. Bạn xem ở trong datasheet của enc28j60.Click image for larger version

Name:	untitled.JPG
Views:	1
Size:	41.6 KB
ID:	1358817

          Phải có 1 dummy byte rồi mới có dữ liệu trả lời
          Last edited by vuxuansyhut; 19-03-2012, 09:17.

          Giải pháp điện tử của bạn

          Comment

          • nttam79
            Thành viên tích cực
            • Feb 2009
            • 152

            #230
            Nguyên văn bởi vuxuansyhut Xem bài viết
            Xin phép thày Tâm trả lời bạn nacdanh90. Bạn xem ở trong datasheet của enc28j60.[ATTACH=CONFIG]41796[/ATTACH]

            Phải có 1 dummy byte rồi mới có dữ liệu trả lời
            Rất chính xác, thanks vuxuansyhut. Mong được cùng trao đổi các vấn đề kỹ thuật với bạn.

            Comment

            • vuxuansyhut
              Thành viên tích cực
              • Jul 2009
              • 303

              #231
              Cám ơn thày đã lập 1 luồng vô cùng bổ ích.

              Giải pháp điện tử của bạn

              Comment

              • nacdanh90
                Thành viên tích cực
                • Feb 2011
                • 181

                #232
                Vâng ạ! Em cảm ơn anh vuxuansyhut ! Em xin phép gọi thầy Tâm là thầy! Em cảm ơn thầy rất nhiều vì thầy đã mở ra tut này!

                Comment

                • sotuoi
                  Thành viên mới
                  • Jun 2008
                  • 10

                  #233
                  Nguyên văn bởi nttam79 Xem bài viết
                  Module này ở SG mua tại Công ty TNHH Thương Mại và Giao Nhận R&P, 58/48 Nguyễn Minh Hoàng – Phường 12 – Quận Tân Bình, Tel (08) 38119870.
                  Nó xài chung TCP/IP stack với ENC28j60, chỉ khác NIC driver.
                  Thư viện driver cho MRF24WB0MA, sample code, TCP/IP stack,... download ở đây: Microchip Application Libraries. File lớn nên ko thể gửi qua mail được. Bạn down và cài vào sẽ có đầy đủ source code.
                  Em cám ơn thầy nhiều.

                  Comment

                  • sotuoi
                    Thành viên mới
                    • Jun 2008
                    • 10

                    #234
                    Đáp lại lòng nhiệt tình của thầy, em gởi source code viết trên stm32f103rd port từ source code của thầy.
                    Bạn có thể tham khảo con này tại trang arm.vn
                    Con này RAM, ROM đều nhiều, lập trình đon giản, thư viện có sẳn. Giá thành rẻ tương đương avr.
                    Attached Files
                    Last edited by sotuoi; 20-03-2012, 11:16.

                    Comment

                    • sotuoi
                      Thành viên mới
                      • Jun 2008
                      • 10

                      #235
                      Chào Thầy Tâm,

                      Cho em hỏi, khi mạch mình kết nối vào web server trên internet (đang trạng thái giử kết nối), làm thế nào gói tin HTTP response từ server đó chạy đúng đường về tới mạch của mình. Vì lúc này ip của web server là ip WAN, còn ip mạch mình chỉ là ip LAN.

                      THANH NHI

                      Comment

                      • tieuthienho
                        Thành viên mới
                        • Mar 2008
                        • 6

                        #236
                        Help!

                        Chào thầy Tâm và các bạn!
                        Em đang làm đồ án về điều khiển từ xa qua Internet. Mạch của em xài PIC18f4620 và enc28j60 (board của hlab.com), dùng eeprom trong của PIC. Framework là MCHP TCPIP Stack v5.10. Sau khi sửa code phù hợp và tạo img của trang web, đã compile thành công bằng trình dịch MPLAB C18 và nạp vào pic. Nối board trực tiếp với máy tính, em chỉ ping được tới board mà không mở được trang web nhúng vào đó. Em gửi code của em lên mong thầy Tâm và mọi người xem giúp nó bị lỗi gì.
                        Microchip Solutions.rar

                        Comment

                        • nacdanh90
                          Thành viên tích cực
                          • Feb 2011
                          • 181

                          #237
                          Thầy cho em hỏi trong hàm : enc28j60PacketReceive thầy viết em thấy đoạn đọc con trỏ của packet tiếp theo(Next Packet Pointer) , đọc chiều dài của packet và biến rxstat em thấy giá trị của nó giống nhau? Tại sao ta lại phải đọc nó tại địa chỉ 0? Thầy giải thích rõ hơn một chút về hàm này giúp em được không ạ?Em cảm ơn thầy!

                          Comment

                          • vuxuansyhut
                            Thành viên tích cực
                            • Jul 2009
                            • 303

                            #238
                            Các bạn khi đọc code của thày Tâm nếu có điều kiện hãy đọc thêm Datasheet của enc28j60 sẽ có thêm nhiều hiểu biết sâu sắc hơn về phần cứng cũng như ý đồ của người lập trình.
                            Last edited by vuxuansyhut; 21-03-2012, 00:41.

                            Giải pháp điện tử của bạn

                            Comment

                            • vuxuansyhut
                              Thành viên tích cực
                              • Jul 2009
                              • 303

                              #239
                              Lại xin phép thày Tâm trả lời bạn nacdanh90. Xin thày bỏ qua cho em. Sai thì thày đừng cười nhé. Hihi. Buffer của enc28j60 được truy cập theo cơ chế FIFO tức first in first out. Nó giống như stack (ngăn xếp ) của vi điều khiển ở chỗ đã lấy ra là ngăn xếp lại được dồn xuống (ở mcu là dồn lên vì cơ chế mcu là LIFO - last in first out). Nên khi bạn thấy chương trình đọc 2 lần ở địa chỉ 0 thì không phải sai đâu. Bạn có thể tham khảo trang 19 của datasheet enc28j60.
                              Còn tại sao nó lại ở địa chỉ 0 thì bạn có thể tham khảo trang 43 Click image for larger version

Name:	2.jpg
Views:	1
Size:	252.8 KB
ID:	1358911
                              trong đó cho biết 2 byte đầu của buffer nhận là Next Packet Pointer
                              Attached Files
                              Last edited by vuxuansyhut; 21-03-2012, 00:54.

                              Giải pháp điện tử của bạn

                              Comment

                              • nacdanh90
                                Thành viên tích cực
                                • Feb 2011
                                • 181

                                #240
                                Em cảm ơn anh vuxuansyhut. Không sao mà anh! Chắc thầy Tâm không trách anh đâu! Anh rất nhiệt tình với những thắc mắc về code thầy viêt của những người ở trình độ gà như em mà.hi! Em cũng vừa đọc code của thầy+ vừa đọc code trên mạng+ đọc datasheet với mục đích để hiểu tại sao thầy lại viết như vậy chứ ko phải chỉ copy code của thầy và build. Nhưng em lại có một thắc mắc, Em tưởng chỉ có phần đầu của buffer truyền mới bắt đầu tại địa chỉ 0000h. Còn bắt đầu của packet nhận được nó phải là địa chỉ đầu của buffer nhận(0x0600 ) chứ anh? Phần này em chưa thông lắm, thầy và anh có thể giải thích giúp em được không ạ?

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...