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
-
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
-
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:
-
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ó.Nguyên văn bởi stevenboy Xem bài viếtAi 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:
-
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:
-
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ú.
hình layout cho bạn nào muốn dùng IC điều khiển bóng đèn 220AC
Leave a comment:
-
Leave a comment:
-
hay đấy, mình sắp xong rồi, khi nào có gì mình sẽ hỏi bạnNguyên văn bởi ga_kon Xem bài viếtSả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 . . .^^
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.
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 :-jif((packet->bootp.opcode != BOOTP_OP_BOOTREPLY) || (packet->bootp.transid != DhcpTransactID)){
ethInit();return;}Last edited by cowboy_188; 17-05-2013, 18:43.
Leave a comment:
-
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:
-
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 koLast edited by cowboy_188; 13-05-2013, 05:19.
Leave a comment:
-
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.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 ạ.
Leave a comment:
-
à, 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àNguyên văn bởi nttam79 Xem bài viếtBạ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)
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:
-
Bạn nhầm rồi:Nguyên văn bởi iamtomriddle Xem bài viếtCá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á.
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:
-
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:
-
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:
-
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ếtNhữ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:
Bài viết mới nhất
Collapse
-
bởi Andrea14Chà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...-
Channel: Điện tử truyền hình
hôm nay, 12:42 -
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi bqvietBqv 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.
-
Channel: Thiết bị điện tử cá nhân
06-12-2025, 17:17 -
-
Trả lời cho Xin hỏi về mạch thu FM/AM trong catsettebởi nguyendinhvanTheo 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...
-
Channel: Điện thanh
05-12-2025, 19:59 -
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi afrendlyCó 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é....
-
Channel: Thiết bị điện tử cá nhân
04-12-2025, 01:27 -

Leave a comment: