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

  • yamailuk
    replied
    uhm, với lại sửa mấy cái define của ENC nữa thì phải cái này hỏi a chikichita đó . Do mình làm báo cáo xong rồi nên k up lên 128 mặc dù còn rất nhiều ý tưởng

    Leave a comment:


  • stevenboy
    replied
    làm trên con 32 ok rồi h fai bắt chuyển wa 128 sửa lại hoài mà vẫn chay nữa. hix hix. khi chuyển từ 32 sang 128 mình chỉ cần thay đổi chân của giao tiếp SPI, uart, với timer, thôi đúng ko vậy Yamailuk. có thể giúp mình dc ko

    Leave a comment:


  • yamailuk
    replied
    Nguyên văn bởi stevenboy Xem bài viết
    Ai cho e hỏi cách chuyển sang ATmega128 dùng thạch anh ngoài 7.3728M mình có cần khai báo F_CPU lại thành 7.3728 ko. và cái thạch anh này có ảnh hưởng gì đến usart ko vậy??? và hàm SIGNAL(SIG_UART0_TRANS), SIGNAL(SIG_UART0_RECV) 2 hàm này có tác dụng gì vậy?? Mong dc giúp đỡ
    Có chứ, Baud nó phụ thuộc vào tần số thạch anh mà. UART ở đây thầy dùng để dubug lỗi. Nếu bạn làm thành công thì có thể bỏ luôn nó.

    Leave a comment:


  • stevenboy
    replied
    Ai cho e hỏi cách chuyển sang ATmega128 dùng thạch anh ngoài 7.3728M mình có cần khai báo F_CPU lại thành 7.3728 ko. và cái thạch anh này có ảnh hưởng gì đến usart ko vậy??? và hàm SIGNAL(SIG_UART0_TRANS), SIGNAL(SIG_UART0_RECV) 2 hàm này có tác dụng gì vậy?? Mong dc giúp đỡ

    Leave a comment:


  • chikichita
    replied
    nhìn bạn ga_kon có cái mô hình đẹp quá, , dạo này việc nhiều quá vẫn chưa có thời gian làm tiếp đề tài nữa, mới chỉ đang dừng lại tắt mở đèn trong bếp với đèn phòng, tranh thủ lúc đang ôm laptop làm biếng đi bật công tắc
    công nhận đề tài này hot quá hot, quá nhiều ý tưởng để phát triển, hy vọng càng ngày càng nhiều bạn tham gia tranh luận cho đề tài thêm phong phú. Click image for larger version

Name:	Noname.jpg
Views:	1
Size:	76.5 KB
ID:	1379089
    hình layout cho bạn nào muốn dùng IC điều khiển bóng đèn 220AC

    Leave a comment:


  • yamailuk
    replied

    Reading Switches and Analog Inputs using Ajax
    Ai muốn thì phát triển lên nhé, mình nản quá

    Leave a comment:


  • cowboy_188
    replied
    Nguyên văn bởi ga_kon Xem bài viết
    Sản phẩm mới ra lò! SAM4195 - YouTube ^^ . . . hi vọng nó thêm chút động lực để các pác trong topic cố gắng tìm hiểu!
    À, cho em hỏi, chơi luôn cái "camera quan sát (loại có địa chỉ IP luôn)" thì làm thế nào ta? Chắc là cho cái con ATmega32 qua một bên quá ta! ^^
    À, cái nữa em thắc mắc, chuyển qua 3G thì chắc là khác hẳn luôn bên này hả ta? Vì nghe đâu có liên quan đến GSM . . .^^
    hay đấy, mình sắp xong rồi, khi nào có gì mình sẽ hỏi bạn

    Còn 1 vấn đề này thấy nhiều người gặp phải mà ko biết ai giải quyết chưa. Lúc đầu ping mạch bình thường, nhưng sau đó khi lướt web trên lap hay pc thì ping rất khó, thường đợi 1 thời gian ping lại mới được. như là ic ethernet bị đứng vậy.
    Mình có Debug thử và thấy mỗi khi có 1 frame (có type là IP, nó nhảy qua Ipprocess rồi được đưa về dạng giao thức UDP/IP. Tuy nhiên khi check trường bootp.opcode thì ko có dạng reply hay request, tạm gọi là unkown) đến thì làm cho ic bị đứng và ko nhận frame được nữa, chờ đủ vài giây cho nó tự khởi động lại mới ping dc.
    Sau đó mình có thử thêm ethInit(); vào sau đk if lúc check dạng opcode của UDP thì ok, ping tốt.
    if((packet->bootp.opcode != BOOTP_OP_BOOTREPLY) || (packet->bootp.transid != DhcpTransactID)){
    ethInit();return;}
    Cái mình thắc mắc là tại sao 1 packet dạng giao thức UDP (nhưng ko phải replay hay request) lại làm đơ cả ic :-j
    Last edited by cowboy_188; 17-05-2013, 18:43.

    Leave a comment:


  • ga_kon
    replied
    Sản phẩm mới ra lò! SAM4195 - YouTube ^^ . . . hi vọng nó thêm chút động lực để các pác trong topic cố gắng tìm hiểu!
    À, cho em hỏi, chơi luôn cái "camera quan sát (loại có địa chỉ IP luôn)" thì làm thế nào ta? Chắc là cho cái con ATmega32 qua một bên quá ta! ^^
    À, cái nữa em thắc mắc, chuyển qua 3G thì chắc là khác hẳn luôn bên này hả ta? Vì nghe đâu có liên quan đến GSM . . .^^

    Leave a comment:


  • cowboy_188
    replied
    thầy ơi cho em hỏi

    1.em tính điều khiển 1 hệ thống qua websever, tuy nhiên nếu em ko có dây Lan để kéo vào port RJ45 đó thì có cách sử dụng mạng wifi ko
    nếu quá rắc rối thì có thể mua thiết bị chuyển đổi (từ wifi qua dây) như vậy ko
    (Đại ý là có cách nào sử dụng wifi mà ko phải Lan đc ko ^^)

    2.Em ping đc rồi, nhưng mà avrstudio báo
    Program Memory Usage : 4932 bytes 15.1 % Full
    Data Memory Usage : 899 bytes 43.9 % Full
    chiếm mất gần 1/2 SRam rồi, thì có ảnh hưởng gì tới lúc truyền frame Ethernet ko
    Last edited by cowboy_188; 13-05-2013, 05:19.

    Leave a comment:


  • nttam79
    replied
    Nguyên văn bởi iamtomriddle Xem bài viết
    à, em hiểu rôi. do em dùng trình dich ccs nên khi khai báo int nó hiểu là 1 byte, khi chuyên sang bên này phải đôi thành int16 hay với kiểu long thì đổi thành int32 hay la long long. em còn chỗ này bị vướng mắc nữa là
    struct tcpSession{
    unsigned int desPort; //Port on the remote host
    unsigned int srcPort; //Port on the local host
    unsigned long desIP; //IP address of the remote host
    unsigned long seqNumber; //Sequence number
    unsigned long ackNumber; //Acknowlegement number
    unsigned char sesState; //Current state of TCP session
    unsigned int srcWin;
    unsigned int desWin;
    unsigned long lastRxAck; //Last Received Ack
    unsigned char nextAck;
    unsigned char timeOut; //Session time out
    void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
    unsigned char appID; //Upper layer application ID
    unsigned char appState; //Upper layer application state
    };
    hàm này khai báo trong ccs không hiểu void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
    em chuyển mãi ko được, anh giải thích cho em hàm khai báo này với ạ.
    void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession) là một biến con trỏ, trỏ đến 1 hàm (function) nằm trong bộ nhớ flash, chứ không phải trỏ đến biến, trong AVR studio cho phép khai báo biến con trỏ như vậy.

    Leave a comment:


  • iamtomriddle
    replied
    Nguyên văn bởi nttam79 Xem bài viết
    Bạn nhầm rồi:
    biến char : 1 byte
    biến int : 2 byte
    biến long : 4 byte

    HTONS(0x0800) sẽ cho kết quả 0x0008 (= ((0x0800<<8) | (0x0800>>8)) = (0x0000 | 0x0008) = 0x0008: đây là macro đổi thứ tự 2 byte của 1 số 2 byte thôi)
    à, em hiểu rôi. do em dùng trình dich ccs nên khi khai báo int nó hiểu là 1 byte, khi chuyên sang bên này phải đôi thành int16 hay với kiểu long thì đổi thành int32 hay la long long. em còn chỗ này bị vướng mắc nữa là
    struct tcpSession{
    unsigned int desPort; //Port on the remote host
    unsigned int srcPort; //Port on the local host
    unsigned long desIP; //IP address of the remote host
    unsigned long seqNumber; //Sequence number
    unsigned long ackNumber; //Acknowlegement number
    unsigned char sesState; //Current state of TCP session
    unsigned int srcWin;
    unsigned int desWin;
    unsigned long lastRxAck; //Last Received Ack
    unsigned char nextAck;
    unsigned char timeOut; //Session time out
    void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
    unsigned char appID; //Upper layer application ID
    unsigned char appState; //Upper layer application state
    };
    hàm này khai báo trong ccs không hiểu void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
    em chuyển mãi ko được, anh giải thích cho em hàm khai báo này với ạ.
    Last edited by iamtomriddle; 07-05-2013, 22:18.

    Leave a comment:


  • nttam79
    replied
    Nguyên văn bởi iamtomriddle Xem bài viết
    Các anh cho em hỏi //--------------------------------------------------------------------------------------
    //Ethernet header
    // Gom 14 byte:
    // 06 byte dia chi dich
    // 06 byte dia chi nguon
    // 02 byte type (cho biet frame ethernet mang ben trong loai du lieu gi)
    #define ETH_HEADER_LEN 14
    struct ntEthHeader
    {
    struct ntEthAddr desAddr;
    struct ntEthAddr srcAddr;
    unsigned int type;
    };
    type la kiểu 2 byte sao lại khai báo chỉ là biến int chỉ có 1 byte. ví dụ với gói IP khi lấy dữ liệu vào thì biến type sẽ phải là 0x0800 mà biến type chi có 1 byte mà đó lại là byte thứ 13 nên sẽ là 0x08;

    và dòng này
    #define HTONS(s) ((s<<8) | (s>>8)) //danh cho bien 2 byte
    theo em hiểu thì HTONS(0x0800) sẽ là 0x08000008 mà là kiểu 16bit nên sẽ là 0x0008;

    vay khi so sánh thì type vẫn băng HOTN(0x0800); em có thử in lên cổng com biến type thì đúng là nó chỉ là 0x08;


    em có làm theo kiểu
    struct ntEthHeader
    {
    struct ntEthAddr desAddr;
    struct ntEthAddr srcAddr;
    unsigned int typeH;
    unsigned int typeL;
    };
    so sánh và in typeH<<8 + typeL =0x0800;

    các cấu trúc sau cũng thế, biến long 2byte int 1byte

    //Cau truc ARP header
    struct ntARPHeader
    {
    unsigned int hwType;
    unsigned int protocol;
    unsigned char hwLen;
    unsigned char protoLen;
    unsigned int opcode;
    struct ntEthAddr shwaddr;
    unsigned long sipaddr;
    struct ntEthAddr dhwaddr;
    unsigned long dipaddr;
    };

    + Hardware type (2 bytes): cho biết loại địa chỉ phần cứng, đối với địa chỉ MAC của giao thức ethernet thì giá trị này được qui định là "0x0001".
    + Protocol type (2 bytes): cho biết loại địa chỉ giao thức lớp trên, đối với địa chỉ IP, giá trị này được qui định là “0x0800”.
    + HLEN (1 byte): cho biết chiều dài của địa chỉ vật lý (địa chỉ MAC).
    + PLEN (1 byte): cho biết chiều dài của địa chỉ giao thức (địa chỉ IP)
    + Operation (2 bytes): cho biết hoạt động đang thực hiện trong gói tin này (request hay reply).
    + Sender H/W (hardware address, 6 bytes): địa chỉ vật lý của phía gửi.
    + Sender IP (4 bytes): địa chỉ IP của phía gửi.
    + Target H/W (6 bytes): địa chỉ vật lý của phía nhận, nếu chưa biết thì sẽ là chứa toàn 0.
    + Target IP (4 bytes): địa chỉ IP của phía nhận.
    mà sử dụng được cho 2byte và 4 byte. Em đang thắc mắc phần này mong thầy và các bạn gỡ rối ạ. Em đang chuyển code này sang pic mà thấy gặp nhiều khó khăn quá.
    Bạn nhầm rồi:
    biến char : 1 byte
    biến int : 2 byte
    biến long : 4 byte

    HTONS(0x0800) sẽ cho kết quả 0x0008 (= ((0x0800<<8) | (0x0800>>8)) = (0x0000 | 0x0008) = 0x0008: đây là macro đổi thứ tự 2 byte của 1 số 2 byte thôi)

    Leave a comment:


  • iamtomriddle
    replied
    Các anh cho em hỏi //--------------------------------------------------------------------------------------
    //Ethernet header
    // Gom 14 byte:
    // 06 byte dia chi dich
    // 06 byte dia chi nguon
    // 02 byte type (cho biet frame ethernet mang ben trong loai du lieu gi)
    #define ETH_HEADER_LEN 14
    struct ntEthHeader
    {
    struct ntEthAddr desAddr;
    struct ntEthAddr srcAddr;
    unsigned int type;
    };
    type la kiểu 2 byte sao lại khai báo chỉ là biến int chỉ có 1 byte. ví dụ với gói IP khi lấy dữ liệu vào thì biến type sẽ phải là 0x0800 mà biến type chi có 1 byte mà đó lại là byte thứ 13 nên sẽ là 0x08;

    và dòng này
    #define HTONS(s) ((s<<8) | (s>>8)) //danh cho bien 2 byte
    theo em hiểu thì HTONS(0x0800) sẽ là 0x08000008 mà là kiểu 16bit nên sẽ là 0x0008;

    vay khi so sánh thì type vẫn băng HOTN(0x0800); em có thử in lên cổng com biến type thì đúng là nó chỉ là 0x08;


    em có làm theo kiểu
    struct ntEthHeader
    {
    struct ntEthAddr desAddr;
    struct ntEthAddr srcAddr;
    unsigned int typeH;
    unsigned int typeL;
    };
    so sánh và in typeH<<8 + typeL =0x0800;

    các cấu trúc sau cũng thế, biến long 2byte int 1byte

    //Cau truc ARP header
    struct ntARPHeader
    {
    unsigned int hwType;
    unsigned int protocol;
    unsigned char hwLen;
    unsigned char protoLen;
    unsigned int opcode;
    struct ntEthAddr shwaddr;
    unsigned long sipaddr;
    struct ntEthAddr dhwaddr;
    unsigned long dipaddr;
    };

    + Hardware type (2 bytes): cho biết loại địa chỉ phần cứng, đối với địa chỉ MAC của giao thức ethernet thì giá trị này được qui định là "0x0001".
    + Protocol type (2 bytes): cho biết loại địa chỉ giao thức lớp trên, đối với địa chỉ IP, giá trị này được qui định là “0x0800”.
    + HLEN (1 byte): cho biết chiều dài của địa chỉ vật lý (địa chỉ MAC).
    + PLEN (1 byte): cho biết chiều dài của địa chỉ giao thức (địa chỉ IP)
    + Operation (2 bytes): cho biết hoạt động đang thực hiện trong gói tin này (request hay reply).
    + Sender H/W (hardware address, 6 bytes): địa chỉ vật lý của phía gửi.
    + Sender IP (4 bytes): địa chỉ IP của phía gửi.
    + Target H/W (6 bytes): địa chỉ vật lý của phía nhận, nếu chưa biết thì sẽ là chứa toàn 0.
    + Target IP (4 bytes): địa chỉ IP của phía nhận.
    mà sử dụng được cho 2byte và 4 byte. Em đang thắc mắc phần này mong thầy và các bạn gỡ rối ạ. Em đang chuyển code này sang pic mà thấy gặp nhiều khó khăn quá.
    Last edited by iamtomriddle; 07-05-2013, 12:45.

    Leave a comment:


  • stevenboy
    replied
    Khi mình cần chuyển đổi Từ ATmega32->ATmega128 thì cần thay đổi những gì. Ai biết có thể giúp mình ko. Mình có sửa 1 vài chổ nhưng nó không chạy dc.

    Leave a comment:


  • muahoanang31
    replied
    Cảm ơn thầy! em đã hiểu được phần enthernet dưới vi điều khiển rồi, nhưng thầy có thể nối thêm về dùng UDP với giao thức UDP to COM (giao thức cổng COM ảo trên UDP) được không? để xử lý trên PC, phần này em vẫn chưa hiểu.

    Nguyên văn bởi nttam79 Xem bài viết
    Những vấn đề bạn hỏi, bạn yamailuk đã trả lời giúp khá đầy đủ rồi, ở đây chỉ giải thích thêm một ít cho rõ thôi.
    Sở dĩ bảo cần 2kb ram để xử lý frame là vì trong tiêu chuẩn của TCP/IP và ethernet, kích thước dữ liệu tối đa cho 1 frame ethernet là 1500byte. Tất nhiên ta có thể gửi ngắn hơn, nhưng nếu bộ nhớ không đủ, trong trường hợp mạch vi điều khiển nhận được một frame có kích thước lớn từ máy tính gửi đến thì nó sẽ không xử lý được.
    Trong giao thức TCP, có cho phép các bên báo kích thước gói tối đa mà mình nhận được cho bên kia (MSS), như vậy có thể sử dụng cơ chế này để tránh việc nhận được gói tin quá lớn.
    Có thể gửi dữ liệu trong gói TCP/UDP với kích thước nhỏ tùy ý (thậm chí chiều dài dữ liệu có thể = 0) tuy nhiên cần lưu ý là dù kích thước dữ liệu nhỏ đến đâu thì 1 frame gửi đi vẫn phải có đủ header TCP/UDP và header IP, như vậy kích thước data cho 1 frame ethernet tối thiểu cũng bằng kích thước header IP+TCP hay IP+UDP.
    Như vậy bạn vẫn hoàn toàn có thể giao tiếp ethernet được với kích thước ram nhỏ.
    Còn một cách nữa cho phép xử lý được các frame ethernet với kích thước payload lớn (lên đến 1500byte) với vi điều khiển có ram nhỏ mà trong project này không đề cập đến: đó là xử lý các frame ethernet gửi và nhận ngay trên buffer của IC giao tiếp ethernet mà không copy về ram của VĐK để xử lý. Như vậy ta không bị giới hạn bởi kích thước ram nữa. Tuy nhiên để làm việc này cần thực hiện truy xuất trực tiếp vào buffer của IC ethernet qua SPI, dẫn đến phức tạp hơn 1 chút trong lập trình và thời gian xử lý có thể lâu hơn.
    Cho ứng dụng RFID, tôi đề xuất dùng UDP với giao thức UDP to COM (giao thức cổng COM ảo trên UDP) là phù hợp nhất, cũng dễ xử lý trên PC nữa.

    Leave a comment:

Về tác giả

Collapse

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

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

Collapse

  • Andrea14
    Vấn đề về tốc độ quay
    bởi Andrea14
    Chào mọi người,

    Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
    hôm nay, 12:42
  • 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
Đang tải...
X