Đề tài Nghiên cứu, ứng dụng vi điều khiển PIC 18F97J60

- CPU làm việc ở mức điện áp 3.3V được cấp từ chân Vcc. - Khi cung cấp nguồn cho chíp, lúc này chíp sẽ làm việc. - Đầu tiên sẽ khởi tạo TCPIP Stack của khối Ethernet. Và chờ dữ liệu tới để xử lý. - Đọc các dữ liệu từ các khối khác kết nối với CPU như: DS18B20. DS1307, và các trạng thái của cảm biến. - Xuất tín hiệu lên LCD, lên web service, - Xử lý các tín hiệu trong quá trình làm việc.

docx87 trang | Chia sẻ: lylyngoc | Lượt xem: 3678 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu, ứng dụng vi điều khiển PIC 18F97J60, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nsistor) nhưng nếu chỉ dùng để phân biệt mức ánh sáng: trạng thái sáng – tối hoặc xung ánh sáng thì ta có thể dùng điện trở quang (photo resister). 2.2.2.1. Khái niệm điện trở quang Quang trở là một linh kiện bán dẫn hai cực, có điện trở thay đổi theo năng lượng ánh sáng chiếu vào, hoạt động dựa trên hiện tượng quang dẫn do kết quả của hiệu ứng quang điện nội (hiện tượng giải phóng hạt tải điện trong vật liệu dưới tác dụng của ánh sáng làm tăng độ dẫn điện của vật liệu). Hình 2.9. Quang trở 2.2.2.2. Cấu tạo quang trở Cảm biến quang thường được cấu tạo bằng các chất bán dẫn đa tinh thể đồng nhất hoặc đơn tinh thể, bán dẫn riêng hoặc bán dẫn . pha tạp chất. Đa tinh thể: CdS, CdSe, CdTe, PbS, PbSe, PbTe Đơn tinh thế: Ge, Si tinh khiết hoặc pha tạp Au, Cu, Sb, In, SbIn, AsIn, Pin, CdHgTe Tùy theo chất cấu tạo mà quang trở có vùng phổ làm việc khác nhau. 2.2.2.3. Điện trở Một quang trở có giá trị điện trở tương đương với 2 điện trở ghép song song gồm điện trở tối và điện trở được xác định bởi hiệu ứng quang điện do ánh sáng tác động. Giá trị điện trở tối phụ thuộc vào vật liệu cấu tạo, dạng hình học, kích thước và nhiệt độ. Các chất Pbs, CdS, CdSe có giá trị điện trở tối khá lớn: từ đến ở nhiệt độ Các chất SbI, SbAs, CdHgTe có gía trị điện trở tối khá nhỏ: từ 10Ω đến Ω ở nhiệt độ . Điện trở được xác định theo biểu thức: Trong đó a phụ thuộc vào vật liệu, nhiệt độ và phổ bức xạ ánh sáng có giá trị từ 0.5 đến 1 Do đó giá trị điện trở của quang trở là Thông thường << nên = Nghĩa là giá trị điện trở của cảm biến phụ thuộc mạnh vào ánh sáng tác dụng, có giá trị giảm rất nhanh khi độ rọi tăng lên. Sự phụ thuộc của điện trở vào thông lượng ánh sáng không tuyến tính. Tuy nhiên có thể tuyến tính hóa nó bằng ghép song song với 1 điện trở Hình 2.10. Sự phụ thuộc của điện trở vào độ rọi sáng Điện trở phụ thuộc vào nhiệt độ, độ nhạy nhiệt của quang trở càng nhỏ khi độ rọi càng lớn. Giá trị điện trở sẽ bị giảm chậm ở những điều kiện làm việc giới hạn khi độ rọi và điện áp đặt lớn. 2.2.2.4. Độ nhạy Dựa vào sơ đồ tương đương của quang trở, độ dẫn điện của quang trở là tỏng độ dẩn sáng và độ dẫn tối . Trong đó: là độ dẫn tối là độ quang dẫn Khi làm việc quang trở được phân cực 1 điện áp V sẽ có 1 dòng điện đi qua nó được xác định Trong đó Io dòng tối , Ip dòng quang điện Tuy nhiên trong điều kiện sử dụng Io << Ip nên dòng quang điện có thể được xác định theo biểu thức: Đối với luồng bức xạ có phổ xác định , tỹ lệ chuyển đổi tĩnh : Độ nhạy Từ những vấn đề trên ta rút ra kết luận : Nếu tính đến giá trị của thì tỹ lệ chuyển đổi tĩnh và độ nhạy có cùng độ lớn . Quang trở là cảm biến không tuyến tính , độ nhạy của nó giảm khi bức xạ tăng (trừ trường hợp = 1). Độ nhạy tỷ lệ thuận với điện áp đặt vào quang trở . 2.2.2.5. Hoạt động Đặt quang trở trong bóng tối: Không có dòng điện. Chiếu  ánh sang kích thích có bước sóng nhỏ hơn giới hạn quang dẫn: xuất hiện dòng điện. Điện trở của quang trở giảm rất mạnh khi có ánh  sáng kích thích thích hợp. Hình 2.11. Hoạt động của quang trở Khi chiếu ánh sáng vào quang trở, các hạt mang điện trong bán dẫn nhận thêm được năng lượng từ photon trở thành điện tử tự do làm thay đổi điện trở suất (hay độ dẫn) trong bán dẫn. 2.2.2.6.Ứng dụng của quang trở Sử dụng để phân biệt mức sáng khác nhau: trạng thái tối- sáng hoặc xung ánh sáng. Điều khiển rơ-le: Dòng điện sáng dùng để điều khiển trực tiếp hoặc gián tiếp thông qua mạch khuếch đại để đóng mở rơ-le. Thu tín hiệu quang: quang trở được sử dụng đểbiến đổi xung quang thành xung điện. 2.3. Cơ sở thiết kế mạng Thiết bị điều khiển kết nối và trao đổi thông tin với nhau cũng như giao tiếp với máy tính trung tâm thông qua đường truyền Ethernet qua giao thức TCP/IP. Hiện nay hầu hết các máy tính đều hỗ trợ chuẩn này thông qua cổng RJ45 hay còn gọi là cổng Ethernet. Trên bảng mạch của hệ thống điều khiển cũng được thiết kế một cổng Ethernet với tốc độ 10Mbps, khi đó tốc độ truyền thông tăng gấp 87 lần so với việc sử dụng chuẩn RS485 thông thường. Hình 2.12. Kiểm tra kết nối giữa thiết bị với máy tính thông qua cổng Ethernet Dựa trên giải pháp này ta có thể điều khiển và giám sát hệ thống từ khoảng cách rất xa thông qua mạng cục bộ hoặc từ Internet. Tuy nhiên trong phạm vi đề tài cơ sở này, giải pháp truyền thông qua chuẩn TCP/IP mới dừng lại ở mức nghiên cứu những ứng dụng đơn giản (đo lường các tín hiệu analog, vào/ra số). TCP/IP (Transmission Control Protocol/ Internet Protocol) là một hệ thống giao thức_một tập hợp các giao thức hỗ trợ việc lưu truyền trên mạng. TCP/IP là một bộ giao thức được thiết kế để đạt được hai mục tiêu chính: - Cho phép truyền thông qua các đường dây của mạng rộng (Wide Area Network– WAN). - Cho phép truyền thông giữa các môi trường đa dạng. Hiểu được bản chất của các giao thức này giúp ta làm chủ ứng dụng của chúng trong việc điều khiển cũng như hiểu được sự quan trọng của chúng trong các mạng ngày nay. 2.3.1. Mạng và giao thức 2.3.1.1. Khái niệm mạng máy tính Mạng máy tính hay hệ thống mạng (computer network hay network system) là một tập hợp các máy tính được kết nối nhau thông qua các phương tiện truyền dẫn để nhằm cho phép chia sẻ tài nguyên: máy in, máy fax, tệp tin, dữ liệu,. . . Hình 2.13. Mô hình tổng quát của mạng Internet Như trong hình 2.10 kết cấu vật lý của mạng Internet gồm có mạng chính chứa các server cung cấp dịch vụ cho mạng, mạng nhánh bao gồm các trạm làm việc sử dụng dịch vụ do Internet cung cấp. "Đám mây Internet" hàm chứa vô vàn mạng chính, mạng nhánh và bao phủ toàn thế giới. Để một hệ thống phức tạp như vậy hoạt động trơn tru và hiệu quả thì điều kiện tiên quyết là mọi máy tính trong mạng, dù khác nhau về kiến trúc, đều phải giao tiếp với mạng theo cùng một quy luật, đó là giao thức TCP/IP. 2.3.1.2 Các thành phần của mạng máy tính. Một mạng máy tính cho dù có đơn giản hay phức tạp để hoạt động được đều cần có hai thành phần cơ bản đó là phần cứng và phần mềm. -Phần cứng:Phần cứng mạng máy tính bao gồm: máy tính, card mạng, dây cáp, Hub, Switch… Tùy theo kiến trúc mạng mà chúng ta chọn phần cứng cho thích hợp. Hình 2.14. Các thiết bị phần cứng để nối mạng máy tính -Phần mềm: Phần mềm mạng máy tính bao gồm các chương trình được cài đặt trên máy tính để chúng có thể nhận ra nhau và truyền dữ liệu với nhau. Phần mềm của mạng phải được thiết kế phù hợp với các yêu cầu đặt ra bởi phần cứng và mục đích sử dụng. Phần mềm mạng được xây dựng dựa trên nền tảng của ba khái niệm cơ bản đó là: giao thức (Protocol), dịch vụ (Service) và giao diện (Interface). 2.3.2. Phân loại mạng theo địa lý Mạng máy tính có thể phân bố trên một vùng, lãnh thổ, quốc gia hay quốc tế. 2.3.2.1. Mạng cục bộ LAN (Local Area Network) Là hệ truyền thông tốc độ cao được thiết kế để kết nối các máy tính và các thiết bị xử lý dữ liệu khác cùng hoạt động với nhau trong một khu vực địa lý nhỏ như ở một tầng của toà nhà, hoặc trong một toà nhà.... Một số mạng LAN có thể kết nối lại với nhau trong một khu làm việc bán kính vài trăm mét. Các mạng LAN trở nên thông dụng vì nó cho phép những người sử dụng dùng chung những tài nguyên quan trọng như máy in mầu, ổ đĩa CD-ROM, các phần mềm ứng dụng và những thông tin cần thiết khác. Trước khi phát triển công nghệ LAN các máy tính là độc lập với nhau, bị hạn chế bởi số lượng các chương trình tiện ích, sau khi kết nối mạng rõ ràng hiệu quả của chúng tǎng lên gấp bội. Hầu hết các mạng LAN ngày nay đều được thiết kế để hoạt động dựa trên một cấu trúc mạng định trước. Điển hình và sử dụng nhiều nhất là các cấu trúc: dạng hình sao, dạng hình tuyến, dạng vòng cùng với những cấu trúc kết hợp của chúng. Hình 2.15. Cấu trúc mạng hình sao Hình 2.16. Cấu trúc mạng hình tuyến Hình 2.17. Cấu trúc mạng dạng vòng 2.3.2.2. Mạng WAN (Wide Area Network) Mạng WAN được gọi là mạng diện rộng, nối kết các máy tính trong phạm vi quốc gia của một châu lục hay giữa các châu lục với nhau. Các LAN nối kết với nhau -> WAN 2.3.3. Internet và các thuật ngữ liên quan đến Internet 2.3.3.1. Khái niệm về Internet Internet được gọi là liên mạng máy tính toàn cầu. Về phần cứng bao gồm các mạng LAN, WAN của cả thế giới kết nối với nhau, về phần mềm cần phải có để các máy tính có thể nhận ra nhau bằng cách sử dụng một giao thức chung và giao thức đó là giao thức TCP/IP. Giao thức TCP/IP được xem như là ngôn ngữ chung cho tất cả các máy tính nối kết với Internet. Hình 2.18. Liên mạng máy tính toàn cầu – Internet 2.3.3.2. Công nghệ Ethernet Hơn 20 năm trước, Ethernet ra đời mang lại một mạng truyền dữ liệu nối tiếp tốc độ cao; tới nay, nó đã trở thành một chuẩn được chấp nhận khắp thế giới, và là giao thức thống trị các mạng LAN. Hơn 85% kết nối mạng được cài đặt trên thế giới là Ethernet. Tốc độ truyền dữ liệu phổ biến nhất của Ethernet là 10 triệu bit/s (10 Mbps), mặc dù vậy, hầu hết các mạng hiện nay đang được nhanh chóng nâng cấp lên Fast Ethernet với tốc độ 100 Mbps. Ethernet thường gắn với hệ điều khiển công nghiệp qua một điều khiển độc lập kết nối với PC hay mạng bằng cáp Ethernet. Ngày 22 tháng 5 năm 1973, Robert Metcalfe thuộc Trung tâm Nghiên cứu Palto Alto của hãng Xerox – PARC, bang California, đã đưa ra ý tưởng hệ thống kết nối mạng máy tính cho phép các máy tính có thể truyền dữ liệu với nhau và với máy in lazer. Lúc này, các hệ thống tính toán lớn đều được thiết kế dựa trên các máy tính trung tâm đắt tiền (mainframe). Điểm khác biệt lớn mà Ethernet mang lại là các máy tính có thể trao đổi thông tin trực tiếp với nhau mà không cần qua máy tính trung tâm. Mô hình mới này làm thay đổi thế giới công nghệ truyền thông. Chuẩn Ethernet 10Mbps đầu tiên được xuất bản năm 1980 bởi sự phối hợp phát triển của 3 hãng : DEC, Intel và Xerox. Chuẩn này có tên DIX Ethernet (lấy tên theo 3 chữ cái đầu của tên các hãng). Uỷ ban 802.3 của IEEE đã lấy DIX Ethernet làm nền tảng để phát triển. Năm 1985, chuẩn 802.3 đầu tiên đã ra đời với tên IEEE 802.3 Carrier Sense Multiple Access with Collition Detection (CSMA/CD) Access Method vesus Physical Layer Specification. Mặc dù không sử dụng tên Ethernet nhưng hầu hết mọi người đều hiểu đó là chuẩn của công nghệ Ethernet. Ngày nay chuẩn IEEE 802.3 là chuẩn chính thức của Ethernet. IEEE đã phát triển chuẩn Ethernet trên nhiều công nghệ truyền dẫn khác nhau vì thế có nhiều loại mạng Ethernet. Các chuẩn Ethernet đều hoạt động ở tầng Data Link trong mô hình 7 lớp OSI vì thế đơn vị dữ liệu mà các trạm trao đổi với nhau là các khung (frame). Cấu trúc khung Ethernet như sau: Các trường quan trọng trong phần mào đầu sẽ được mô tả dưới đây: Hình 2.19. Cấu trúc khung tin Ethernet Preamble: trường này đánh dấu sự xuất hiện của khung bit, nó luôn mang giá trị 10101010. Từ nhóm bit này, phía nhận có thể tạo ra xung đồng hồ 10 Mhz. SFD (start frame delimiter): trường này mới thực sự xác định sự bắt đầu của một khung. Nó luôn mang giá trị 10101011. Các trường Destination và Source: mang địa chỉ vật lý của các trạm nhận và gửi khung, xác định khung được gửi từ đâu và sẽ được gửi tới đâu. LEN: giá trị của trường nói lên độ lớn của phần dữ liệu mà khung mang theo. FCS mang CRC (cyclic redundancy checksum): phía gửi sẽ tính toán trường này trước khi truyền khung. Phía nhận tính toán lại CRC này theo cách tương tự. Nếu hai kết quả trùng nhau, khung được xem là nhận đúng, ngược lại khung coi như là lỗi và bị loại bỏ. Ethernet có 4 tốc ðộ dữ liệu: 10BASE-T : tốc ðộ tới 10 Mbps trên ðýờng cáp xoắn ðôi. Fast Ethernet : tốc ðộ gấp 10 lần 10BASE-T Ethernet (100 Mbps) trong khi ðó vẫn duy trì nhiều qui cách kĩ thuật của Ethernet. Gigabit Ethernet : mở rộng giao thức Ethernet hõn nữa, tãng tốc gấp 10 lần Fast Ethernet (1000Mbps hay 1 Gbps). 10 Gigabit Ethernet : một phiên bản tốc ðộ cao hõn nữa của Ethernet. Tốc ðộ dữ liệu 10 Gbps tạo ra bãng thông lớn trong các mạng diện rộng và các mạng trong thành phố. Ethernet phát triển theo công nghệ mạng LAN vì các giao thức của nó có những đặc tính sau: Đơn giản, dễ thực hiện, quản lí và bảo dưỡng. Cho phép thực hiện ở mạng với giá rẻ. Cung cấp nhiều các cấu trúc liên kết linh hoạt phục vụ cài đặt mạng. Bảo đảm sự kết nối thành công và sự hoạt động của các cơ cấu chấp hành. Các thành phần hệ thống mạng: Ethernet bao gồm các nút mạng và các phương tiện truyền thông. Các nút mạng được chia làm hai dạng cơ bản: Data Terminal Equipment (DTE): đó là những thiết bị nguồn và đích đến của khung dữ liệu. Các DTE điển hình là các máy tính, trạm làm việc, máy dịch vụ file, máy dịch vụ in… Data Communication Equipment (DCE): Các thiết bị trung gian của mạng đảm nhiệm nhận và gửi khung dữ liệu qua mạng. DCE có thể là các thiết bị độc lập như bộ lặp (repeater), các khoá mạng, các router, hoặc các thiết bị giao diện truyền thông như Card mạng và modem. 2.3.4. Giao thức TCP/IP TCP/IP là bộ giao thức cho phép kết nối các hệ thống mạng không đồng nhất với nhau. TCP/IP là viết tắt của Transmission Control Protocol (Giao thức Điều Khiển Truyền thông) /InternetProtocol (Giao thức Internet), ngày nay TCP/IP được sử dụng rộng rãi trong các mạng cục bộ cũng như trên mạng Internet toàn cầu. TCP/IP không chỉ gồm 2 giao thức mà thực tế nó là tập hợp của nhiều giao thức. Chúng ta gọi đó là 1 hệ giao thức hay bộ giao thức (Suite Of Protocols). TCP/IP là giao thức thuộc tầng vận chuyển OSI (Open System Interconnection). Thực hiện nhiệm vụ điều khiển và truyền tin, đảm bảo liên lạc thông suốt và tính đúng đắn của dữ liệu giữa hai tầng kết nối. Gồm bốn tầng, trong mô hình này là (theo thứ tự từ trên xuống): + Tầng ứng dụng (Application Layer) + Tầng giao vận (Transport Layer) + Tầng mạng (Internet Layer) + Tầng liên mạng (Network Interface Layer) Hình 2.20. Kiến trúc TCP/IP Tầng liên mạng (Network Interface Layer): Tầng Liên Mạng có trách nhiệm đưa dữ liệu tới và nhận dữ liệu từ phương tiện truyền dẫn. Tầng này bao gồm các thiết bị giao tiếp mạng (Card Mạng và Cáp Mạng) và chương trình cung cấp các thông tin cần thiết để có thể hoạt động, truy nhập đường truyền vật lý qua thiết bị giao tiếp mạng đó. Tầng mạng (Internet Layer): Nằm trên tầng liên mạng. Tầng này có chức năng gán địa chỉ, đóng gói và định tuyến (Route) dữ liệu. Bốn giao thức quan trọng nhất trong tầng này gồm: IP (Internet Protocol): Có chức năng gán địa chỉ cho dữ liệu trước khi truyền và định tuyến chúng tới đích. ARP (Address Resolution Protocol): Có chức năng biên dịch địa chỉ IP của máy đích thành địa chỉ MAC (Media Access Control). ICMP (Internet Control Message Protocol): Có chức năng thông báo lỗi trong trường hợp truyền dữ liệu bị hỏng. IGMP (Internet Group Management Protocol): Có chức năng điều khiển truyền đa hướng (Multicast). Tầng giao vận (Transport Layer): Có trách nhiệm thiết lập phiên truyền thông giữa các máy tính và quy định cách truyền dữ liệu 2 giao thức chính trong tầng này gồm có hai giao thức chính: TCP (Transmission Control Protocol) và UDP (User Datagram Protocol). TCP cung cấp các kênh truyền thông hướng kết nối và đảm bảo truyền dữ liệu một cách tin cậy, nó cung cấp một luồng dữ liệu tin cậy giữa hai trạm, nó sử dụng các cơ chế như chia nhỏ các gói tin của tầng trên thành các gói tin có kích thước thích hợp cho tầng mạng bên dưới, báo nhận gói tin, đặt hạn chế thời gian time-out để đảm bảo bên nhận biết được các gói tin đã gửi đi. TCP thường truyền các gói tin có kích thước lớn và yêu cầu phía nhận xác nhận về các gói tin đã nhận. Do tầng này đảm bảo tính tin cậy, tầng trên sẽ không cần quan tâm đến nữa. UDP cung cấp một dịch vụ đơn giản hơn cho tầng ứng dụng. UDP cung cấp kênh truyền thông phi kết nối, nó chỉ gửi các gói dữ liệu từ trạm này tới trạm kia mà không đảm bảo các gói tin đến được tới đích. Các ứng dụng dùng UDP thường chỉ truyền những gói có kích thước nhỏ, độ tin cậy dữ liệu phụ thuộc vào từng ứng dụng. Các cơ chế đảm bảo độ tin cậy cần được thực hiện bởi tầng trên. Tầng ứng dụng (Application Layer): Tầng ứng dụng là tầng trên cùng của mô hình TCP/IP bao gồm các tiến trình và các ứng dụng cung cấp cho người sử dụng để truy cập mạng. Một số giao thức thông dụng trong tầng này là: DHCP (Dynamic Host Configuration Protocol): Giao thức cấu hình trạm động. DNS (Domain Name System): Hệ thống tên miền. SNMP (Simpe Network Management Protocol): Giao thức quản lý mạng đơn giản. FTP (File Transfer Protocol): Giao thức truyền tập tin. TFTP (Trivial File Transfer Protocol): Giao thức truyền tập tin bình thường. SMTP (Simple Mail Transfer Protocol): Giao thức truyền thư đơn giản. Hình 2.21. Mô tả khái quát về bộ giao thức TCP/IP. Cũng tương tự như trong mô hình OSI, khi truyền dữ liệu, quá trình tiến hành từ tầng trên xuống tầng dưới, qua mỗi tầng dữ liệu được thêm vào một thông tin điều khiển được gọi là phần header. Khi nhận dữ liệu thì quá trình xảy ra ngược lại, dữ liệu được truyền từ tầng dưới lên và qua mỗi tầng thì phần header tương ứng được lấy đi và khi đến tầng trên cùng thì dữ liệu không còn phần header nữa. Hình 2.22. Cấu trúc dữ liệu trong TCP/IP Hình 2.19 cho ta thấy lược đồ dữ liệu qua các tầng. Trong hình vẽ này ta thấy tại các tầng khác nhau, dữ liệu được mang những thuật ngữ khác nhau: - Trong tầng ứng dụng dữ liệu là các luồng được gọi là stream. - Trong tầng giao vận, đơn vị dữ liệu mà TCP gửi xuống tầng dưới gọi là TCP segment. - Trong tầng mạng, dữ liệu mà IP gửi tới tầng dưới được gọi là IP datagram. - Trong tầng liên kết, dữ liệu được truyền đi gọi là frame. 2.3.5. Hệ thống tên - địa chỉ 2.3.5.1. Địa chỉ vật lý, còn gọi là địa chỉ MAC Sở dĩ có tên gọi như vậy là vì địa chỉ này gắn liền với phần cứng và đại diện cho một thiết bị. Thông thường địa chỉ vật lý được đặt ngay trên bảng mạch máy tính hay trên thiết bị kết nối trực tiếp với máy (modem, card mạng...) Địa chỉ vật lý được sử dụng như sau: Thiết bị nhận dữ liệu kiểm tra địa chỉ vật lý đích của gói dữ liệu ở tầng vật lý. Nếu địa chỉ đích này phù hợp địa chỉ vật lý của thiết bị thì gói dữ liệu sẽ được chuyển lên tầng trên, nếu không nó sẽ bị bỏ qua. 2.3.5.2. SAP (Service Access Point) Dùng để đại diện cho giao thức bên trên tầng MAC, ở đây là IP. 2.3.5.3. Địa chỉ mạng (network address) Một thực thể trong mạng được xác định chỉ qua địa chỉ mạng mà không cần địa chỉ vật lý. Dữ liệu được truyền qua mạng chỉ dựa vào địa chỉ mạng. Khi nào dữ liệu tới mạng LAN thì địa chỉ vật lý mới cần thiết để đưa dữ liệu tới đích. Ví dụ: Máy gửi có địa chỉ 128.1.6.7 -> địa chỉ mạng là 128.1 Máy nhận có địa chỉ 132.5.8.12 -> địa chỉ mạng là 132.5 Mạng Internet có trách nhiệm dựa vào 2 địa chỉ mạng trên để đưa dữ liệu tới mạng 132.5. Khi tới mạng 132.5 thì dựa vào địa chỉ 8.12 sẽ tìm ra địa chỉ vật lý thực để truyền dữ liệu tới đích. Như vậy có một thắc mắc là: đã có địa chỉ vật lý rồi, tại sao lại cần thêm địa chỉ mạng? Việc tồn tại 2 loại địa chỉ là do các nguyên nhân: + 2 hệ thống địa chỉ được phát triển một cách độc lập bởi các tổ chức khác nhau. + Địa chỉ mạng chỉ có 32 bit sẽ tiết kiệm đường truyền hơn so với địa chỉ vật lý 48 bit. + Khi mạch máy hỏng thì địa chỉ vật lý cũng mất. + Trên quan điểm người thiết kế mạng thì sẽ rất hiệu quả khi tầng IP không liên quan gì với các tầng dưới. Như trên đã nói, từ địa chỉ mạng có thể těm được địa chỉ vật lý. Công việc tìm kiếm này được thực hiện bởi giao thức ARP (Address Resolution Protocol). Nguyên tắc làm việc của ARP là duy trì một bảng ghi tương ứng địa chỉ IP - địa chỉ vật lý. Khi nhận được địa chỉ IP, ARP sẽ dùng bảng này để tìm ra địa chỉ vật lý. Nếu không thấy, nó sẽ gửi một gói dữ liệu, gọi là ARP request, chứa địa chỉ IP vào mạng LAN. Nếu máy nào nhận ARP request và nhận ra địa chỉ IP của mình thì sẽ gửi lại một gói dữ liệu chứa địa chỉ vật lý của nó. Để hoạt động hiệu quả như trên, mỗi máy chủ DNS(Domain Name Sever) lưu trữ một cơ sở dữ liệu gồm các bản ghi chứa thông tin: + Tên của DNS cấp cao hơn + Địa chỉ IP + Địa chỉ dạng chữ tương ứng. Chỉ số của bản ghi được lấy từ địa chỉ IP tương ứng, nhờ đó từ địa chỉ IP có thể dễ dàng tìm ra địa chỉ chữ. 2.3.5.4. Protocol ID Chỉ ra giao thức của tầng giao vận. Trên Internet trường này là TCP hoặc UDP. 2.3.5.5. Port Là một số đặc trưng cho một chương trình chạy trên Internet. Ví dụ, chương trình lấy thư điện tử qua giao thức IMAP có port=143, truyền file có port =21, v.v… 2.3.5.6. Username Là tên người đăng kí sử dụng chương trình. IP sử dụng các thông tin điều khiển trong header của gói dữ liệu IP để quyết định đường đi tiếp theo của gói này. Có rất nhiều thông tin điều khiển nhưng ở đây chỉ xin phân tích các thông tin quan trọng. Đầu tiên là địa chỉ đích. Nếu địa chỉ đích trùng với địa chỉ của router đó thì gói dữ liệu được truyền trực tiếp cho host B. Nếu không trùng thì dữ liệu sẽ được truyền đến router tiếp theo trên đường đi. Vấn đề là router nào được chọn. Có 2 khả năng để lựa chọn router, tức là 2 khả năng để dẫn đường: + Thứ nhất là tuân theo một cách nghiêm ngặt source routing. Dữ liệu sẽ được truyền cho router tiếp theo trong source routing. Nhưng dữ liệu chỉ được truyền đi khi router được chọn có trong bảng các router có thể đến được của router hiện tại, bằng không sẽ sinh ra lỗi. + Thứ hai là "quên đi" source routing và tìm đường mới tới đích. Router tiếp theo được chọn dựa trên sự tìm đường này. Thông thường sự tìm đường dựa trên thuật toán Dijstra tìm kiếm theo chiều rộng. Trên thực tế, cách này đang được sử dụng rộng rãi và có thể trở thành chuẩn trong tương lai. Các gói dữ liệu IP thường có kích thước phụ thuộc vào mạng con. Các mạng con khác nhau thì kích thước gói IP của chúng cũng khác nhau. Vậy giả sử mạng A truyền được gói dữ liệu có kích thước lớn nhất là 1024 byte, mạng B truyền được gói dữ liệu có kích thước lớn nhất là 256 byte thì gói dữ liệu từ mạng A có kích thước 1024 byte qua mạng B như thế nào? Để giải quyết vấn đề này, IP cung cấp khả năng phân và gom mảnh gói dữ liệu. Đây chính là lúc IP sử dụng trường flags và offset trong gói dữ liệu IP. Trường flags thực chất là các cờ thông báo gói dữ liệu này có bị phân mảnh hay không, trường offset chứa giá trị tương đối của gói con trong gói to ban đầu. Khi phân mảnh các cờ được bật lên, đồng thời trường offset được thiết lập giá trị. Dựa vào các dữ liệu trên, IP có thể dễ dàng gom mảnh gói dữ liệu, hồi phục khối dữ liệu từ ban đầu. 2.3.6. Địa chỉ IP Khi tham gia vào Internet các máy tính được gọi là Host và có một địa chỉ IP dùng để nhận dạng được gọi là địa chỉ host (host address) hay địa chỉ máy. - Địa chỉ IP:là một chuỗi bao gồm 4 số (Octet), mỗi Octet có 8 bit tương đương 1 byte được tách biệt với nhau bởi dấu chấm (.). Như vậy địa chỉ IP có độ dài 32 bit (4 byte) và mỗi byte người ta thường viết dưới dạng thập phân với giá trị tương ứng từ 0 đến 255. Một địa chỉ IP gồm 2 phần: + Địa chỉ Host (Host address): HostID + Địa chỉ mạng (Network address): NetID Class Bit: bit nhận dạng là những bit đầu tiên của một địa chỉ IP mà các Octet viết dưới dạng nhị phân. Phân lớp địa chỉ IP: người ta phân địa chỉ IP thành 5 lớp: A, B, C, D, E. Dựa vào Class bit, người ta có thể xác định được lớp của một địa chỉ IP như sau: + Lớp A: 0 + Lớp B: 10 + Lớp C: 110 + Lớp D: 1110 + Lớp E: 1111 Hình 2.23. Phân lớp địa chỉ IP Thông tin chi tiết về các lớp được mô tả như sau: + Lớp A: Có số mạng ít nhất nhưng lại có số Host nhiều nhất thích hợp cho những tổ chức lớn có nhiều máy tính. + Lớp B: có số mạng và số Host vừa phải được sử dụng cho các tổ chức có kích thước trung bình. + Lớp C: có nhiều mạng nhưng chỉ có 254 host thích hợp cho tổ chức có kích thước nhỏ, ít máy tính. Ví dụ: Địa chỉ IP: 192.168.0.131 có byte đầu tiên là 192 nằm trong khoảng từ 192 -> 223 nên thuộc lớp C; địa chỉ mạng 192.168.0 và địa chỉ host là 131. - Việc cấp địa chỉ IP: Địa chỉ IP cho các máy tính (Host) trên Internet phải được cung cấp và quản lý thống nhất nếu muốn nối kết vào Internet. Cơ quan quản lý địa chỉ IP là NIC (Network Information Center). Tại Châu Á Thái Bình Dương là APNIC (Asean Pacific Network Information Center) và tại Việt Nam là VNNIC (Việt Nam Network Information Center). 2.3.7. Cở sở giao thức và thiết kế lưu đồ dữ liệu. - Chồng giao thức TCP/IP: Hình 2.24. 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 Hình 2.25. Lưu đồ dữ liệu vào/ra của giao thức TCP/IP Như vậy, phần lập trình sẽ chia ra các module sau: - Module điều khiển Pic18f97j60: nằm trong file “pic18f97j60.c” và file header “pic18f97j60.h”, thêm file “pic18f97j60conf.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 phần mềm MPLAB C18. 2.3.8. Lập trình giao thức Ethernet. 2.3.8.1. Hoạt động của TCP/IP - Dữ liệu truyền từ ứng dụng, đến một trong 2 giao thức vận chuyển (TCP hay UDP). Một gói tin hay đơn vị dữ liệu (PDU) của TCP/UDP thường được gọi là segment (đoạn dữ liệu). - Đoạn dữ liệu xuống lớp Internet, ở đó giao thức IP cung cấp thông tin đánh địa chỉ luận lý (địa chỉ IP) và đóng gói dữ liệu vào 1 datagram, thường được gọi là gói tin IP (IP packet). - Datagram IP đến lớp truy cập mạng (ở đây là giao thức ethernet), và được đóng gói vào 1 hay nhiều khung dữ liệu (frame ethernet), sau đó đưa xuống tầng vật lý (ví dụ IC Pic18f97j60) để gửi đi. Khung dữ liệu được chuyển thành một luồng các bit để truyền đi trên môi trường mạng. - Ở phía thu, quá trình xảy ra ngược lại, tầng vật lý sẽ nhận luồng bit, khôi phục lại frame dữ liệu, giao thức ethernet phía nhận sẽ xử lý frame dữ liệu này, tách ra gói tin IP (IP packet) và đẩy lên giao thức IP nếu đây là gói IP. Còn trong trường hợp bên trong frame ethernet không phải là 1 gói IP mà là 1 gói tin của giao thức ARP thì nó sẽ đẩy gói này sang cho giao thức ARP xử lý (xem lại hình minh họa lưu đồ dữ liệu giữa các giao thức). - Tại tầng giao thức IP, gói IP sẽ được xử lý, xác định xem dữ liệu chứa bên trong là của giao thức nào (TCP, UDP, hay ICPM) và chuyển đến giao thức tương ứng để xử lý tiếp theo. Cuối cùng, giao thức kế (TCP, UDP, hay ICMP) sẽ xử lý tiếp segment dữ liệu nhận được, xác định xem dữ liệu này là của ứng dụng nào (ví dụ như HTTP hay DHCP,…) và chuyển dữ liệu đến ứng dụng tương ứng Trước hết, ta cần nắm rõ cấu trúc của tất cả các gói tin của mỗi giao thức để có thể xử lý được thông tin chứa trong nó. 2.3.8.2. Cấu trúc một Frame Ethernet Hình 2.26. Cấu trúc 1 frame Ethernet Như vậy 1 frame ethernet bắt đầu bằng các byte Preamble để dồng bộ và 1 byte Start of Frame để xác định đầu frame (phần này sẽ được Pic18f97j60 tự động lược bỏ, ta không cần quan tâm). Tiếp theo là địa chỉ MAC của host nhận (destination address), địa chỉ MAC của host gửi (source address), mỗi địa chỉ MAC này gồm 6 byte. Kế đến là 2 byte length (cho biết chiều dài) hoặc type (cho biết dữ liệu chứa trong frame là loại dữ liệu của giao thức lớp trên nào). Kế đến là dữ liệu. Cuối cùng là phần kiểm tra lỗi (FCS), phần này cũng được Pic18f97j60 xử lý. Trong chồng giao thức TCP/IP, giao thức ethernet đóng vai trò lớp truy nhập và truyền dẫn. Việc gửi và nhận dữ liệu ở lớp ethernet được thực hiện dựa vào địa chỉ vật lý hay còn gọi là địa chỉ MAC. Trong mỗi frame ethernet đều chứa 2 địa chỉ MAC: một địa chỉ của host gửi và 1 địa chỉ của host nhận. Khi lớp Ethernet nhận được 1 frame dữ liệu, trước hết nó sẽ kiểm tra địa chỉ host nhận xem có phải là địa chỉ của nó không (tức là gửi cho nó), nếu đúng nó sẽ nhận frame này và chuyển đến lớp IP. Ngoài ra còn có 1 trường hợp nữa lớp ethernet sẽ nhận frame: đó là nếu địa chỉ host nhận là địa chỉ broadcast (tức là gửi cho tất cả mọi máy trong mạng LAN), trong trường hợp này frame sẽ được nhận và xử lý. Ngoài việc kiểm tra địa chỉ, trong frame ethernet còn có 1 trường chứa mã kiểm tra lỗi giúp phát hiện những lỗi xảy ra trong quá trình truyền, các frame bị xác định là có lỗi sẽ bị bỏ qua. Trong thiết bị của chúng ta, việc kiểm tra lỗi và kiểm tra địa được thực hiện tự động bởi IC Pic18f97j60, do đó ta không cần lập trình cho các chức năng này. Mỗi khi nhận được 1 frame trên đường truyền, Pic18f97j60 sẽ kiểm tra lỗi xem có sai sót không, tiếp đó nó sẽ đối chiếu địa chỉ host nhận với địa chỉ đã được cấu hình cho nó (trong các thanh ghi địa chỉ MAC). CHƯƠNG 3 - THIẾT KẾ MẠCH ĐIỀU KHIỂN - GIÁM SÁT THIẾT BỊ TỪ XA 3.1. Sơ đồ khối của hệ thống Hình 3.1. Sơ đồ khối của thiết bị điều khiển trung tâm 3.2. Sơ đồ nguyên lý của các khối trong mạch điều khiển 3.1.1. Khối CPU PIC 18F97J60 Hình 3.1. Khối CPU PIC18F97J60 CPU làm việc ở mức điện áp 3.3V được cấp từ chân Vcc. Khi cung cấp nguồn cho chíp, lúc này chíp sẽ làm việc. Đầu tiên sẽ khởi tạo TCPIP Stack của khối Ethernet. Và chờ dữ liệu tới để xử lý. Đọc các dữ liệu từ các khối khác kết nối với CPU như: DS18B20. DS1307, và các trạng thái của cảm biến. Xuất tín hiệu lên LCD, lên web service, Xử lý các tín hiệu trong quá trình làm việc. 3.1.2. Khối Ethernet Hình 3.2. Khối truyền thông giao tiếp Ethernet Trong VĐK PIC 18F97J60 có 1 khối Ethernet có khả năng kết nối trực tiếp với Internet qua giao thức TCP/IP thông qua cổng RJ45. Nguồn cung cấp cho khối Ethernet là 3.3V. 3.1.3. Khối LCD Hình 3.3. Khối giao tiếp màn hình hiển thị LCD Nguồn nuôi cho LCD là 5V. Kết nối trực tiếp với với CPU. Hiển thị dữ liệu của CPU khi làm việc với DS1307 và DS18B20. 3.1.4. Khối tạo nguồn 3.3V Hình 3.4 Khối tạo nguồn nuôi +3.3V Điện áp cung cấp cho mạch là 5V. Ổn áp LM117MP-3.3 có nhiệm vụ chuyển điện áp 5V này về 3.3V để cung cấp cho CPU và các khối khác sử dụng nguồn 3.3V. 3.1.5. Khối thời gian thực Hình 3.5 IC thời gian thực DS1307 là IC chứa thời gian thực. Nguồn nuôi với điện áp 5V và có 1 bộ tạo giao động nội. 3.1.6. Tụ lọc Hình 3.6. Tụ lọc Có tác dụng lọc phẳng điện áp. Có 2 mức điện áp cần lọc là 3.3V và 5V. 3.1.7. Khối kết nối mạch nạp Hình 3.7. Kết nối mạch nạp Nguồn cung cấp cho khối mạch nạp là 3.3V Khối mạch nạp có nhiệm vụ kết nối CPU với mạch nạp PIC trong quá trình nạp phần mềm điều khiển. 3.1.8. Khối cảm biến nhiệt độ Hình 3.8. Cảm biến nhiệt DS18B20 là IC cảm biến nhiệt độ. Giao tiếp với CPU qua giao thức 1 dây. Nguồn cung cấp là 3.3V 3.1.9. Khối cảm biến ánh sáng Hình 3.9. Khối cảm biến ánh sáng Cường độ ánh sáng thay đổi dẫn tới điện áp ở 3 thay đổi. LM3933 có tác dụng so sánh điện áp tại hai điểm 2 và 3. Khi mức điện áp ở 3>2 lúc đó ở out sẽ có điện áp ra. Khi mức điện áp 3<2 lúc đó ở out sẽ có mức điện áp 0. 3.1.10. Khối mở rộng Hình 3.10. Kết nối cảm biến Có các chân mở rộng để thêm các ứng dụng hoặc chỉnh sửa khi cần thiết. Trong mạch có 1 chân kết nối với đẩu ra của khối cảm biến ánh sáng để điều khiển đèn. 3.1.11. Khối mô phỏng các cảm biến Hình 3.11. Mô phỏng các cảm biến Là các nút bấm mô phỏng cho các cảm biến. Kết nối với các I/O của PIC 18F97J60. Nguồn cung cấp 3.3V. 3.1.12. Mạch Reset Hình 3.12 Mạch reset Tạo tín hiệu reset cho PIC. Khi cấp nguồn PIC tự động reset và có đèn LED báo hiệu. 3.1.13. Khối tạo dao động Hình 3.13 Bộ tạo dao động Tạo ra tần số dao động 25Mhz cung cấp cho PIC. 3.1.14. Khối Transistor kích dòng và rơle Hình 3.14 Transistor kích dòng và rơle Có 3 rơle để điều khiển các tải sử dụng mức điện áp cao hơn. Transistor dùng để khuếch đại điện áp 3.3V từ các chân I/O lên mức 5V cung cấp cho cuận hút của rơle, điều khiển quá trình đóng cắt rơle. 3.1.15. Chuông cảnh báo Hình 3.15 Chuông báo hiệu Làm việc với nguồn là 5V. Khi có các tín hiệu cảnh báo xuất ra các I/O. ở mức điện áp 3.5V qua Transistor được khuếch đại lên 5V. 3.1.16. Led báo hiệu Hình 3.16. Led báo hiệu Các đèn LED báo hiệu ở khối reset và khối rơle. Sơ đồ nguyên lý tổng thể mạch điều khiển Hình 3.17. Sơ đồ nguyên lý tổng thể mạch điều khiển 3.3. Một số hình ảnh của phần cứng. Hình 3.18. Mạch điều khiển Hình 3.19. Panel mô phỏng CHƯƠNG 4 - PHẦN MỀM 4.1. Lưu đồ thuật toán của hệ thống Hình 4.1. Lưu đồ thuật toán hệ thống 4.2. Giao diện trên Web điều khiển Hình 4.2. Giao diện Web điều khiển 4.3. Phần mềm (code) #define THIS_IS_STACK_APPLICATION // Include all headers for any enabled TCPIP Stack functions #include "TCPIP Stack/TCPIP.h" // Include functions specific to this stack application #include "MainDemo.h" #include "i2c.h" #include "ds18b20.h" #include "89_ds1307.h" #pragma config WDT=OFF, FOSC2=ON, FOSC=HSPLL, ETHLED=ON, XINST=OFF externunsignedchar tempValue; extern BYTE LCDText[16*2+1]; // Declare AppConfig structure and some other supporting stack variables APP_CONFIG AppConfig; BYTE AN0String[8]; // Use UART2 instead of UART1 for stdout (printf functions). Explorer 16 // serial port hardware is on PIC UART2 module. #if defined(EXPLORER_16) int __C30_UART = 2; #endif // Private helper functions. // These may or may not be present in all applications. staticvoid InitAppConfig(void); staticvoid InitializeBoard(void); staticvoid ProcessIO(void); // // PIC18 Interrupt Service Routines // // NOTE: Several PICs, including the PIC18F4620 revision A3 have a RETFIE FAST/MOVFF bug // The interruptlow keyword is used to work around the bug when using C18 #if defined(__18CXX) #if defined(HI_TECH_C) voidinterrupt low_priority LowISR(void) #else #pragma interruptlow LowISR void LowISR(void) #endif { TickUpdate(); } #if defined(HI_TECH_C) voidinterrupt HighISR(void) #else #pragma interruptlow HighISR void HighISR(void) #endif { #if defined(STACK_USE_UART2TCP_BRIDGE) UART2TCPBridgeISR(); #endif #if defined(ZG_CS_TRIS) zgEintISR(); #endif // ZG_CS_TRIS } #if !defined(HI_TECH_C) #pragma code lowVector=0x18 void LowVector(void){_asm goto LowISR _endasm} #pragma code highVector=0x8 void HighVector(void){_asm goto HighISR _endasm} #pragma code // Return to default code section #endif // C30 and C32 Exception Handlers // If your code gets here, you either tried to read or write // a NULL pointer, or your application overflowed the stack // by having too many local variables or parameters declared. #elif defined(__C30__) void _ISR __attribute__((__no_auto_psv__)) _AddressError(void) { Nop(); Nop(); } void _ISR __attribute__((__no_auto_psv__)) _StackError(void) { Nop(); Nop(); } #elif defined(__C32__) void _general_exception_handler(unsigned cause, unsigned status) { Nop(); Nop(); } #endif // // Main application entry point. // #if defined(__18CXX) void main(void) #else int main(void) #endif { static DWORD t = 0; static DWORD dwLastIP = 0; unsignedchar s ; unsignedint adc_value = 0; unsignedchar count = 0; unsignedint tb = 0; // Initialize application specific hardware InitializeBoard(); // Initialize stack-related hardware components that may be // required by the UART configuration routines TickInit(); #if defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2) MPFSInit(); #endif // Initialize Stack and application related NV variables into AppConfig. InitAppConfig(); // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); // Initialize any application-specific modules or functions/ // For this demo application, this only includes the // UART 2 TCP Bridge #if defined(STACK_USE_UART2TCP_BRIDGE) UART2TCPBridgeInit(); #endif LCDText[0] = ' '; LCDText[1] = ' '; LCDText[2] = ' '; LCDText[3] = 'D'; LCDText[4] = 'K'; LCDText[5] = ' '; LCDText[6] = 'T'; LCDText[7] = 'B'; LCDText[8] = ' '; LCDText[9] = 'T'; LCDText[10] = 'u'; LCDText[11] = ' '; LCDText[12] = 'x'; LCDText[13] = 'a'; // Now that all items are initialized, begin the co-operative // multitasking loop. This infinite loop will continuously // execute all stack-related tasks, as well as your own // application's functions. Custom functions should be added // at the end of this loop. // Note that this is a "co-operative mult-tasking" mechanism // where every task performs its tasks (whether all in one shot // or part of it) and returns so that other tasks can do their // job. // If a task needs very long time to do its job, it must be broken // down into smaller pieces so that other tasks can have CPU time. while(1) { if((!PORTHbits.RH4) || (!PORTHbits.RH5)) { LATGbits.LATG2 = 1; } // Blink LED0 (right most one) every second. if(TickGet() - t >= TICK_SECOND/2ul) { t = TickGet(); tempValue = ReadTemperature(); s = DS1307_get(0x02); s = bcd_cvr(s); LCDText[16] = s/10+0x30; LCDText[17] = s%10+0x30; LCDText[18] = ':'; s = DS1307_get(0x01); s = bcd_cvr(s); LCDText[19] = s/10+0x30; LCDText[20] = s%10+0x30; LCDText[21] = ' '; s = DS1307_get(0x04); s = bcd_cvr(s); LCDText[22] = s/10+0x30; LCDText[23] = s%10+0x30; LCDText[24] = '/'; s = DS1307_get(0x05); s = bcd_cvr(s); LCDText[25] = s/10+0x30; LCDText[26] = s%10+0x30; LCDText[27] = ' '; LCDText[28] = 'T'; LCDText[29] = '='; LCDText[30] = tempValue/10 +0x30; LCDText[31] = tempValue%10 +0x30; LCDUpdate(); if(tempValue > 50) { LATGbits.LATG2 = 1; } else LATGbits.LATG2 = 0; if(PORTAbits.RA2) BTN2_IO = 1; else BTN2_IO = 0; } // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. StackTask(); // This tasks invokes each of the core stack application tasks StackApplications(); // Process application specific tasks here. // For this demo app, this will include the Generic TCP // client and servers, and the SNMP, Ping, and SNMP Trap // demos. Following that, we will process any IO from // the inputs on the board itself. // Any custom modules or processing you need to do should // go here. #if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE) GenericTCPClient(); #endif #if defined(STACK_USE_GENERIC_TCP_SERVER_EXAMPLE) GenericTCPServer(); #endif #if defined(STACK_USE_SMTP_CLIENT) SMTPDemo(); #endif #if defined(STACK_USE_ICMP_CLIENT) PingDemo(); #endif #if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED) SNMPTrapDemo(); if(gSendTrapFlag) SNMPSendTrap(); #endif #if defined(STACK_USE_BERKELEY_API) BerkeleyTCPClientDemo(); BerkeleyTCPServerDemo(); BerkeleyUDPClientDemo(); #endif ProcessIO(); // If the local IP address has changed (ex: due to DHCP lease change) // write the new IP address to the LCD display, UART, and Announce // service if(dwLastIP != AppConfig.MyIPAddr.Val) { dwLastIP = AppConfig.MyIPAddr.Val; #if defined(STACK_USE_UART) putrsUART((ROM char*)"\r\nNew IP Address: "); #endif DisplayIPValue(AppConfig.MyIPAddr); #if defined(STACK_USE_UART) putrsUART((ROM char*)"\r\n"); #endif #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif } } } // Writes an IP address to the LCD display and the UART as available void DisplayIPValue(IP_ADDR IPVal) { // printf("%u.%u.%u.%u", IPVal.v[0], IPVal.v[1], IPVal.v[2], IPVal.v[3]); BYTE IPDigit[4]; BYTE i; #ifdef USE_LCD BYTE j; BYTE LCDPos=16; #endif for(i = 0; i <sizeof(IP_ADDR); i++) { uitoa((WORD)IPVal.v[i], IPDigit); #if defined(STACK_USE_UART) putsUART(IPDigit); #endif #ifdef USE_LCD for(j = 0; j < strlen((char*)IPDigit); j++) { LCDText[LCDPos++] = IPDigit[j]; } if(i == sizeof(IP_ADDR)-1) break; LCDText[LCDPos++] = '.'; #else if(i == sizeof(IP_ADDR)-1) break; #endif #if defined(STACK_USE_UART) while(BusyUART()); WriteUART('.'); #endif } #ifdef USE_LCD if(LCDPos < 32u) LCDText[LCDPos] = 0; LCDUpdate(); #endif } // Processes A/D data from the potentiometer staticvoid ProcessIO(void) { #if defined(__C30__) || defined(__C32__) // Convert potentiometer result into ASCII string uitoa((WORD)ADC1BUF0, AN0String); #else // AN0 should already be set up as an analog input ADCON0bits.GO = 1; // Wait until A/D conversion is done while(ADCON0bits.GO); // AD converter errata work around (ex: PIC18F87J10 A2) #if !defined(__18F87J50) && !defined(_18F87J50) && !defined(__18F87J11) && !defined(_18F87J11) PRODL = ADCON2; ADCON2 |= 0x7; // Select Frc mode by setting ADCS0/ADCS1/ADCS2 ADCON2 = PRODL; #endif // Convert 10-bit value into ASCII string uitoa(*((WORD*)(&ADRESL)), AN0String); #endif } /**************************************************************************** Function: static void InitializeBoard(void) Description: This routine initializes the hardware. It is a generic initialization routine for many of the Microchip development boards, using definitions in HardwareProfile.h to determine specific initialization. Precondition: None Parameters: None - None Returns: None Remarks: None ***************************************************************************/ staticvoid InitializeBoard(void) { #if defined(__18CXX) // Enable 4x/5x/96MHz PLL on PIC18F87J10, PIC18F97J60, PIC18F87J50, etc. OSCTUNE = 0x40; BTN1_TRIS = 0; BTN2_TRIS = 0; BTN3_TRIS = 0; BTN1_IO = 0; BTN2_IO = 0; BTN3_IO = 0; TRISHbits.TRISH4 = 1; TRISHbits.TRISH5 = 1; TRISHbits.TRISH6 = 1; TRISHbits.TRISH7 = 1; TRISGbits.TRISG2 = 0; // Initialize and display the stack version on the LCD LCDInit(); DelayMs(100); // Enable internal PORTB pull-ups INTCON2bits.RBPU = 0; // Configure USART TXSTA = 0x20; RCSTA = 0x90; // See if we can use the high baud rate setting #if ((GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1) <= 255 SPBRG = (GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1; TXSTAbits.BRGH = 1; #else // Use the low baud rate setting SPBRG = (GetPeripheralClock()+8*BAUD_RATE)/BAUD_RATE/16 - 1; #endif // Enable Interrupts RCONbits.IPEN = 1; // Enable interrupt priorities INTCONbits.GIEH = 1; INTCONbits.GIEL = 1; #endif #if defined(SPIRAM_CS_TRIS) SPIRAMInit(); #endif #if defined(EEPROM_CS_TRIS) XEEInit(); #endif #if defined(SPIFLASH_CS_TRIS) SPIFlashInit(); #endif ADCON1 = 0x0F; I2C_init(); TRISAbits.TRISA2 = 1; // DS1307_settime(0x23,0x38,0x00); // DS1307_setdate(0x03,0x01,0x13); } /********************************************************************* * Function: void InitAppConfig(void) * * PreCondition: MPFSInit() is already called. * * Input: None * * Output: Write/Read non-volatile config variables. * * Side Effects: None * * Overview: None * * Note: None ********************************************************************/ // MAC Address Serialization using a MPLAB PM3 Programmer and // Serialized Quick Turn Programming (SQTP). // The advantage of using SQTP for programming the MAC Address is it // allows you to auto-increment the MAC address without recompiling // the code for each unit. To use SQTP, the MAC address must be fixed // at a specific location in program memory. Uncomment these two pragmas // that locate the MAC address at 0x1FFF0. Syntax below is for MPLAB C // Compiler for PIC18 MCUs. Syntax will vary for other compilers. //#pragma romdata MACROM=0x1FFF0 static ROM BYTE SerializedMACAddress[6] = {MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3, MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6}; //#pragma romdata staticvoid InitAppConfig(void) { AppConfig.Flags.bIsDHCPEnabled = TRUE; AppConfig.Flags.bInConfigMode = TRUE; memcpypgm2ram((void*)&AppConfig.MyMACAddr, (ROM void*)SerializedMACAddress, sizeof(AppConfig.MyMACAddr)); // { // _prog_addressT MACAddressAddress; // MACAddressAddress.next = 0x157F8; // _memcpy_p2d24((char*)&AppConfig.MyMACAddr, MACAddressAddress, sizeof(AppConfig.MyMACAddr)); // } AppConfig.MyIPAddr.Val = MY_DEFAULT_IP_ADDR_BYTE1 | MY_DEFAULT_IP_ADDR_BYTE2<<8ul | MY_DEFAULT_IP_ADDR_BYTE3<<16ul | MY_DEFAULT_IP_ADDR_BYTE4<<24ul; AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val; AppConfig.MyMask.Val = MY_DEFAULT_MASK_BYTE1 | MY_DEFAULT_MASK_BYTE2<<8ul | MY_DEFAULT_MASK_BYTE3<<16ul | MY_DEFAULT_MASK_BYTE4<<24ul; AppConfig.DefaultMask.Val = AppConfig.MyMask.Val; AppConfig.MyGateway.Val = MY_DEFAULT_GATE_BYTE1 | MY_DEFAULT_GATE_BYTE2<<8ul | MY_DEFAULT_GATE_BYTE3<<16ul | MY_DEFAULT_GATE_BYTE4<<24ul; AppConfig.PrimaryDNSServer.Val = MY_DEFAULT_PRIMARY_DNS_BYTE1 | MY_DEFAULT_PRIMARY_DNS_BYTE2<<8ul | MY_DEFAULT_PRIMARY_DNS_BYTE3<<16ul | MY_DEFAULT_PRIMARY_DNS_BYTE4<<24ul; AppConfig.SecondaryDNSServer.Val = MY_DEFAULT_SECONDARY_DNS_BYTE1 | MY_DEFAULT_SECONDARY_DNS_BYTE2<<8ul | MY_DEFAULT_SECONDARY_DNS_BYTE3<<16ul | MY_DEFAULT_SECONDARY_DNS_BYTE4<<24ul; // SNMP Community String configuration #if defined(STACK_USE_SNMP_SERVER) { BYTE i; static ROM char * ROM cReadCommunities[] = SNMP_READ_COMMUNITIES; static ROM char * ROM cWriteCommunities[] = SNMP_WRITE_COMMUNITIES; ROM char * strCommunity; for(i = 0; i < SNMP_MAX_COMMUNITY_SUPPORT; i++) { // Get a pointer to the next community string strCommunity = cReadCommunities[i]; if(i >= sizeof(cReadCommunities)/sizeof(cReadCommunities[0])) strCommunity = ""; // Ensure we don't buffer overflow. If your code gets stuck here, // it means your SNMP_COMMUNITY_MAX_LEN definition in TCPIPConfig.h // is either too small or one of your community string lengths // (SNMP_READ_COMMUNITIES) are too large. Fix either. if(strlenpgm(strCommunity) >= sizeof(AppConfig.readCommunity[0])) while(1); // Copy string into AppConfig strcpypgm2ram((char*)AppConfig.readCommunity[i], strCommunity); // Get a pointer to the next community string strCommunity = cWriteCommunities[i]; if(i >= sizeof(cWriteCommunities)/sizeof(cWriteCommunities[0])) strCommunity = ""; // Ensure we don't buffer overflow. If your code gets stuck here, // it means your SNMP_COMMUNITY_MAX_LEN definition in TCPIPConfig.h // is either too small or one of your community string lengths // (SNMP_WRITE_COMMUNITIES) are too large. Fix either. if(strlenpgm(strCommunity) >= sizeof(AppConfig.writeCommunity[0])) while(1); // Copy string into AppConfig strcpypgm2ram((char*)AppConfig.writeCommunity[i], strCommunity); } } #endif // Load the default NetBIOS Host Name memcpypgm2ram(AppConfig.NetBIOSName, (ROM void*)MY_DEFAULT_HOST_NAME, 16); FormatNetBIOSName(AppConfig.NetBIOSName); #if defined(ZG_CS_TRIS) // Load the default SSID Name if (sizeof(MY_DEFAULT_SSID_NAME) >sizeof(AppConfig.MySSID)) { ZGErrorHandler((ROM char *)"AppConfig.MySSID[] too small"); } memcpypgm2ram(AppConfig.MySSID, (ROM void*)MY_DEFAULT_SSID_NAME, sizeof(MY_DEFAULT_SSID_NAME)); #endif #if defined(EEPROM_CS_TRIS) { BYTE c; // When a record is saved, first byte is written as 0x60 to indicate // that a valid record was saved. Note that older stack versions // used 0x57. This change has been made to so old EEPROM contents // will get overwritten. The AppConfig() structure has been changed, // resulting in parameter misalignment if still using old EEPROM // contents. XEEReadArray(0x0000, &c, 1); if(c == 0x60u) XEEReadArray(0x0001, (BYTE*)&AppConfig, sizeof(AppConfig)); else SaveAppConfig(); } #elif defined(SPIFLASH_CS_TRIS) { BYTE c; SPIFlashReadArray(0x0000, &c, 1); if(c == 0x60u) SPIFlashReadArray(0x0001, (BYTE*)&AppConfig, sizeof(AppConfig)); else SaveAppConfig(); } #endif } #if defined(EEPROM_CS_TRIS) || defined(SPIFLASH_CS_TRIS) void SaveAppConfig(void) { // Ensure adequate space has been reserved in non-volatile storage to // store the entire AppConfig structure. If you get stuck in this while(1) // trap, it means you have a design time misconfiguration in TCPIPConfig.h. // You must increase MPFS_RESERVE_BLOCK to allocate more space. #if defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2) if(sizeof(AppConfig) > MPFS_RESERVE_BLOCK) while(1); #endif #if defined(EEPROM_CS_TRIS) XEEBeginWrite(0x0000); XEEWrite(0x60); XEEWriteArray((BYTE*)&AppConfig, sizeof(AppConfig)); #else SPIFlashBeginWrite(0x0000); SPIFlashWrite(0x60); SPIFlashWriteArray((BYTE*)&AppConfig, sizeof(AppConfig)); #endif } #endif KẾT LUẬN VÀ PHƯƠNG HƯỚNG PHÁT TRIỂN Kết quả nghiên cứu của đề tài có thể áp dụng trong việc giám sát, cảnh báo và điều khiển các thiết bị từ xa tại: Các xưởng sản xuất, gara tự động, các trạm xăng dầu, nhà thông minh, cảnh báo trộm, cảnh báo cháy, các nút giao thông, đèn đường, nhà trẻ online, gian hàng tự động giám sát, nhà máy sản xuất, kho chứa vũ khí, trang thiết bị trong quân đội… Như vậy đề tài đã giúp ích rất lớn trong cuộc sống hàng ngày giúp các tòa nhà trở nên thông minh, tiết kiệm năng lượng, dễ dàng quản lí các thiết bị trong gia đình khi đi xa. Trên cơ sở của đề tài, chúng ta có thế phát triển, nâng cấp thành điều khiển giám sát nhiều thiết bị từ xa qua wifi hoặc tại bất kì nơi đâu có mạng internet ADSL, mạng 3G, thậm trí điều khiển qua điện thoại thông minh. TÀI LIỆU THAM KHẢO [1] Hoàng Minh Sơn, “Mạng truyền thông công nghiệp”, nhà xuất bản khoa học kỹ thuật, 2005. [2] Ngô Diên Tập. Vi Xử Lý Trong Đo Lường Và Điều Khiển. nhà xuất bản khoa học kỹ thuật,10/08/2004 Các tài liệu lấy trên Internet. 1. Nghiên cứu phát triển hệ thống đo và điều khiển nhúng trên cơ sở mạng Ethernet và giao thức TCP/IP. (Phan Minh Tân, Vũ Sỹ Thắng, Phạm Ngọc Minh, Phạm Thượng Cát) . 2. Embedded C programming and The Microchip PIC (Richard Barnett, Larry O’cull, Sarah Cox). 3. The Microchip TCP/IP Stack (Nilesh Rajbharti - Microchip Technology Inc.) 4. PIC18F97J60 Family Data Sheet Một số trang web: 1. 2. 3. 4.

Các file đính kèm theo tài liệu này:

  • docxdo_an_tot_nghiep_6104.docx