- Gõ đường link trên trình duyệt http:/192.168.1.2/forms.htm. - Viết 1 chuỗi kí tự vào ô trống rồi bấm nút Save.
- Kiểm tra màn hình LCD trên board xem có hiển thị được đúng chuỗi mà ta yêu cầu hay không.
Code trong file forms.htm:
Hình 29: Code phần LCD trong file forms.htm. 5.5.2.1. HTTPExecutePost
Hàm HTTPExecutePost sẽ thực hiện một số nhiệm vụ:
- Đầu tiên, lấy tên của trang web truy cập hiện tại được lưu trong biến curHTTP.file và gán cho biến filename bằng cách sử dụng hàm MPFSGetFilename.
- Kiểm tra nếu trang web truy cập hiện tại đúng là forms.htm thì sẽ thực hiện hàm con HTTPPostLCD().
- Thực hiện hàm con HTTPPostLCD.
Code:
HTTP_IO_RESULT HTTPExecutePost(void) {
// Resolve which function to use and pass along BYTE filename[20];
// Load the file name
// Make sure BYTE filename[] above is large enough for your longest name
MPFSGetFilename(curHTTP.file, filename, sizeof(filename)); #if defined(USE_LCD)
if(!memcmppgm2ram(filename, "forms.htm", 9)) return HTTPPostLCD();
#endif
5.5.2.2. Hàm HTTPPostLCD
- Xác định thông số của LCD và sử dụng nó để cập nhật các dòng văn bản lên màn hình LCD trên mạch.
- Hàm này có 4 trạng thái. Đầu tiên là đọc tên từ chuỗi dữ liệu được trả lại từ phương pháp POST. Nếu tên không được tìm thấy thì nó sẽ tiếp tục hỏi nhiều dữ liệu hơn. Hay nói cách khác, nếu tên được mong đợi nó sẽ đọc các giá trị liên quan và ghi lên màn hình LCD. Nếu tên không được mong đợi, các giá trị liên quan được loại bỏ và các thông số tên tiếp theo được đọc.
- Trong trường hợp, chuỗi mong đợi không được tìm thấy thì hàm này sẽ trả lại HTTP_IO_NEED_DATA khi không còn dữ liệu. Trong trường hợp này, HTTP2 server sẽ bắt các lỗi và và phát ra Internal Server Error đến trình duyệt.
- Các giá trị trả lại:
• HTTP_IO_DONE : Nếu tham số được tìm thấy và lưu.
• HTTP_IO_WAITING : Hàm này bị dừng lại và sẽ tiếp tục sau đó.
• HTTP_IO_NEED_DATA : Dữ liệu mà hàm này cần chưa có.
Code:
static HTTP_IO_RESULT HTTPPostLCD(void) {
BYTE* cDest;
#define SM_POST_LCD_READ_NAME (0u)
#define SM_POST_LCD_READ_VALUE (1u)
switch(curHTTP.smPost) {
// Find the name
case SM_POST_LCD_READ_NAME: // Read a name
if(HTTPReadPostName(curHTTP.data, HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE)
return HTTP_IO_NEED_DATA;
curHTTP.smPost = SM_POST_LCD_READ_VALUE; // No break...continue reading value
// Found the value, so store the LCD and return case SM_POST_LCD_READ_VALUE:
// If value is expected, read it to data buffer, // otherwise ignore it (by reading to NULL)
if(!strcmppgm2ram((char*)curHTTP.data, (ROM char*)"lcd")) cDest = curHTTP.data;
else
cDest = NULL; // Read a value string
if(HTTPReadPostValue(cDest,HTTP_MAX_DATA_LEN)== HTTP_READ_INCOMPLETE)
return HTTP_IO_NEED_DATA;
// If this was an unexpected value, look for a new name if(!cDest)
{
curHTTP.smPost = SM_POST_LCD_READ_NAME; break;
}
// Copy up to 32 characters to the LCD if(strlen((char*)cDest) < 32u)
{
memset(LCDText, ' ', 32);
} else {
memcpy(LCDText, (void *)cDest, 32); }
LCDUpdate();
// This is the only expected value, so callback is done strcpypgm2ram((char*)curHTTP.data, "/forms.htm"); curHTTP.httpStatus = HTTP_REDIRECT;
return HTTP_IO_DONE; }
// Default assumes that we're returning for state machine convenience. // Function will be called again later.
return HTTP_IO_WAITING; } #endif Hàm con HTTPReadPostName: - Cú pháp: HTTP_READ_STATUS HTTPReadPostName ( BYTE* cData, WORD wLen );
• cData: để lưu trữ tên khi nó được đọc
• wLen: độ dài của biến cData
- Giá trị trả lại:
• HTTP_READ_OK : Tên được đọc thành công.
• HTTP_READ_TRUNCTATED : Toàn bộ tên không phù hợp trong bộ
• HTTP_READ_INCOMPLETE : Tên chưa được lưu vào bộ đệm, vì thế hàm sẽ được gọi lại sau đó.
Đọc tên từ một chuỗi URL được mã hóa. Hàm này được gọi từ hàm callback HTTPExecutePost, nó làm cho việc phân tích dữ liệu gửi đến một cách dễ dàng. Hàm này ngăn chặn việc tràn bộ đệm bằng cách buộc người lập trình xác định rõ cần bao nhiêu byte.
Hàm này sẽ đọc cho đến khi gặp kí tự “=” tiếp theo ( kí tự “=” để đánh kết thúc của tham số tên).
Hàm con HTTPReadPostValue:
- Cú pháp:HTTP_READ_STATUS HTTPReadPostValue(
BYTE* cData,
WORD wLen );
• cData: để lưu trữ giá trị khi nó được đọc.
• wLen: độ dài của biến cData.
- Giá trị trả lại:
• HTTP_READ_OK : Giá trị được đọc thành công.
• HTTP_READ_TRUNCTATED : Toàn bộ giá trị không phù hợp trong bộ
đệm, vì thế giá trị đã bị cắt ngắn và dữ liệu bị mất.
• HTTP_READ_INCOMPLETE : Toàn bộ giá trị chưa được lưu vào bộ
đệm, vì thế hàm sẽ được gọi lại sau đó.
Đọc giá trị từ một chuỗi URL được mã hóa. Hàm này được gọi từ hàm callback HTTPExecutePost, nó làm cho việc phân tích dữ liệu gửi đến một cách dễ dàng. Hàm này ngăn chặn việc tràn bộ đệm bằng cách buộc người lập trình xác định rõ cần bao nhiêu byte.
Hàm này sẽ đọc cho đến khi gặp kí tự “&” tiếp theo ( kí tự “&” để đánh kết thúc của tham số giá trị).
5.5.3. Đo nhiệt độ
- Gõ đường link trên trình duyệt http:/192.168.1.2/ dynvars.htm. - Theo dõi nhiệt độ đo được.
Hình 30: Hiển thị giá trị nhiệt độ trên web.
Để đo được giá trị nhiệt độ em sử dụng IC LM35 để biến thông số nhiệt độ thành điện áp và đưa vào bộ biến đổi A/D 10 bit (AN4). Giá trị điện áp sẽ được biến đổi thành giá trị số tương ứng. Giá trị số này sẽ được tính toán theo công thức chuẩn để trở thành giá trị nhiệt độ thực tế.
Tham số nhiệt độ là một biến động nên sử dụng hàm gọi lại HTTPPrint_pot để thực hiện việc hiển thị tham số nhiệt độ này.
5.5.3.1. Hàm HTTPPrint_pot
void HTTPPrint_pot(void) {
BYTE AN0String[8]; WORD ADval;
#if defined(__18CXX)
// Wait until A/D conversion is done
ADCON0bits.GO = 1; //A/D conversion status bit while(ADCON0bits.GO);
// Convert 10-bit value into ASCII string ADval = (WORD)ADRES; ADval *= (WORD)330; ADval /= (WORD)1024; uitoa(ADval, AN0String); #else ADval = (WORD)ADC1BUF0; //ADval *= (WORD)10; //ADval /= (WORD)102; uitoa(ADval, (BYTE*)AN0String); #endif TCPPutString(sktHTTP, AN0String); }
Trong khi ADCON0bits.GO=1 tức là bộ biến đổi A/D vẫn đang hoạt động ta gán giá trị đã được biến đổi trên thanh ghi chứa kết quả ADRES cho biến Adval. Sau đó áp dụng công thức chuyển đổi từ giá trị số sau phép biến đổi A/D thành giá trị nhiệt độ
như sau: Adval= ((Adval*3.3)/1024)*100 ( trong đó giá trị 3.3 là giá trị của VREF). Tiếp
theo là ép kiểu biến Adval thành kiểu byte và lưu vào biến AN0String. Cuối cùng là sử dụng hàm TCPPutString để lưu giá trị của biến AN0String vào socket của TCP.
5.5.3.2. Code trong file dynvars.htm
Hình 31: Code trong file dynvars.htm
Do tham số nhiệt độ là một biến động thay đổi theo thời gian vì thế phải sử dụng một câu lệnh javascript để cập nhật giá trị của nhiệt độ theo thời gian. Đó là sử dụng hàm setTimeout để cập nhật biến nhiệt độ.
KẾT LUẬN
Việc thiết kế Module Ethernet trên vi điều khiển PIC18F67J60 nhằm ứng dụng đo lường và điều khiển có ý nghĩa rất lớn, có thể ứng dụng trong nhiều lĩnh vực của đời sống xã hội và trong công nghiệp. Ngoài ra, module Ethernet trên vi điều khiển PIC18F67J60 cũng phục vụ tốt cho việc học tập và nghiên cứu của sinh viên. Việc xây dựng module này liên quan đến nhiều mảng kiến thức, từ những kiến thức lý thuyết cho đến những kiến thức thực tiễn.
Những kết quả chính thực hiện được
- Tìm hiểu nguyên lý chung chuẩn truyền thông Ethernet do IEEE 802.3 quy định, tìm hiểu kiến thức về họ giao thức TCP/IP.
- Kết nối thành công mạch mạch demo với máy tính thông qua chuẩn truyền thông Ethernet.
- Lập trình cho mạch demo bằng phần mềm MPLAB C18, sử dụng thư viện TCP/IP Stack của hãng Microchip để thực hiện điều khiển các ứng dụng cơ bản như bật tắt đèn LED, viết lên LCD một chuỗi kí tự và đo tham số nhiệt độ qua web giao diện.
- Lập trình web giao diện để đo lường, điều khiển của mạch demo trên máy tính.
Đánh giá những kết quả đã đạt được
- Điều khiển chính xác các đèn LED và viết chính xác các chuỗi kí tự mà ta mong muốn lên LCD, kết quả đo nhiệt độ là khá chính xác với sai số nằm trong phạm vi cho phép. Mạch hoạt động ổn định.
- Tuy nhiên, một số mặt hạn chế đó là đề tài mới chỉ là thực hiện kết nối trực tiếp giữa mạch demo với máy tính thông qua chuẩn truyền thông Ethernet mà chưa thực hiện được kết nối mạch với switch.
- Với kết quả bước đầu là kết nối thành công mạch demo với máy tính thông qua chuẩn truyền thông Ethernet và thực hiện đo lường và điều khiển một số ứng dụng cơ bản đã khẳng định khả năng phát triển của đề tài.
Hướng phát triển tiếp theo của đề tài:
Trong thời gian tới, em sẽ tiếp tục nghiên cứu phát triển đề tài theo một số hướng sau đây:
- Kết nối mạch với switch.
- Thực hiện các ứng dụng điều khiển và đo lường phức tạp hơn để phục vụ cho cuộc sống như điều khiển nhà thông minh qua internet và phục vụ trong công nghiệp, thay thế các chuẩn truyền thông cũ như RS485, RS232…
MỤC LỤC
MỞ ĐẦU... 1
CHƯƠNG 1. TỔNG QUAN VỀ ETHERNET...2
1.1. CẤU TRÚC KHUNG TIN ETHERNET...2
1.2. CẤU TRÚC ĐỊA CHỈ ETHERNET...3
1.3. CÁC LOẠI KHUNG ETHERNET...3
1.3.1. Các khung unicast...3
1.3.2. Các khung broadcast...4
1.3.3. Các khung multicast...4
1.4. TRUY NHẬP BUS...4
Nguyên tắc làm việc phương pháp CSMA/CD:...5
1.5. CÁC LOẠI MẠNG ETHERNET...6
1.5.1. Các hệ thống Ethernet 10Mb/s...6
1.5.2. Các hệ thống Ethernet 100 Mb/s – Ethernet cao tốc ( Fast Ethernet )...7
1.5.3. Các hệ thống Giga Ethernet ...7
1.6. CHUẨN IEEE 802...7
CHƯƠNG 2. HỌ GIAO THỨC TCP/IP...9
2.1. HỌ GIAO THỨC TCP/IP...9
2.1.1. Tầng Ứng Dụng (Application Layer)...9
2.1.2. Tầng Giao Vận (Transport Layer)...10
2.1.3. Tầng Internet (Internet Layer)...10
2.1.4. Lớp giao tiếp mạng...11
2.2. CẤU TRÚC GÓI TIN IP,TCP,UDP...11
2.2.1. Cấu trúc địa chỉ IP...11
2.2.2. Cấu trúc gói tin IP...12
2.2.3. Cấu trúc gói tin TCP ...14
2.2.4. Cấu trúc gói tin UDP...15
3.1.1. Các đặc trưng của PIC 18F67J60...15
3.1.1.1. Các đặc trưng chung:...16
3.1.1.2. Đặc trưng Ethernet:...16
3.1.2. Module A/D 10 bit...16
3.1.2.1. Module A/D có 5 thanh ghi:...17
3.1.2.2. Quá trình chuyển đổi A/D:...20
3.1.3. Module Ethernet...20
Module Ethernet gồm 5 khối chức năng chính:...21
3.2. CẢM BIẾN NHIỆT ĐỘ LM35...21 Các đặc trưng của LM35:...22 3.3. MẠCH NGUYÊN LÝ ...22 3.3.1. Khối mạch nguồn...22 3.3.2. Khối mạch RJ45...23 3.3.3. Khối mạch LCD...24
3.3.4. Khối mạch vi điều khiển PIC18F67J60...25
3.4 MẠCH IN...26
3.5 MẠCH THỰC TẾ...27
CHƯƠNG 4. TRÌNH BIÊN DỊCH MPLAB C18 VÀ WEB SERVER...28
4.1. MPLAB C18...28
4.1.1. Giới thiệu...28
4.1.2. Các đặc trưng của trình dịch MPLAB C18:...28
4.1.3. Quá trình tạo ra file .HEX...28
4.2. WEB ĐỘNG...29
Cấu trúc của một DHTML:...30
4.3. CSS...30
4.3.1. Ưu điểm của CSS...31
4.3.2. Các đặc tính cơ bản của CSS...31
4.3.2.1. Cú pháp cơ bản của CSS:...31
4.3.2.2. Ví dụ minh họa về mã CSS:...32
4.3.3. CSS có tính kế thừa và tính kết hợp...33 4.3.3.1. Tính kế thừa:...33 4.3.3.2. Tính kết hợp:...33 4.4. KỸ THUẬT AJAX...34 4.4.1. Ưu điểm...36 4.4.2. Nhược điểm...36
CHƯƠNG 5. TCP/IP STACK...37
5.1. CẤU TRÚC CỦA TCP/IP STACK...37
5.2. HOẠT ĐỘNG CỦA TCP/IP STACK...38
5.2.1. Các file cần thiết...38
5.2.2. Cấu trúc APP_CONFIG...39
5.2.3. Main file...39
5.2.3.1. Khởi tạo...39
5.2.3.2 Vòng lặp chính (main loop)...39
5.3. CÁC MODULE CỦA STACK VÀ APIS...40
5.3.1. Announce...40 5.3.2. HTTP2 server...40 Web pages...41 Phần mềm MPFS2...41 File CustomHTTPApp.c ...42 File HTTPPrint.h...42 5.3.2.1. HTTP2 Dynamic Variables ...42 5.3.2.2. HTTP2 Form Processing...43 5.3.2.3. HTTP2 Authentication...44
5.4. CẤU HÌNH CHO STACK...45
5.4.1. Cấu hình cho phần cứng...45
5.4.1.2. Bộ nhớ ngoài...46
5.4.2.2. Địa chỉ IP...47
5.5. DEMO MODULE...47
5.5.1. Điều khiển led sáng tắt...48
5.5.2. Viết ra LCD...51 ...52 5.5.2.1. HTTPExecutePost...52 5.5.2.2. Hàm HTTPPostLCD...53 Hàm con HTTPReadPostName:...55 Hàm con HTTPReadPostValue:...56 5.5.3. Đo nhiệt độ...57 5.5.3.1. Hàm HTTPPrint_pot...57 KẾT LUẬN...60
Những kết quả chính thực hiện được...60
Đánh giá những kết quả đã đạt được...60