Xin chào tất cả mọi người.
Mình tham gia diễn đàn đã khá lâu rồi nhưng không có đóng góp gì cho diễn đàn, mà chôm từ diễn đàn thì khá nhiều. Hôm nay thấy cắn rứt lương tâm quá nên làm 1 cái tut đóng góp cho ĐTVN.
Mình thấy đề tài giao tiếp TCP/IP với AVR và điều khiển qua Internet được khá nhiều bạn quan tâm, tài liệu trên các diễn đàn nước ngoài cũng khá nhiều nhưng chưa có tut nào cụ thể và chi tiết, đặc biệt là hướng dẫn để mọi người có thể tự viết code được, chứ không phải copy code có sẵn. Vì vậy nên mình lôi 1 project đã làm cách đây khá lâu ra để làm cơ sở cho tut này.
Bài 1-Hardware:
Trong project này mình sử dụng một con ENC28J60 của Microchip để giao tiếp Ethernet. Vi điều khiển thì sử dụng Atmega32, có bộ nhớ RAM 2k, vừa đủ dùng (vì 1 frame ethernet có chiều dài max 1500bytes).
Mọi người có thể mua 1 module phát triển Atmega32 + ENC28J60 tại TME (ATMEGA32 - Ethernet board - TMe: Linh kien, Sensors, Kit Phat trien, Mach nap 8051, PIC, AVR, ARM, EPROM, Flash...). Hay tự build 1 mạch theo sơ đồ sau:
Mô tả:
- Atmega32 giao tiếp với ENC28J60 qua SPI (MOSI/MISO/SCK) ngoài ra còn có chân chọn chip CS (nối với bất cứ IO nào của Atmega) và ngắt INT (nối vào ngắt ngoài VĐK).
- ENC28J60 dùng nguồn 3V3, do đó cần 1 IC ổn áp 3V3. ENC28J60 cần 1 port RJ45 có tích hợp sẵn Transformer và LED.
- Thêm MAX232 để dùng vào mục đích debug.
- Thêm LCD và keypad (dùng để config hay hiển thị gì đó sau này). Nếu không cần có thể bỏ ra.
Bài 2-Cở sở giao thức và thiết kế lưu đồ dữ liệu-Tạo project trong AVR studio:
Chồng giao thức TCP/IP:
Dưới đây là mô hình chồng giao thức TCP/IP
Cụ thể hóa và lưu đồ dữ liệu vào ra của giao thức (áp dụng cho phần lập trình)
Như vậy phần lập trình sẽ chia ra các module sau:
- Module điều khiển ENC28J60: nằm trong file “enc28j60.c” và file header “enc28j60.h”, thêm file “enc28j60conf.h” để lưu các config.
- Module giao thức Ethernet: gồm các file: “ethernet.c” và “ethernet.h”, thêm file "packet.h" khai báo các cấu trúc gói tin sử dụng trong bộ giao thức TCP/IP.
- Module giao thức phân giải địa chỉ Address Resolution Protocol, gồm file “arp.c” và “arp.h”
- Module giao thức IP gồm “ip.c” và “ip.h”
- Module giao thức cấp phát địa chỉ IP động DHCP (Dynamic Host Configuration Protocol) gồm các file “dhcp.c” và “dhcp.h”
- Module giao thức UDP gồm các file “udp.c” và “udp.h”
- Module giao thức TCP gồm các file “tcp.c” và “tcp.h”
- Module giao thức HTTP gồm các file “http.c” và “http.h”
- Và một số các hàm hỗ trợ khác (uart, timer,…)
Toàn bộ code viết trên AVR Studio, biên dịch với AVR-GCC
Ta tạo 1 project mới trong AVR studio:
Set thuộc tính cho project và chọn CPU, chọn tần số thạch anh:
Sau khi tạo project, ta sẽ có source file đầu tiên là “ntAVRnet.c”.
Mở file này, thêm vào hàm main, chương trình chính, nội dung hàm này sẽ được viết cuối cùng
Tạo thêm file header cho nó: “ntAVRnet.h” có nội dung:
File này sẽ dùng để chứa các define và thông tin config chung cho toàn project
Mình tham gia diễn đàn đã khá lâu rồi nhưng không có đóng góp gì cho diễn đàn, mà chôm từ diễn đàn thì khá nhiều. Hôm nay thấy cắn rứt lương tâm quá nên làm 1 cái tut đóng góp cho ĐTVN.
Mình thấy đề tài giao tiếp TCP/IP với AVR và điều khiển qua Internet được khá nhiều bạn quan tâm, tài liệu trên các diễn đàn nước ngoài cũng khá nhiều nhưng chưa có tut nào cụ thể và chi tiết, đặc biệt là hướng dẫn để mọi người có thể tự viết code được, chứ không phải copy code có sẵn. Vì vậy nên mình lôi 1 project đã làm cách đây khá lâu ra để làm cơ sở cho tut này.
Bài 1-Hardware:
Trong project này mình sử dụng một con ENC28J60 của Microchip để giao tiếp Ethernet. Vi điều khiển thì sử dụng Atmega32, có bộ nhớ RAM 2k, vừa đủ dùng (vì 1 frame ethernet có chiều dài max 1500bytes).
Mọi người có thể mua 1 module phát triển Atmega32 + ENC28J60 tại TME (ATMEGA32 - Ethernet board - TMe: Linh kien, Sensors, Kit Phat trien, Mach nap 8051, PIC, AVR, ARM, EPROM, Flash...). Hay tự build 1 mạch theo sơ đồ sau:
Mô tả:
- Atmega32 giao tiếp với ENC28J60 qua SPI (MOSI/MISO/SCK) ngoài ra còn có chân chọn chip CS (nối với bất cứ IO nào của Atmega) và ngắt INT (nối vào ngắt ngoài VĐK).
- ENC28J60 dùng nguồn 3V3, do đó cần 1 IC ổn áp 3V3. ENC28J60 cần 1 port RJ45 có tích hợp sẵn Transformer và LED.
- Thêm MAX232 để dùng vào mục đích debug.
- Thêm LCD và keypad (dùng để config hay hiển thị gì đó sau này). Nếu không cần có thể bỏ ra.
Bài 2-Cở sở giao thức và thiết kế lưu đồ dữ liệu-Tạo project trong AVR studio:
Chồng giao thức TCP/IP:
Dưới đây là mô hình chồng giao thức TCP/IP
Cụ thể hóa và lưu đồ dữ liệu vào ra của giao thức (áp dụng cho phần lập trình)
Như vậy phần lập trình sẽ chia ra các module sau:
- Module điều khiển ENC28J60: nằm trong file “enc28j60.c” và file header “enc28j60.h”, thêm file “enc28j60conf.h” để lưu các config.
- Module giao thức Ethernet: gồm các file: “ethernet.c” và “ethernet.h”, thêm file "packet.h" khai báo các cấu trúc gói tin sử dụng trong bộ giao thức TCP/IP.
- Module giao thức phân giải địa chỉ Address Resolution Protocol, gồm file “arp.c” và “arp.h”
- Module giao thức IP gồm “ip.c” và “ip.h”
- Module giao thức cấp phát địa chỉ IP động DHCP (Dynamic Host Configuration Protocol) gồm các file “dhcp.c” và “dhcp.h”
- Module giao thức UDP gồm các file “udp.c” và “udp.h”
- Module giao thức TCP gồm các file “tcp.c” và “tcp.h”
- Module giao thức HTTP gồm các file “http.c” và “http.h”
- Và một số các hàm hỗ trợ khác (uart, timer,…)
Toàn bộ code viết trên AVR Studio, biên dịch với AVR-GCC
Ta tạo 1 project mới trong AVR studio:
Set thuộc tính cho project và chọn CPU, chọn tần số thạch anh:
Sau khi tạo project, ta sẽ có source file đầu tiên là “ntAVRnet.c”.
Mở file này, thêm vào hàm main, chương trình chính, nội dung hàm này sẽ được viết cuối cùng
Code:
//---------------------------------------------------------------------------- // Writen by NTTam - PTITHCM //---------------------------------------------------------------------------- #include <avr/io.h> //---------------------------------------------------------------------------- int main() { return(0); }
Code:
//---------------------------------------------------------------------------- // Writen by NTTam - PTITHCM //---------------------------------------------------------------------------- #ifndef NTAVRNET_H #define NTAVRNET_H #endif //NTAVRNET_H
Comment