Thông báo

Collapse
No announcement yet.

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

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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


    • 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


      • 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


        • 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, 10:17.

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

          Comment


          • 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


            • 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


              • 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


                • 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


                  • Đá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, 12:16.

                    Comment


                    • 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


                      • 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


                        • 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


                          • 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, 01:41.

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

                            Comment


                            • 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, 01:54.

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

                              Comment


                              • 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...
                                X