Giao tiếp PC và vi xử lý trong hệ thống SCADA

MỤC LỤC: NỘI DUNG trang Giới thiệu chung 01 CHƯƠNG 1: GIAO THỨC TRUYỀN THÔNG 03 I. Giới thiệu 03 II. Protocol 05 1. Khái niệm 05 2. Xây dựng Protocol 06 a) Cấu trúc frame dữ liệu 06 b) Xây dựng Protocol 08 III. Truyền thông nối tiếp 09 1 Thanh ghi diều khiển đường truyền 10 2 Thanh ghi điều khiển MODEM 11 3 Thanh ghi trạng thái đường dây 12 4 Chuẩn giao tiếp RS-232 13 5 Giới thiệu IC Max_232 15 CHƯƠNG 2: CƠ LƯỢC AT89C51 17 I. Khái quát về họ IC MCS-51 17 II. Giới thiệu AT89C52 18 1. Những đặc trưng cơ bản 20 2. Cấu hình chân 20 III. Tổ chức bộ nhớ 25 1. RAM đa dụng 25 2. RAM địa chỉ hoá từng bit 27 3. Các bank thanh ghi 27 IV. Các thanh ghi chức năng đặc biệt 29 1 Từ trạng thái chương trình 30 2 Thanh ghi B 32 3 Con trỏ ngăn xếp 32 4 Con trỏ dữ liệu 33 5 Các thanh ghi port xuất nhập 33 6 Các thanh ghi timer 34 7 Các thanh ghi port nối tiếp 35 8 Các thanh ghi ngắt 36 9 Thanh ghi điều khiển công suất 36 V. Bảo vệ bộ nhớ 36 VI. Hoạt động của port nối tiếp 37 1 Giới thiệu 37 2 Thanh ghi điều khiển port nối tiếp 38 3 Các chế độ hoạt động 40 4 Khởi động và truy xuất các thanh ghi cổng nối tiếp 44 5 Tốc độ baud port nối tiếp 47 CHƯƠNG 3: RTX51 TINY 50 Giới thiệu chung 50 1. Giới thiệu phần mềm KEIl 50 2. Chương trình tuần hoàn thời gian biểu của RTX51 51 3. Các yêu cầu và định nghĩa 55 4. Các hàm thư viện của RTX51 56 CHƯƠNG 4: BOARD DEMO-KIT 59 I. Khối hiển thị 60 II. Khối giao tiếp A/D - D/A 62 III. Khối RS-232 68 IV. Khối output (rơle) 70 V. Khối input 71 CHƯƠNG 5: Phần 1: TẬP LỆNH 72 I. Giới thiệu tập lệnh 72 II. Nội dung tập lệnh 73 Phần 2: MÔ TẢ CHƯƠNG TRÌNH 76 Chương trình nhận chuỗi 78 Chương trình kiểmtra 80 Chương trình xử lý tập lệnh 81 Chương trình đóng gói dữ liệu 83 Chương trình Demo-Kit 85 Phần 3: Chương trình 88 Báo cáo kết quả 146 Giới thiệu chung : Như chúng ta đã biết trong điều kiện khoa học kỹ thuật và kinh tế phát triển như hiện nay thì qui trình tự động hóa trong công nghiệp và sản xuất hầu như không thể thiếu được . Nó đóng một vai tró hết sức quan trọng trong việc giúp tăng năng suất , tăng độ chính xác và do đó tăng hiệu quả sản xuất . Trong đó một vai trò không thể không nhắc đến của qui trình tự động hóa là thu thập dữ liệu và điều khiển từ xa . Để kiểm tra tình hình sản xuất cũng như trạng thái hoạt động của từng phân xưởng ta không thể cứ cho người đến tận nơi , kiểm soát từng hoạt động và quay về báo cáo nếu có sự cố xảy ra mà nhất thiết phải có một hệ thống thu thập dữ liệu từ xa . Khi đó, người kỹ sư vận hành chỉ cần ngồi tại bàn điều khiển và quan sát những trạng thái được cập nhật về liên tục để có thể xử lý kịp thời những tình huống xảy ra thông qua quá trình liên kết dữ liệu, mà không phải mất thời gian đi đến nơi có xảy ra sự cố . Không dừng ở đó , việc thu thập dữ liệu và điều khiển từ xa còn là một nhân tố quản lý, một yếu tố tất yếu cho sự phát triển của tất cả các ngành nghề , các lĩnh vực khác như giao thông vận tải ( theo dõi các trạm giao thông đường bộ, hàng hải , hàng không ) , điện lực , y tế . Biết được ý nghĩa và tầm quan trọng của nó nên chúng em quyết định nghiên cứu và hy vọng có cơ hội mở rộng đề tài này . Tổng quan về công việc thực hiện như sau : - Xây dựng một tập lệnh trong giao tiếp giữa Máy tính và micro-controller. - Xây dựng một giao thức truyền nhận thông tin (Protocol). - Sử dụng tập lệnh theo yêu cầu mong muốn . - Xây dựng một chương trình demo như một ứng dụng cụ thể của đề tài . Chương 1: GIAO THỨC TRUYỀN THÔNG I. GIỚI THIỆU: Sơ đồ các lớp cơ bản xây dựng cho quá trình liên kết dữ liệu giữa 2 đối tượng sử dụng: Mục đích chính của luận văn này không nhằm thực hiện một ứng dụng điều khiển cụ thể mà tạo nên một ứng dụng mới trong giao tiếp dữ liệu giữa hai đối tượng là máy tính và khối vi xử lý. Vì thế, chương trình người sử dụng, liên kết giữa hai đối tượng sử dụng- user 1và user2 ( tức chương trình Demo-Kit thực hiện trong phần cuối chương trình ) không phải là trọng tâm mà chỉ là một ứng dụng cụ thể của đề tài. Vì thế, nó chỉ xây dựng các dạng sóng vào ra một cách đơn giản, mang ý nghĩa mô phỏng cho những gì thực hiện được trong việc xây dựng chương trình. Kết quả mong muốn của luận văn là xây dựng được một môi trường thuận lợi cho quá trình trao đổi thông tin giữa hai đối tượng sử dụng. Hay nói khác hơn, đây là một tầng đệm về ngôn ngữ giao tiếp, một quá trình trung gian giúp cho việc liên kết dữ liệu được diễn ra một cách trôi chảy theo mong muốn của người sử dụng. Các lớp cơ bản được xây dựng trong hệ thống này là: lớp vật lý, lớp liên kết dữ liệu (datalink ), lớp quản lý truyền tin và sau cùng là lớp dữ liệu. - Lớp vật lý: là các yếu tố đặc trưng bởi mức điện áp hay dòng điện cho các ngõ vào ra. Tiêu biểu cho lớp này là các phương tiện như thiết bị điện (dây dẫn, chân IC ) hay các chuẩn giao tiếp giúp cho lớp liên kết dữ liệu được thực hiện. Một trong các thủ tục protocol trong liên kết dữ liệu đơn giản nhất cho lớp này là sử dụng chuẩn giao tiếp RS-232 trong truyền thông nối tiếp. - Lớp liên kết dữ liệu: lớp này quan tâm đến các dạng truyền dữ liệu (đồng bộ hay bất đồng bộ), tốc độ sử dụng, kiểm tra và sửa lỗi, chế độ phát lại (echo) đây là phần trọng tâm của một chương trình liên kết dữ liệu, xây dựng Protocol cho phần này là thiết lập các thủ tục liên kết và truy xuất dữ liệu. - Lớp quản lý truyền tin: lớp này có nhiệm vụ quản lý dữ liệu (ghi nhận và truy xuất dữ liệu từ các vùng địa chỉ của các tín hiệu vào ra theo định nghĩa của tập lệnh), phần giới thiệu tập lệnh được thực hiện trong chương 5. - Lớp dữ liệu: lớp này đảm nhận vai trò ghi nhận các giá trị dữ liệu tại đầu mỗi user, bao gồm các dạng tín hiệu điều khiển như dạng xung, dạng mức và tín hiệu dạng A/D. Vấn đề cần quan tâm chính của chúng ta là xây dựng một chuẩn cho tầng liên kết dữ liệu (các thủ tục protocol).

doc80 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3097 | Lượt tải: 4download
Bạn đang xem trước 20 trang tài liệu Giao tiếp PC và vi xử lý trong hệ thống SCADA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hi có ngắt hoặc reset hệ thống. Bit Ký hiệu Ý nghĩa 7 SMOD Bit gấp đôi tốc đọ baud, nếu được set thì tốc độ baud sẽ tăng gấp đôi trong các mode 1,2 và 3 của port nối tiếp. 6 – Không định nghĩa. 5 – Không định nghĩa. BẢO VỆ BỘ NHỚ : Các bit khoá bộ nhớ chương trình. Vi điều khiển AT89C52 có 3 bit khoá có thể bỏ không lập trình (U) hoặc được lập trình (P) để nhận các đặc trưng thêm vào được liệt kê trong bảng dưới đây (với LB1, LB2, LB3 là các bit khóa tương ứng). Chế độ LB1 LB2 LB3 Kiểu bảo vệ 1 U U U Không khoá chương trình 2 P U U Các lệnh MOVC được thi hành từ bộ nhớ chương trình ngoài bị cấm khi lấy các byte mã từ bộ nhớ nội, /EA được lấy mẫu và được chốt lại khi reset và hơn nữa, việc lập trình bộ nhớ Flash là bị cấm. 3 P P U Như chế độ 2 nhưng việc kiểm tra cũng bị cấm 4 P P P Như chế độ 3 nhưng việc thi hành ngoài cũng bị cấm. Khi bit khoá 1 được lập trình, mức logic tại chân được lấy mẫu và chốt lại khi reset. Nếu thiết bị được bật nguồn mà không có reset, việc chốt sẽ được khởi tạo với một giá trị ngẫu nhiên cho đến khi được reset. Giá trị được chốt của phải bằng với mức logic hiện tại ở chân đó để cho thiết bị làm việc một cách chính xác. HOẠT ĐỘNG CỦA PORT NỐI TIẾP: Giới thiệu: 8051/8031 có một port nối tiếp trong chip có thể hoạt động ở nhiều chế độ trên một dãi tần số rộng. Chức năng chủ yếu của port nối tiếp là thực hiện chuyển đổi song song sang nối tiếp đối với dữ liệu xuất, và chuyển đổi nối tiếp sang song song với dữ liệu nhập. Truy xuất phần cứng đến port nối tiếp qua các chân TXD và RXD. Các chân này có các chức năng khác với hai bit của Port 3, P3.1 ở chân 11 (TXD) và P3.0 ở chân 10 (RXD). Port nối tiếp cho hoạt động song công (full duplex : thu và phát đồng thời), và đệm lúc thu (receiver buffering) cho phép một ký tự sẽ được thu và được giữ trong khi ký tự thứ hai được nhận. Nếu CPU đọc ký tự thứ nhất trước khi ký tự thứ hai được thu được thu đầy đủ thì dữ liệu sẽ không bị mất. Hai thanh ghi chức năng đặc biệt cho phép phần mềm truy xuất đến port nối tiếp là : SBUF và SCON. Bộ đệm port nối tiếp (SBUF) ở địa chỉ 99H thật sự là hai bộ đệm. Viết vào SBUF để nạp dữ liệu sẽ được phát, và đọc SBUF để truy xuất dữ liệu thu được. Đây là hai thanh ghi riêng biệt : thanh ghi chỉ ghi để phát và thanh ghi chỉ đọc để thu. CLK SBUF Q (chỉ ghi) TXD (P3.1) Thanh ghi dịch D CLK Xung nhịp tốc độ baud (phát) Xung nhịp tốc độ baud (thu) RXD (P3.0) SBUF (chỉ đọc) Bus nội 8051/8031 Thanh ghi điều khiển port nối tiếp (SCON) ở địa chỉ 98H là thanh ghi có địa chỉ bit chứa các bit trạng thái và các bit điều khiển. Các bit điều khiển đặt chế độ hoạt động cho port nối tiếp, và các bit trạng thái báo kết thúc việc phát hoặc thu ký tự. Các bit trạng thái có thể được kiểm tra bằng phần mềm hoặc có thể được lập trình để tạo ngắt. Tần số làm việc của port nối tiếp, còn gọi là tốc độ baud có thể cố định (lấy từ bộ dao động trên chip). Nếu sử dụng tốc độ baud thay đổi, Timer 1 sẽ cung cấp xung nhịp tốc độ baud và phải được lập trình. Thanh ghi điều khiển port nối tiếp: Chế độ hoạt động của port nối tiếp được đặt bằng cách ghi vào thanh ghi chế độ port nối tiếp (SCON) ở địa chỉ 98H. Sau đây là các bảng tóm tắt thanh ghi SCON và các chế độ của port nối tiếp : Bit Ký hiệu Địa chỉ Mô tả SCON.7 SM0 9FH Bit 0 của chế độ port nối tiếp. SCON.6 SM1 9EH Bit 1 của chế độ port nối tiếp. SCON.5 SM2 9DH Bit 2 của chế độ port nối tiếp. Cho phép truyền thông đa xử lý trong các chế đọ 2 và 3; RI sẽ không bị tác động nếu bit thứ 9 thu được là 0. SCON.4 REN 9CH Cho phép bộ thu phải được đặt lên 1 để thu (nhận) các ký tự. SCON.3 TB8 9BH Bit 8 phát, bit thứ 9 được phát trong các chế độ 2 và 3; được đặt và xóa bằng phần mềm. SCON.2 RB8 9AH Bit 8 thu, bit thứ 9 thu được. SCON.1 TI 99H Cờ ngắt phát. Đặt lên 1 khi kết thúc phát ký tự; được xóa bằng phần mềm. SCON.0 RI 98H Cờ ngắt thu. Đặt lên 1 khi kết thúc thu ký tự; được xóa bằng phần mềm. Tóm tắt thanh ghi chế độ port nối tiếp SCON. 0 0 0 Thanh ghi dịch Cố định (FOSC /12). 0 1 1 UART 8 bit Thay đổi (đặt bằng timer). 1 0 2 UART 9 bit Cố định (FOSC chia cho 12 hoặc 64). 1 1 3 UART 9 bit Thay đổi (đặt bằng timer). SM0 SM1 Chế độ Mô tả Tốc độ baud Các chế độ port nối tiếp. Trước khi sử dụng port nối tiếp, phải khởi động SCON cho đúng chế độ. Ví dụ, lệnh MOV SCON, #01010010B khởi động port nối tiếp cho chế độ 1 (SM0/SM1 = 0/1), cho phép bộ thu (REN = 1) và đặt cờ ngắt phát (T1 = 1) để chỉ bộ phát sẵn sàng hoạt động. Các chế độ hoạt động: Port nối tiếp có 4 chế độ hoat động, có thể chọn được bằng cách viết các số 1 hay 0 vào các bit SM0 và SM1 trong SCON. Có ba chế độ cho phép truyền thông bất đồng bộ, với mỗi ký tự được thu (nhận) hoặc phát đều được đóng khung bằng một bit start và 1 bit stop. Ở chế độ thứ tư, port nối tiếp hoạt động như một thanh ghi dịch đơn giản. Thanh ghi dịch 8 bit (chế độ 0): Chế độ 0 được chọn bằng cách ghi các bit 0 vào SM1 và SM0 của SCON, đưa port nối tiếp vào chế độ thanh ghi dịch 8 bit. Dữ liệu nối tiếp vào và ra qua RXD và TXD xuất xung nhịp dịch. 8 bit được phát hoặc thu với bit đầu tiên là LSB. Tốc độ baud cố định ở 1/12 tần số dao động trên chip. Việc phát đi được khởi động bằng bất cứ lệnh nào ghi dữ liệu vào SBUF. Dữ liệu được dịch ra ngoài trên đường RXD (P3.0) với các xung nhịp được gửi ra đường TXD (P3.1). Mỗi bit phát đi hợp lệ (trên RXD) trong một chu kỳ máy. Trong mỗi chu kỳ máy, tín hiệu xung nhập xuống thấp ở S3P1 và trở về mức cao ở S6P1. S1 P1 P2 S2 P1 P2 S3 P1 P2 S4 P1 P2 S5 P1 P2 S6 P1 P2 Một chu kỳ máy OSC ALE Bit dữ liệu hợp lệ Dữ liệu xuất Clock dịch Clock dịch (TXD) D0 D1 D2 D3 D4 D5 D6 D7 Dữ liệu xuất ALE Phóng to Giản đồ thời gian port nối tiếp phát ở chế độ 0. Việc thu được khởi động khi bit cho phép bộ thu (REN) là 1 và bit ngắt thu (RI) là 0. Qui tắc tổng quát là đặt REN khi bắt đầu chương trình để khởi động port nối tiếp, rồi xóa RI để bắt đầu hoạt động nhập dữ liệu. Khi RI bị xóa, các xung nhịp được đưa ra đường TXD, bắt đầu chu kỳ máy kế tiếp, và dữ liệu theo xung nhịp ở đường RXD. Lấy xung nhịp cho dữ liệu vào port nối tiếp xảy ra ở cạnh dương của TXD. Clock dịch (TXD) ALE Một chu kỳ máy D0 D0 D0 D0 D0 D0 D0 D0 Dữ liệu nhập (RXD) Giản đồ thời gian port nối tiếp thu ở chế độ 0. Một ứng dụng của chế độ thanh ghi dịch là mở rộng khả năng xuất của 8051/8031. IC thanh ghi dịch nối tiếp ra song song có thể được nối vào các đường TXD và RXD của 8051/8031 để cung cấp thêm 8 đường ra. Có thể nối xâu chuỗi thêm các thanh ghi dịch để mở rộng thêm. Clock Thanh ghi Dữ liệu dịch TXD (P3.1) RXD (P3.0) 8051 Thêm 8 ngõ ra Chế độ thanh ghi dịch của port nối tiếp. UART 8 bit với tốc độ baud thay đổi được (chế độ 1). Ở chế độ 1, port nối tiếp của 8051/8031 làm việc như một UART 8 bit với tốc độ baud thay đổi được. Một UART (Universal Asynchronous Receiver/Transmitter : Bộ thu/phát bất đồng bộ vạn năng) là một dụng cụ thu và phát dữ liệu nối tiếp với mỗi ký tự dữ liệu đi trước là bit start ở mức thấp và theo sau là bit stop ở mức cao. Đôi khi xen thêm bit kiểm tra chẵn lẻ giữa bit dữ liệu cuối cùng và bit stop. Hoạt động chủ yếu của UART là chuyển đổi song song sang nối tiếp với dữ liệu xuất và chuyển đổi nối tiếp sang song song với dữ liệu nhập. Ở chế độ 1, 10 bit được phát trên TXD hoặc thu trên RXD. Những bit đó là : 1 bit start (luôn luôn là 0), 8 bit dữ liệu (LSB đầu tiên) và 1 bit stop (luôn luôn là 1) . Với hoạt động thu, bit stop được đưa vào RB8 trong SCON. Trong 8051/8031 chế dộ baud được đặt bằng tốc độ báo tràn của Timer 1. Tạo xung nhịp và đồng bộ hóa các thanh ghi dịch của port nối tiếp trong các chế độ 1, 2 và 3 được thiết lập bằng bộ đếm 4 bit chia cho 16, ngõ ra là xung nhịp tốc độ baud. Ngõ vào của bộ đếm này được chọn qua phần mềm Xung nhịp tốc độ baud Thanh ghi dịch port nối tiếp ¸ 16 16 ´ tốc độ baud Tạo xung nhịp port nối tiếp. Truyền dữ liệu (phát) được khởi động bằng cách ghi vào SBUF, nhưng vẫn chưa thật sự bắt đầu chạy cho đến khi sự thay thế kế tiếp của bộ đếm chia cho 16 cung cấp tốc độ baud cổng nối tiếp. Dữ liệu được dịch ra ngoài trên đường TXD bắt đầu bằng bit start, theo sau là 8 bit dữ liệu và sau cùng là bit stop. Độ rộng (theo thời gian của mỗi bit) là nghịch đảo của tốc độ baud được lập trình trong timer. Cờ ngắt phát (TI) được đặt lên 1 khi xuất hiện bit stop trên TXD. bit start bit stop D0 D1 D2 D3 D4 D5 D6 D7 TXD 1 tốc độ baud TI (SCON.1) Ngắt phát (chuẩn bị cho dữ liệu) Đặt cờ TI port nối tiếp. Việc thu dữ liệu được khởi động bằng một chuyển trạng thái từ 1 xuống 0 trên RXD. Bộ đếm 16 tức thời được xóa để đồng bộ số đếm với luồng bit đến. Luồng bit đến được lấy mẫu giữa 16 lần đếm. Bộ thu sẽ phát hiện được bit start sai bằng cách yêu cầu trạng thái 0 ở (bit start) ở lần đếm thứ 8 sau khi có chuyển trạng thái từ 1 xuống 0 đầu tiên. Nếu điều này không xảy ra, người ta giả sử là bộ thu được kích bởi nhiễu chứ không phải do một ký tự hợp lệ. Bộ thu được reset và quay về trạng thái nghỉ (idle), tìm kiếm (đợi) chuyển trạng thái từ 1 xuống 0 kế. Giả sử đã phát hiện được bit start hợp lệ, thì tiếp tục thu ký tự. Bit start được bỏ qua và 8 bit dữ liệu được đưa vào thanh ghi dịch cổng nối tiếp theo xung nhịp. Khi đã có được tất cả 8 bit, điều sau đây xảy ra : 1. Bit thứ 9 (bit stop) được chốt vào RB8 trong SCON. 2. SBUF được nạp với 8 bit dữ liệu. 3. Cờ ngắt bộ thu (RI) được đặt lên 1. Tuy nhiên, những điều này chỉ xảy ra nếu đã có những điều kiện sau : 1. RI = 0 2. SM2 = 1 và bit stop thu được là 1, hoặc SM2 = 0. Đòi hỏi RI = 0 để bảo đảm là phần mềm đã đọc ký tự trước (và RI được xóa). Điều kiện thứ hai hơi phức tạp nhưng chỉ áp dụng trong chế độ truyền thông đa xử lý. Điều đó hàm ý là “không đặt RI lên 1 trong chế độ truyền thông đa xử lý khi bit dữ liệu thứ 9 là 0). UART 9 bit với tốc độ baud cố định (chế độ 2): Khi SM1 = 1 và SM0 = 0, cổng nối tiếp làm việc ở chế độ 2, như một UART 9 bit có tốc độ baud cố định. 11 bit sẽ được phát hoặc thu : 1 bit start, 8 bit dữ liệu, bit dữ liệu thứ 9 có thể lập trình được và 1 bit stop. Khi phát, bit thứ 9 là bất cứ gì đã được đưa vào TB8 trong SCON (có thể là bit parity). Khi thu, bit thứ 9 thu được sẽ ở trong RB8. Tốc độ baud ở chế độ 2 là 1/32 hoặc 1/16 tần số dao động trên chip. UART 9 bit với tốc độ baud thay đổi được. Chế độ này giống như chế độ 2 ngoại trừ tốc độ baud có thể lập trình được và được cung cấp bởi timer. Thật ra, các chế độ 1,2 và 3 rất giống nhau. Các khác biệt là ở tốc độ baud (có định trong chế độ 2, thay đổi trong các chế độ 1 và 3) và ở số bit dữ liệu (8 trong chế độ 1, 9 trong các chế độ 2 và 3). Khởi động và truy xuất các thanh ghi cổng nối tiếp: Cho phép thu: Bit cho phép bộ thu (REN = Receiver Enable) trong SCON phải được đặt lên 1 bằng phần mềm để cho phép thu các ký tự. Thông thường thực hiện việc này ở đầu chương trình khi khởi động cổng nối tiếp, timer, ... Có thể thực hiện việc này theo hai cách. Lệnh SETB REN sẽ đặt REN lên 1, hoặc lệnh MOV SCON, #xxx1xxxxB sẽ đặt REN lên 1 và đặt hoặc xóa các bit khác trong SCON khi cần (Các x phải là 0 hoặc 2 để đặt chế độ làm việc). Bit dữ liệu thứ 9: Bit dữ liệu thứ 9 cần phát trong các chế độ 2 và 3 phải được nạp vào trong TB8 bằng phần mềm. Bit dữ liệu dữ liệu thứ 9 thu được đặt ở RB8. Phần mềm có thể cần hoặc không cần bit dữ liệu thứ 9, phụ thuộc vào đặc tính kỹ thuật của thiết bị nối tiếp sử dụng. (Bit dữ liệu thứ 9 cũng đóng một vai trò quan trọng trong truyền thông đa xử lý). Thêm 1 bit parity: Thường sử dụng bit dữ liệu thứ 9 để thêm parity vào ký tự. Như đã xét ở các chương trước, bit P trong từ trạng thái chương trình (PSW) được đặt lên 1 hoặc bị xóa mỗi chu kỳ máy để thiết lập kiểm tra chẵn với 8 bit trong thanh ghi tích lũy. Ví dụ, nếu truyền thông cần 8 bit dữ liệu cộng thêm kiểm tra chẵn, có thể sử dụng các lệnh sau để phát 8 bit trong thanh ghi tích lũy với kiểm tra chẵn thêm vào bit thứ 9 : MOV C, P ; Đặt bit parity chẵn vào TB8 MOV TB8, C ; nó trở thành bit dữ liệu thứ 9 MOV SBUF, A ; Chuyển 8 bit từ ACC vào SBUF. Nếu cần parity lẻ thì sửa các lệnh lại như sau : MOV C, P ; Đặt bit parity chẵn vào cờ C CPL C ; Đổi sang parity lẻ MOV TB8, C MOV SBUF, A Dĩ nhiên, việc sử dụng parity không bị giới hạn ở các chế độ 2 và 3. Ở chế độ 1, 8 bit dữ liệu được truyền đi có thể bao gồm 7 bit dữ liệu cộng thêm bit parity. Để truyền mã ASCII 7 bit với parity chẵn ở bit 8, có thể sử dụng các lệnh sau : CLR ACC.7 ; bảo đảm MSB được xóa PMOV C, P ; parity chẵn ở trong MOV ACC.7, C ; Đặt parity chẵn vào MSB MOV SBUF, A ; Gởi ký tự đi 7 bit dữ liệu cộng prity chẵn. Các cờ ngắt: Hai cờ ngắt thu và phát (RI và TI) trong SCON đóng một vai trò quan trọng trong truyền thông nối tiếp dùng 8051/8031. Cả hai bit được đặt lên 1 bằng phần cứng, nhưng phải được xóa bằng phần mềm. Ví dụ, thường RI được đặt lên 1 khi kết thúc việc thu ký tự và báo “bộ đệm thu tràn”. Điều kiện này có thể được kiểm tra trong phần mềm hoặc có thể được lập trình để gây ra một ngắt. Nếu phần mềm muốn nhập một ký tự từ thiết bị được nối vào cổng nối tiếp (có thể là thiết bị đầu cuối hiển thị video), nó phải đợi cho đến khi RI được đặt lên 1, rồi xóa RI và đọc ký tự từ SBUF. Chương trình như sau : WAIT : JNB RI, WAIT ; Kiểm tra RI cho đến khi nó = 1 CLR RI ; Xóa RI MOV A, SBUF ; Đọc ký tự TI được đặt lên 1 ở cuối lúc phát ký tự và báo “ bộ đệm phát trống”. Nếu phần mềm muốn gửi một ký tự đến một thiết bị được nối vào cổng nối tiếp, trước hết nó phải kiểm tra xem cổng nối tiếp sẵn sàng chưa. Nói cách khác, nếu ký tự trước đã được gởi đi, đợi cho đến khi việc truyền dữ liệu hoàn tất trước khi gửi ký tự kế. Các lệnh sau sẽ truyền ký tự trong thanh ghi tích lũy: WAIT : JNB TI, WAIT ; Kiểm tra TI cho đến khi nó bằng 1 CLR TI ; Xóa TI MOV SBUF, A ; Gởi ký tự đi. Các đoạn chương trình trên là một phần của các hàm nhập và xuất ký tự chuẩn. Tốc độ baud port nối tiếp: Như đã nói, tốc độ baud cố định ở các chế độ 0 và 2. Trong chế độ 0, nó luôn luôn là tần số dao động trên chip được chia cho 12. Thông thường thạch anh ấn định tần số dao động trên chip của 8051/8031, nhưng cũng có thể sử dụng nguồn xung nhịp khác. Giả sử với tần số dao động danh định là 12 MHz, thì tốc độ baud chế độ 0 là 1 MHz. ¸ 12 xung nhịp tốc độ baud dao động trên chip a) chế độ 0 ¸ 64 xung nhịp tốc độ baud dao động trên chip b) chế độ 2 ¸ 32 SMOD = 0 SMOD = 1 ¸ 32 xung nhịp tốc độ baud dao động trên chip c) các chế độ 1 và 3. ¸ 16 SMOD = 0 SMOD = 1 Các nguồn tạo xung nhịp cho port nối tiếp. Mặc nhiên sau khi reset hệ thống, tốc độ baud chế độ 2 là tần số bộ dao động chia cho 64. Tốc độ baud cũng bị ảnh hưởng bởi một bit trong thanh ghi điều khiển nguồn cung cấp (PCON). Bit 7 của PCON là bit SMOD. Đặt bit SMOD lên 1 làm gấp đôi tốc độ baud trong các chế độ 1, 2 và 3. Trong chế độ 2, tốc độ baud có thể bị gấp đôi từ giá trị mặc nhiên của 1/64 tần số dao động (SMOD = 0) đến 1/32 tần số dao động (SMOD = 1). Vì PCON không được định địa chỉ theo bit, nên để đặt bit SMOD lên 1 cần phải theo các lệnh sau : MOV A, PCON ; Lấy giá trị hiện thời của PCON SETB ACC.7 ; Đặt bit 7 (SMOD) lên 1 MOV PCON, A ; Ghi giá trị ngược về PCON. Các tốc độ baud trong các chế độ 1 và 3 được xác định bằng tốc độ tràn của Timer 1. Vì timer hoạt động ở tần số tương đối cao, tràn timer được chia thêm cho 32 (16 nếu SMOD = 1) trước khi cung cấp xung nhịp tốc độ baudcho port nối tiếp. * Sử dụng Timer 1 làm xung nhịp tốc độ baud Xét 8051, cách thông dụng để tạo tốc độ baud là khởi động TMOD cho chế độ 8 bit tự động nạp lại (chế độ 2) và đặt giá trị nạp lại đúng vào TH1 để cho tốc độ tràn đúng với tốc độ baud. TMOD được khởi động như sau : MOV TMOD, #0010xxxxB Các x là các bit 1 hoặc 0 cần cho timer. Cũng có thể đạt được các tốc độ baud thấp bằng cách sử dụng timer chế độ 1 với TMOD = 0001xxxxB. Tuy nhiên, tốn thêm phần mềm vì các thanh ghi TH1/TL1 phải được khởi động lại sau mỗi lần tràn. Việc này sẽ được thực hiện trong chương trình phục vụ ngắt. Một chọn lựa khác là cấp xung nhịp cho Timer 1 từ ngoài dùng T1(P3.5). Và luôn luôn tốc độ baud là tốc độ tràn của Timer 1 được chia cho 32 (hoặc cho 16, nếu SMOD = 1). Công thức tổng quát để xác định tốc độ baud trong các chế độ 1 và 3 là : Tốc độ baud = Tốc độ tràn của Timer 1 ¸ 32. Ví dụ, muốn làm việc với tốc độ baud là 1200 baud, thì tốc độ tràn của Timer 1 phải là : 1200 ´ 32 = 38.4 KHz. Nếu dùng thạch anh 12 MHz, Timer 1 được cấp xung nhịp 1 MHz hay 1000 KHz. Vì tốc độ tràn của Timer 1 là 38.4 KHz và timer được cấp xung hịp 1000 KHz, thì cần tràn sau 1000 ¸ 38.4 = 26.04 xung nhịp (làm tròn là 26). Vì timer đếm lên và tràn xảy ra khi có sự thay đổi từ FFH xuống 00H ở số đếm. Như vậy giá trị đúng cần nạp vào TH1 là –26. Cách dễ nhất để đặt giá trị nạp lại vào TH1 là : MOV TH1, # –26 Trình hợp dịch sẽ thực hiện chuyển đổi cần thiết. Trong trường hợp này –26 được chuyển thành 0E6H. Như vậy, lệnh trên hoàn toàn giống với lệnh : MOV TH1, # 0E6H Do việc làm tròn nên có sai số nhỏ trong tốc độ baud. Tổng quát thì cho phép dung sai 5% trong truyền thông bất đồng bộ (start/stop). Có thể có được tốc độ baud chính xác nếu dùng thạch anh 11.059 MHz. Bảng sau đây tóm tắt các giá trị nạp lại cho các tốc độ baud thông dụng nhất, dùng thạch anh 12 MHZ hoặc 11.059 MHz : Tốc độ baud 9600 12.000 MHz 1 –7 (F9H) 8923 7% 2400 12.000 MHz 0 –13 (F3H) 2404 0.16% 1200 12.000 MHz 0 –26 (E6H) 1202 0.16% 19200 11.059 MHz 1 –3 (FDH) 19200 0 9600 11.059 MHz 0 –3 (FDH) 9600 0 2400 11.059 MHz 0 –12 (F4H) 2400 0 1200 11.059 MHz 0 –24 (E8H) 1200 0 Tần số thạch anh SMOD Giá trị nạp lại vào TH1 Tốc độ baud thật Sai số Bảng tóm tắt tốc độ baud. Chương 3: RTX51 TINY GIỚI THIỆU: Để tăng hiệu quả làm việc cũng như yêu cầu nhất thiết của chương trình là phải thực hiện đồng thời nhiều công việc hoặc nhiều tác vụ. Vì thế chương trình này được viết theo hệ điều hành thời gian thực (real_time operating system) cho phép sắp xếp danh mục đồng thời nhiều tác vụ trong hệ thống nguồn sử dụng chương trình RTX-Tiny(RTX51) của phần mềm Keil. Ưu điểm của việc xây dựng chương trình theo kiểu này là hoạt động của các công việc khác nhau trong chương trình có thể hoạt động độc lập, không gây ảnh hưởng với nhau về mặt thời gian xử lý. Nếu vì một lý do không mong muốn nào đó mà một tác vụ trong hệ thống chương trình không thực hiện được hoặc thời gian thực hiện quá lớn, hoặc có một vài vòng lặp vô tận trong chương trình thì hệ thống không bị “treo” mà các tác vụ khác vẫn có thể hoạt động bình thường. Giới thiệu phần mềm Keil: Không như các chương trình viết cho vi xử lý trước đây, chương trình trong luận văn này không dùng ngôn ngữ hợp ngữ (assemler) mà được viết bằng ngôn ngữ lập trình C và liên kết với chương trình C51-compile của phần mềm Keil để dịch sang ngôn ngữ máy. Đây là phần mềm chuyên dùng sử dụng ngôn ngữ lập trình C để lập trình cho các loại vi xử lý được sản xuất bởi nhiều hãng khác nhau trên thế giới, chương trình này chứa tất cả các hàm C mở rộng cần thiết cho vi điều khiển được sử dụng. Tiện ích của cách viết này là ngôn ngữ lập trình C là ngôn ngữ lập trình cấp cao hơn và gần gủi với người sử dụng hơn ngôn ngữ máy tính assembler. Ngoài ra, cấu trúc chương trình viết bằng C cũng gọn hơn và dễ quản lý hơn với các câu lệnh và vòng lặp đơn giản, điều này thật sự có lợi khi ta muốn nâng cấp hay mở rộng chương trình. Song song với những tiện ích trên, chương trình C51 của phần mềm Keil còn hổ trợ cho ta một số hàm cơ bản như các hàm vào/ ra (ví dụ như: hàm xuất nhập ký tự đơn getchar(),putchar(); hàm xuất nhập chuỗi ký tự gets(), puts()), các hàm thời gian thực của chương trình RTX51 Tiny … và một số hàm khác giúp hệ thống hoạt động hoàn hảo hơn. Bên cạnh đó, chương trình biên dịch và chương trình chạy mô phỏng trên máy tính (chương trình Debug) của phần mềm Keil là một thuận lợi rất lớn. Nó giúp cho người lập trình có thể quan sát chương trình một cách chính xác với các bước thực hiện và từng lệnh chạy trong chương trình, có cả mã chương trình viết bằng ngôn ngữ C và chương trình dịch sang mã Assembler tương ứng do chương trình C51-compiler thực hiện. Ngoài ra, với phần mềm này ta còn có thể theo dõi được sự thay đổi giá trị của các biến cần quan sát, các hàm ngắt, các giá trị vào/ra tại các chân Port, các giá trị dữ liệu truyền qua SBUF và cả các giá trị timer v.v.. Giới thiệu chương trình tuần hoàn theo thời gian biểu của TRX51 tiny: RTX51 của phần mềm Keil được viết theo hệ điều hành thời gian thực giúp chương trình có thể thực hiện đa nhiệm (multi-tasking), cho phép một vài tác vụ hoặc vài vòng lặp vô tận được thực hiện gần như song song nhau trong chương trình . Tuy nhiên các tác vụ trong chương trình này không xảy ra đồng thời mà do việc sắp xếp các tác vụ theo các múi thời gian được chia nhỏ, tức tại một thời điểm chỉ một công việc được thực hiện mà thôi. Đồng hồ của CPU có thể được chia thành nhiều múi thời gian và chương trình sẽ tuần tự sắp xếp mỗi múi thời gian cho một tác vụ. Mỗi tác vụ được phép thực hiện trong khoảng thời gian tối đa định trước và sau đó chương trình sẽ chuyển sang một tác vụ khác đã sẵn sàng thực hiện, chương trình cứ thế lặp lại tuần tự. Vì mỗi múi thời gian được chia rất nhỏ, thường chỉ vài mili giây hoặc nhỏ hơn nên chương trình luôn được quét qua liên tục và vì thế các tác vụ dường như xảy ra đồng thời. Nếu tại một thời điểm nào đó mà không có một tác vụ nào thực hiện thì tác vụ được khởi động kế tiếp sẽ ở trạng thái sẵn sàng (ready) hoặc trang thái nghỉ (time-out). RTX51 sử dụng các thủ tục thời gian được ngắt bởi phần cứng của timer 8051. Chu kỳ ngắt được xây dựng và sử dụng theo đồng hồ của RTX51. RTX51 không yêu cầu có một hàm Main trong chương trình. Nó sẽ tự động gọi và thực hiện chương trình bắt đầu từ tác vụ 0. Nếu ta sử dụng hàm Main trong chương trình, ta phải khởi động RTX51 sử dụng hàm os_create_task và hàm os_start_system trong RTX51. Khi rơi vào trạng thái nghỉ (timer out), thay vì tạm dừng thực hiện một tác vụ và đứng chờ một lần quét khác, ta có thể sử dụng hàm os_wait để tín hiệu RTX51có thể bắt đầu chuyển sang thực hiện một tác vụ khác. Hàm này thực hiện việc trì hoãn tác vụ hiện hành và đợi cho đến khi có một sự kiện được định trước xảy đến. Trong khoảng thời gian nghỉ này bất cứ một tác vụ nào khác cũng có thể được thực hiện. Sử dụng thời gian nghỉ (time-out) với RTX51: Một sự kiện đơn giản nhất mà ta có thể đợi với hàm os_wait là khoảng thời gian nghỉ theo nhịp đồng hồ của RTX51. Sự kiện này có thể được sử dụng trong những tác vụ mà có yêu cầu delay. Trong vài trường hợp nó được sử dụng như một switch, mà switch này chỉ cần được kiểm tra sau những khoảng thời gian nhất định. Điều được minh họa trong ví dụ sau: #include int counter0; int counter1; void job0 (void) _task_ 0 { os_create ( 1 ) ; while ( 1 ) { counter0 ++; os_wait (K_TMO, 3,0); } } void job1 (void) _task_ 1 { while (1) { counter1++; os_wait (K_TMO, 5, 0); } } trong ví dụ trên, job0 có thể thực hiện trước job1. Nhưng hiện tại, sau khi tăng counter0, job0 gọi hàm os_wait để tạm dừng 3khoảng chia thời gian. Ngay lúc này, RTX51 chuyển sang tác vụ kế tiếp, cụ thể là job1,sau khi job1 tăng counter1, nó cũng gọi hàm os_wait để tạm dừng 5 khoảng chia thời gian. Lúc này, RTX51 không có tác vụ nào khác để thực hiện, vì thế nó rơi vào trạng thái không làm gì cả và đợi hết 3 khoảng chia thời gian trôi qua trước khi tiếp tục thực hiện job1. Kết quả của ví dụ này là counter0 cứ tăng sau mỗi 3 khoảng thời gian và counter1 cứ tăng sau mỗi 5 khoảng chia thời gian. Sử dụng tín hiệu với RTX51: Ta có thể dùng hàm os-wait để tạm dừng một tác vụ trong khi đợi một tín hiệu từ một tác vụ khác. Điều này có thể sử dụng cho hai hay nhiều tác vụ ngang bằng nhau. Đợi một tín hiệu làm việc có nghĩa là: Nếu một tác vụ đang đợi một tín hiệu ,và cờ tín hiệu là 0, tác vụ này sẽ được trì hoãn cho đến khi có tín hiệu gởi đến. Nếu cờ tín hiệu đã lên 1 khi 1 tác vụ hỏi, cờ này sẽ được xoá, và tác vụ đó lại tiếp tục thực hiện. Điều này được minh hoạ trong ví dụ sau: #include int counter0; int counter1; void job0 (void) _task_ 0 { os_create ( 1 ) ; while ( 1 ) { if ( ++counter0 == 0 ) os_send_signal ( 1 ) ; } } void job1 (void) _task_ 1 { while (1) { os_wait (K_SIG, 0, 0); counter1++; } } Trong ví dụ trên, job1 sẽ đợi cho đến khi nó nhận được tín hiệu từ một hoặc vài tác vụ khác gởi đến. Khi nhận được tín hiệu, nó sẽ tăng counter1 và lại đợi một tín hiệu khác. job0 liên tục tăng counter0 nó tràn đến 0. Khi điều đó xảy ra, job 0 gởi một tín hiệu đến job1 và chương trình RTX51 đánh dấu job1 là sẵn sàng thực hiện. Tuy nhiên, job1 sẽ không được thực hiện trong suốt thời gian RTX51 nhận nó cho đến khi chuyển sang một múi thời gian kế tiếp. Sự ưu tiên và quyền ưu tiên: Một bất lợi của chương trình ví dụ trên là job1 không được bắt đầu ngay khi nhận được tín hiệu từ job0 . Trong một số trường hợp điều này không được chấp nhận vì lí do thời gian . RTX51 cho phép ta xác định mức ưu tiên cho từng tác vụ . Một tác vụ với mức ưu tiên cao hơn sẽ được ngắt hoặc được quyền ưu tiên hơn đối với một tác vụ có mức ưu tiên thấp hơn bất cứ khi nào nó cần được thực hiện. Trong ví dụ trên, ta có thể thay đổi cách khai báo cho job1 nhận mức ưu tiên cao hơn job0. Theo mặc định, tất cả các tác vụ được định mức ưu tiên là 0, là mức ưu tiên thấp nhất. Các mức ưu tiên cho phép là từ 0 đến 3. Trong ví dụ trên ta, có thể định nghĩa job1 với mức ưu tiên cấp 1 như sau: Void job1 (void) _ task_ 1 _priority_ 1 {While (1) { Os_wait (K_SIG, 0, 0 ); Counter1++; } } Với cách khai báo này, bất cứ khi nào job0 gởi tín hiệu đến job1, job1 sẽ bắt đầu thực hiện ngay. Một số yêu cầu và định nghĩa đối với chương trình RTX51 Tiny: Điều khiển ngắt: RTX51 Tiny có thể hoạt động song song với các hàm ngắt. Tương tự như các ứng dụng khác của 8051, nguồn ngắt phải được cho phép bởi các thanh ghi phần cứng của 8051 để tạo ra một ngắt. RTX51 Tiny không chứa bất cứ một sự điều khiển nào cho các ngắt; vì lý do đó, một cho phép ngắt cụ thể là đủ để xử lý ngắt.RTX51 Tiny sử dụng timer 0 và ngắt timer0 của 8051 cho hệ thời gian thực. Ngoại trừ các cấu trúc khác của 8051, để tránh sự trùng lặp trong xử lý ngắt timer0 không nên được sử dụng trong chương trình. Registerbanks: RTX51 tiny qui tất cả các tác vụ vào registerbank 0. Vì lý do đó, tất cả các hàm tác vụ phải được chuyển từ ngôn ngữ cấp cao sang ngôn ngữ cấp thấp theo định nghĩa của chương trình C51. Các hàm ngắt có thể sử dụng các registerbank còn lại. Tuy nhiên, RTX51 yêu cầu 6 byte cố định trong không gian registerbank. Các registerbank được sử dụng bởi RTX51 Tiny có thể được định nghĩa theo biến cấu hình INT_REGBANK trong thư viện hàm của chương trình C51. Định nghĩa tác vụ: Chương trình thời gian thực hay đa nhiệm (multitasking) được biên soạn với một hoặc vài tác vụ thực hiện riêng biệt. RTX51 cho phép thực hiện lên đến 16 tác vụ. Các tác vụ là những hàm đơn của chương trình C có giá trị trả về dạng void và danh sách các đối số dạng void được khai báo thuộc tính hàm như sau: void func (void) _task_ num {…} với num là số ID của tác vụ được đánh số liên tục từ 0 đến 15. Các hàm thư viện của RTX51-tiny : Hàm Mô tả Os-create-task Ghi một tác vụ vào danh sách thực hiện Os-delete_task Xóa một tác vụ khỏi danh sách thực hiện Os_send_signal Gởi tín hiệu đến một tác vụ khác từ một ngắt Os- clear_signal Xóa tín hiệu đã đuợc gởi Os_running_task_id Trở về tác vụ thứ ID từ tác vụ hiện hành Os-wait Tạm dừng tác vụ hiện hành và đợi một hoặc vài sự kiện như: 1 khoảng thời gian qui định, khoảng thời gian nghỉ hoặc tín hiệu từ một tác vụ khác hay một ngắt. Os-wait1 Tạm dừng tác vụ hiện hành và đợi một sự kiện là tín hiệu từ một tác vụ khác. Os-wait2 Tạm dừng tác vụ hiện hành và đợi một hoặc vài sự kiện như : 1khoảng thời gian qui định, khoảng thời gian nghỉ hoặc tín hiệu từ một tác vụ khác hay một ngắt. Các thông số hàm: Hàm os_create_task: #include char os_create_task (unsigned char task_id) /*tác vụ thứ id*/ Hàm Os-delete_task: #include char os_delete_task (insigned char task_id) Hàm Os_send_signal #include char os_send_signal (insigned char task_id) Hàm Os- clear_signal: #include char os_clear_signal (insigned char task_id) Hàm Os_running_task_id: #include char os_running_task_id (void) Hàm Os-wait: #include char os_wait (unsigned char event_sel, /*event: sự kiện chờ*/ unsigned char ticks, /*khoảng thời gian chờ*/ unsigned int dummy); /*unused argument*/ các hằng số sự kiên là: K_IVL đợi một khoảng thời gian qui định K_SIG đợi một tín hiệu K_TMO đợi một khoảng thời gian nghỉ Os-wait1: #include char os_wait1 (unsigned char event_sel); /*event: sự kiện chờ*/ Hằng số sự kiện chỉ là K_SIG (đợi một tín hiệu) Os-wait2: char os_wait (unsigned char event_sel, /*event: sự kiện chờ*/ unsigned char ticks); /*khoảng thời gian chờ*/ các hằng số sự kiên là: K_IVL đợi một khoảng thời gian qui định K_SIG đợi một tín hiệu K_TMO đợi một khoảng thời gian nghỉ Chương 4: BOARD DEMO_KIT Demo_kit là một ứng dụng nhỏ của chương trình nhằm mô tả một số hoạt động của các lệnh trong tập lệnh và các thủ tục Protocol được xây dựng trong chương trình. Board mạch thực hiện cho chương trình Demo_kit gồm các khối sau: Sơ đồ khối board Demo-Kit KHỐI XỬ LÝ TRUNG TÂM (mP) KHỐI RS-232 KHỐI INPUT KHỐI A/D KHỐI D/A KHỐI HIỂN THỊ KHỐI OUTPUT KHỐI HIỂN THỊ: Khối hiển thị bao gồm 9 led 7đoạn ( loại catod chung ) xếp thành 3 dãy (một dãy 3 con) để hiển thị các thông số cần quan sát. IC chốt 74573 xuất các giá trị cần hiển thị cho cả 9 led. IC này giao tiếp với vi xử lý qua port 0, nhóm điện trở RN1 cần thiết vì port 0 có ngõ ra cực thu hở. IC 4094 được sử dụng với mục đích chọn led hiển thị. Đây là IC với chức năng là thanh ghi dịch 8 bit (chuyển đổi dữ liệu từ nối tiếp sang song song). Lý do chính cho việc sử dụng IC 4094 trong trường hợp này là tiết kiệm các chân giao tiếp với vi xử lý. Để xác lập mức tích cực cho led cần hiển thị ta lần lượt dịch vào các bit 0 hay 1, trong trường hợp sử dụng led là catod chung (như trên hình vẽ ) để chọn led sáng ta dịch vào bit 0 (tích cực mức thấp ). Bảng sự thật của thanh ghi dịch 8 bit 4094: Inputs Parallel out Serial out CLK OE STR D Q1 … Q8 QS /QS ­ 0 X X HiZ … HiZ Q7n nc ¯ 0 X X HiZ … HiZ nc Q8n ­ 1 0 X nc … nc Q7n nc ­ 1 1 0 0 … Q7n Q7n nc ­ 1 1 1 1 … Q7n Q7n nc ¯ 1 1 1 nc … nc nc Q8n Q7n: trạng thái của Q7  trước khi có xung clock nc: no connect IC ULN2803 dùng để đệm dòng. KHỐI GIAO TIẾP A/D VÀ D/A: KHỐI A/D: Khối giao tiếp A/D có nhiệm vụ đọc về từ ngõ input các giá trị analog đo đạt được từ các đối tượng điều khiển bên ngoài (tín hiệu từ cảm biến, giá trị điện áp...) được chuyển đổi thành số digital để đưa vào các thanh ghi của vi xử lý. Giới thiệu ADC0809 : ADC 0809 là thiết bị chuyển đổi analog sang digital 8 bit, multiplex 8 kênh và tương thích với bộ vi xử lý. ADC0809 sử dụng kỹ thuật chuyển đổi A/D xấp xỉ liên tiếp. Khả năng Giao tiếp dễ dàng với tất cả các bộ vi xử lý . Hoạt động với thang đo tỷ lệ với 5VDC hoặc điện áp chuẩn có thể điều chỉnh . Không cần chỉnh không hay toàn thang . Multiplex 8 kênh với địa chỉ logic . Tầm điện áp vào 0-5V với nguồn cung cấp đơn 5V. Ngõ ra phù hợp vói mức điện áp TTL. Độ phân giải : 8 bit. Sai số không điều chỉnh được tổng cộng : ± 1 LSB Nguồn cung cấp đơn : 5VDC. Công suất thấp : 15mW. Thời gian chuyển đổi : 100ms Đặc tính kỹ thuật: Ký hiệu Thông số Điều kiện Tối thiểu Điển hình Tối đa Đơn vị VREF+ Điện áp cao nhất của thang đo VCC VCC+0.1 V VREF- Điện áp thấp nhất của thang đo -0.1 0 V IIN Dòng vào fCLK=640KHz -2 ±0.5 2 mA VIN(1) Điện áp vào logic 1 VCC -1.5 V VIN(0) Điện áp vào logic 0 1.5 V VOUT(1) Điện áp ra logic 1 IOUT=-360uA VCC -0.4 V VOUT(0) Điện áp ra logic 0 IOUT= 1.6mA 0.45 V fCLK Tần số xung clock 10 640 1280 KHz tEOC Thời gian delay EOC (Xem giản đồ xung) 0 8 +2ms Chu kỳ clock tC Thời gian biến đổi FCLK=640KHz 90 100 116 ms tWS Độ rộng xung Start tối thiểu (Xem giản đồ thời gian) 100 200 Ns tALE Độ rộng xung ALE tối thiểu (Xem giản đồ thời gian) 100 200 ns Mô tả chức năng Mạch chọn kênh(multiplexer) Mỗi kênh ngõ vào riêng biệt được chọn bằng cách giải mã địa chỉ theo bảng sau: Kênh analog được chọn Địa chỉ A2 A1 A0 IN0 0 0 0 IN1 0 0 1 … IN7 1 1 1 Địa chỉ được chốt vào bộ giải mã bên trong tại cạnh lên của xung chốt địa chỉ (ALE). Đặc tính chuyển đổi: Thanh ghi xấp xỉ liên tiếp của bộ biến đổi A/D được reset tại cạnh lên của xung start (bắt đầu chuyển đổi). Sự cguyển đổi được bắt đầu tại cạnh xuống của xung start. Quá trình chuyển đổi sẽ bị ngắt nếu nhận một xung start mới. Sự chuyển đổi liên tiếp có thể được thực hiện bằng cách nối ngõ ra EOC (End Of Convert – Kết thúc chuyển đổi) vào ngõ start. Nếu sử dụng chế độ này, một xung start bên ngoài phải được cung cấp sau khi bật nguồn. Xung EOC sẽ xuống mức thấp sau khi cạnh lên của xung start từ 0 đến 8 xung clock và lên mức cao khi việc chuyển đổi đã xong. Biểu thức chuyển đổi: Data ngõ ra là một số nguyên N nằm trong tầm: VIN - VREF (-) VREF(+) - VREF (-) N= x 256 ± độ chính xác tuyệt đối Mạch tạo dao động cho ADC0809: Biết tần số xung clock của ADC0809 nằm trong khoảng từ 10KHz đến 1280 KHz, nên tần số xung clock trong mạch được lấy từ tần số dao động chuẩn của thạch anh, đưa qua IC đếm 74393 với công dụng là IC chia tần số. Các ngõ ra QA, QB, QC, QD lần lượt chia tần số xung clock vào với 2, 4, 8, 16. Vậy tần số ra 74393 (vào xung clock ADC 0809) là: 691.2KHz 11.0592MHz 16 = KHỐI D/A: Khối D/A giao tiếp với vi xử lý với nhiệm vụ chuyển đổi các giá trị digital trong các thanh ghi của vi xử lý thành các giá trị analog và xuất ra các đối tượng điều khiển bên ngoài. Họ DAC0808 (DAC0808/ DAC0807/ DAC0806) là bộ biến đổi digital sang analog 8 bit, có thời gian xử lý dòng ra toàn thang là 150ns, công thức tiêu thụ chỉ 33mw với nguồn ±5V. Họ DAC0808 giao tiếp trực tiếp với các mức logic thông dụng như TTL, DTL hoặc CMOS. Khả năng Độ chính xác tương đối :±0.19% (8 bit) với DAC0808 Độ chính xác 6-bit và 7-bit với DAC0806 và DAC0807 Thời gian xử lý nhanh : 150 ns Ngõ vào digital không đảo tương thích TTL và CMOS Tốc độ quét cao : 8 mA/ms Tầm điện áp cung cấp : ± 4.5V đến ± 18V Công suất tiêu thụ thấp : 33 mW với nguồn ± 5V Trị số tối đa Nguồn cung cấp : VCC=+ 18 VDC VEE =- 18 VDC Điện áp ngõ vào digital (V5-V12):-10VDC đến +18VDC Điện áp ngõ ra được dùng (V0):-11 VDC đến +18 VDC Dòng chuẩn (I14): 5 mA Điện áp vào chuẩn (V14,V15) : VCC,VEE Hoạt động cơ bản: Dòng điện chuẩn được tạo ra bằng một trong hai cách : chuẩn dương hoặc chuẩn âm. Vref dương Vref âm DAC0808 DAC0808 Hình a: Hình b: Dòng điện vào chuẩn I14, phải luôn luôn chạy vào chân 14, bất chấp cách bố trí hoặc cực tính nguồn áp chuẩn . Cách kết nối với áp dương như trên hình a. Với tín hiệu chuẩn luỡng cực, R15 có thể được nối với nguồn âm . Trị số của tụ bù phải tăng khi R14 tăng để duy trì lề pha thích hợp . Ví dụ với R15 là 1,2.5 và 5K thì trị tối thiểu của tụ là 15,37 và 75pF. Tụ có thể nối đến VEE hoặc đất . Ap chuẩn âm có thể được sử dụng nếu R14 được nối đất và chuẩn được nối đến R15 như hình b . Phương pháp này có thuận lợi chính là tổng trở vào cao (tại chân 15). DAC0808 là bộ biến đổi A/D tạo ra dòng điện có trị số tuỳ theo giá trị digital và dòng điện chuẩn ngõ vào . Dòng điện chuẩn có thể có trị số cố định hoặc thay đổi từ gần 0 đến 4 mA .Dòng ngõ ra toàn thang (IFS – Full scale) là một hàm tuyến tính của dòng chuẩn và cho bởi : IFS= IREF với I14= I14= VREF Dòng điện ra: IOUT= IREF x giá trị digital ngõ vào R15 (thông thường bằng R14) được sử dụng để loại bỏ sai số dòng phân cực. R15 có thể bỏ đi, khi đó chỉ tăng sai số một ít. Khi dùng điện áp chuẩn DC thì nên sử dụng tụ bypasss xuống đất. KHỐI RS-232: Khối này thực hiện việc giao tiếp dữ liệu giữa máy tính PC và vi xử lý sử dụng IC MAX 232 qua cổng nối tiếp của máy tính trên hai đường TXD và RXD. Ta thấy rằng MAX232 cần có 4 tụ ngoài (mắc vào giữa C1+ và C1-, C2+ và C2-, V+ vào nguồn dương, V- vào đất)để biến đổi điện áp từ 0V đến 5V thành điện áp -12V đến +12V phù hợp cho truyền thông theo chuẩn RS-232. Ngoài ra, bên trong MAX 232 có 4 bộ khuếch đại đảo nhằm chuyển từ mức logic TTL ra chuẩn RS-232 và ngược lại. Sơ đồ sau đây cho thấy các khối bên trong MAX232 và các linh kiện mắc bên ngoài theo dạng chuẩn : RS-232 OUTPUT Sơ đồ bên trong IC MAX-232 KHỐI RƠLE: Các ngõ ra output của kit vi xử lý được nối với các Rơle để điều khiển đóng ngắt các thiết bị điện. Trong từng ứng dụng cụ thể các rơle sẽ được kết nối đến các đối tượng cần điều khiển. Cũng như khối hiển thị, để tiết kiệm các chân vi xử lý các tín hiệu điều khiển rơle được lấy từ 1 chân port của vi xử lý và dịch vào các rơle qua thanh ghi dịch 8 bit 4094 (chuyển dữ liệu từ dạng nối tiếp sang song song) dùng IC đệm ULN2803. KHỐI INPUT: Khối input bao gồm 4 nút nhấn và 4 đầu vào tự do (lấy tín hiệu từ bên ngoài vào có cách ly bởi PC817 ). Ngược với khối hiển thị và rơle, các ngõ vào input được nối qua IC 4021 cũng là một loại thanh ghi dịch 8 bit nhưng chuyển dữ liệu vào từ dạng song song sang nối tiếp. Các ngõ vào input được đọc về từng bit theo xung clock của thanh ghi dịch 4021 và được chuyển vào chân P3.2 của vi xử lý. Chương 5: CHƯƠNG TRÌNH PHẦN 1: TẬP LỆNH GIỚI THIỆU TẬP LỆNH : Việc thu thập dữ liệu và điều khiển từ xa là một vấn đề đáng được quan tâm trong lĩnh vực điều khiển tự động. Tuy nhiên, thật phiền hà nếu như không có một sự thống nhất chung về câu lệnh trong quá trình trao đổi thông tin. Vì thế, một phần nội dung chính của đề tài là xây dựng được một tập lệnh trong giao tiếp dữ liệu giữa máy tính với vi xử lý và sử dụng được nó. Việc xây dựng tập lệnh giao tiếp RS-232 này được xem như một mong muốn tạo ra một câu lệnh chung trong giao tiếp dữ liệu giữa máy tính và vi xử lý về mặt ngôn ngữ. Đây là một phương tiện giao tiếp giữa máy tính và vi xử lý, nhằm giúp cho người sử dụng không phải mất nhiều thời gian lập trình lại từ đầu mỗi khi muốn thực hiện vấn đề giao tiếp mà việc trao đổi thông tin vẫn có thể xảy ra dễ dàng thông qua việc sử dụng tập lệnh này. Tập lệnh được xây dựng bao gồm các lệnh xuất nhập đầy đủ các dạng tín hiệu như: tín hiệu dạng mức, tín hiệu dạng xung, tín hiệu dạng analog/digital giúp việc trao đổi thông tin không bị giới hạn và đối tượng điều khiển (từ kit vi xử lý) cũng được phong phú hơn. Ngoài ra, tập lệnh còn có một số lệnh điều khiển và quan sát quá trình hoạt động của hệ thống như: biến cài đặt dạng sóng ngõ ra (Kx), counter (Cx), dữ liệu (Dx), biến trạng thái xác lập chế độ hoạt động từ PC hay từ KIT (Sx) và biến thực thi hiển thị chế độ hoạt động RUN/STOP (Mx) giúp cho quá trình hoạt động của hệ thống diễn ra một cách chặt chẽ, dễ quan sát và dễ quản lý hơn. NỘI DUNG TẬP LỆNH: Các lệnh được xây dựng trong tập lệnh giao tiếp RS-232 này nhìn chung chỉ bao gồm các lệnh giao tiếp dữ liệu là xuất và nhập. Đối với các lệnh gởi dữ liệu về máy tính (PC): nội dung dữ liệu được kit vi xử lý thu thập từ các đối tượng điều khiển bên ngoài ví dụ như giá trị diện áp, xung điều khiển hoặc các giá trị đo được từ cảm biến v.v… và đưa vào các vùng địa chỉ định sẵn tùy thuộc vào dạng của tín hiệu thu vào (dạng mức, xung hay A/D) và gởi đến PC mỗi khi có yêu cầu. Đối với các lệnh gởi dữ liệu từ PC đến vi xử lý: nội dung dữ liệu nhận về từ PC, ví dụ như các thông số điều khiển được cài đặt sẵn, cũng được đưa vào các vùng địa chỉ riêng ứng với các dạng dữ liệu nhận vào. Các giá trị dữ liệu này có thể được dùng để điều khiển các đối tượng bên ngoài khác tùy thuộc vào ứng dụng cụ thể của chương trình. Các lệnh không mang dữ liệu được PC gởi đến vi xử lý là các lệnh yêu cầu vi xử lý gởi dữ liệu, các lệnh không mang dữ liệu từ vi xử lý gởi về PC là các lệnh trả lời đã nhận được nội dung PC vừa gởi vì vi xử lý không có chức năng yêu cầu dữ liệu. Bảng mô tả các vùng địa chỉ của board VXL: Stt Vùng địa chỉ Số byte Dạng dữ liệu Mô tả 1 I0-I1 2x2 2 byte dạng ASCII Input mức-16 ngõ vào(bit) 2 N0-N1 2x5 5 byte dạng ASCII Input xung-2 ngõ vào(99.999Hz max) 3 Q0-Q1 2x5 5 byte dạng ASCII Ngõ vào A/D – 2 ngõ vào (99.999max) 4 U0-U1 2x5 5 byte dạng ASCII Ngõ vào A/D - 2 ngõ vào (±4.999max) 5 O0-O1 2x2 2 byte dạng ASCII Output mức-16 ngõ ra(bit) 6 P0-P1 2x5 5 byte dạng ASCII Output xung-2 ngõ ra (99.99Hz max) 7 A0-A1 2x5 5 byte dạng ASCII Ngõ ra D/A-2 ngỏ ra (99.999max) 8 K0-K7 8x2 2 byte dạng ASCII Biến cài đặt 9 C0-C7 8x4 4 byte dạng ASCII Counter 10 D0-D7 8x2 2 byte dạng ASCII Dữ liệu 11 S0-S7 8x1 1 byte dạng ASCII Biến trạng thái 12 M0-M7 8x1 1 byte dạng ASCII Biến thực thi Bảng mô tả các lệnh chuẩn: Stt Lệnh từ PC Phản hồi từ VXL Mô tả(cho PC) 1 I¿ Ix¿ I0’B’I1’B’¿ Ix’B’¿ Đọc ngõ vào các Digital input. x=0hay1(dạng ASCII) 2 N¿ Nx¿ N0’BBBBB’N1’BBBBB’¿ Nx’BBBBB’¿ Đọc ngõ vào các puls Input. x=0hay1(dạng ASCII) 3 Q¿ Qx¿ Q0’BBBBB’Q1’BBBBB’¿ Qx’BBBBB’¿ Đọc ngõ vào các A/D Input (đơn cực). x=0 hay 1 (dạngASCII) 4 U¿ Ux¿ U0’BBBBB’U1’BBBBB’¿ Ux’BBBBB’¿ Đọc ngõ vào các A/D Input (lưỡng cực). x=0 hay 1 (dạngASCII) 5 Ox’B’¿ Ox¿ Xuất ngõ ra các Digital Output. x=0 hay 1 (dạng ASCII) 6 Px’BBBBB’¿ Px¿ Xuất ngõ ra các PWM. x=0 hay 1 (dạng ASCII) 7 Ax’BBBBB’¿ Ax¿ Xuất ngõ ra các D/A. x=0 hay 1 (dạng ASCII) 8 Kx¿ Kx’BB’¿ Đọc ngõ vào biến cài đặt.x=0 đến 7 (dạng ASCII) 9 Cx¿ Cx’BBBB’¿ Đọc ngõ vào giá trị counter x=0 đến 7 (dạng ASCII) 10 D’BB’x¿ Dx¿ Xuất dữ liệu ra.x=0 đến 7 (dạng ASCII) 11 Sx¿ Sx’B’¿ Đọc ngõ vào biến trạng thái. x=0 đến 7 (dạng ASCII) 12 Mx’B’¿ Mx¿ Xuất ngõ ra biến thực thi.x=0 đến 7 (dạng ASCII) Ghi chú: ’BBBBB’: số byte dữ liệu của các vùng địa chỉ luôn được gọi ở dạng ASCII ; x là chỉ số đi kèm theo các ký tự chỉ vùng địa chỉ nhằm mở rộng các vùng địa chỉ có cùng chức năng. PHẦN 2: MÔ TẢ CHƯƠNG TRÌNH Buffer user Giao tiếp RS-232 Chương trình xử lý dữ liệu 1 2 3 4 LƯU ĐỒ CHƯƠNG TRÌNH TỔNG QUÁT 1: Dữ liệu nhận về từ PC 2: Dữ liệu gởi đến PC 3: Kết quả xử lý 4: Yêu cầu xử lý Khối giao tiếp RS-232: Nhận chuỗi từ PC Kiểm tra. Đóng gói dữ liệu (truyền) Truyền dữ liệu đã đóng gói đến PC Khối buffer user: Đây là vùng đệm cho các chương trình ứng dụng. Khối này thực hiện lưu trữ và truy xuất dữ liệu từ các vùng dữ liệu quy định trong tập lệnh. Các chương trình thực hiện trong khối này là: Ghi giá trị A/D vào vùng địa chỉ Q0. Ghi trạng thái hoạt động từ Kit hay PC đọc từ ngõ vào input 1 đưa vào ô nhớ S0. Chế độ Run/Stop nhận từ PC đưa vào ô nhớ địa chỉ M0. Các ngõ vào input 2,3,4 cài đặt dạng sóng ra đưa vào vùng nhớ địa chỉ K0. Trị đỉnh của dạng sóng ra đưa vào ô nhớ dữ liệu địa chỉ D0. Khối chương trình xử lý dữ liệu: Khối này thực hiện các chương trình ứng dụng cho hệ thống. Tùy các yêu cầu cụ thể đặt ra mà nó thực hiện nhiều hay ít chức năng. Sơ đồ khối tổng quát cho nhóm chương trình trtong ứng dụng này là: Hiển thị Chương trình xử lý Tạo dạng sóng ra Đọc A/D Xuất D/A Đọc input Xuất output Buffer user Bước đầu trong giao tiếp dữ liệu giữa máy tính và vi xử lý được thực hiện bởi việc gởi chuỗi dữ liệu từ máy tính. Do đó, kit vi xử lý chỉ thực hiện và trả lời theo yêu cầu của máy tính gởi đến. CHƯƠNG TRÌNH NHẬN CHUỖI TỪ PC: Như đã giới thiệu ở chương Protocol, frame dữ liệu gởi đi luôn được bắt đầu bởi một byte header cho cả hai hướng truyền (từ PC và vi xử lý). Vì thế, để tránh mất thời gian nếu phải nhận vào cả chuỗi mà ngay ở byte đầu tiên đã không đúng, nên trước tiên ta chỉ nhận về và kiểm tra byte header. Việc nhận dữ liệu chỉ được tiếp tục thực hiện khi byte header là đúng. Ngoài ra cũng có một số ràng buộc kèm theo cho quá trình nhận chuỗi, là ở lần nhận sau phải đảm bảo rằng dữ liệu nhận vào lần trước đó đã được kiểm tra và xử lý. Điều kiện này đặt ra nhằm mục đích bảo toàn các giá trị nhận về từ PC, vì nếu việc nhận dữ liệu vào cứ diễn ra liên tục mà quá trình kiểm tra và xử lý không đáp ứng kịp, thì sẽ xảy ra trường hợp dữ liệu ở lần nhận sau sẽ đè lên dữ liệu nhận về trước đó. Như vậy, quá trình thực hiện sẽ bỏ sót một vài trường hợp xử lý tức hệ thống hoạt động không tối ưu. Điều này chỉ thật sự cần thiết đối với hệ thống thực hiện theo hệ thời gian thực (multitasking) vì các công việc trong chương trình được thực hiện song song nhau. Max=chiều dài tối đa của chuỗi cho phép nhập vào Kiểm tra byte Header Kiểm tra vùng đệm thu có dữ liệu không Cờ nhận=0 ? Nhận vào 4 byte đầu của chuỗi x[i] N=x[3]+4 (chiều dài củachuỗi dữ liệu+ 4byte header&control fiels) N<=max? i=0àn Nhận chuỗi x[i] vào vùng đệm thu i=0àmax Nhận chuỗi x[i] vào vùng đệm thu END Không có Sai Đúng N Y Chương trình nhận chuỗi từ PC CHƯƠNG TRÌNH KIỂM TRA: Việc kiểm tra chuỗi dữ liệu nhận về chủ yếu là kiểm tra cấu trúc frame có phù hợp với định nghĩa không, và chuyển các giá trị dữ liệu nhận vào đến vùng địa chỉ khác, đồng thời cho phép hệ thống tiếp tục nhận dữ liệu vào nếu có. Tác vụ này được thực hiện mỗi khi có chuỗi mới được nhận vào. Cothu=1? (hoàn tất công việc nhận chuỗi?) Bit b0=bit thấp nhất của byte bufin[2] Bit b0=0? (chuỗi nhận vào có dữ liệu?) Số byte dữ liệu (bufin[3])>1? Kết quả nhận đúng Kết quả nhận sai Số byte dữ liệu (bufin[3])>1? Cothu=0(được phép nhận chuỗi mới) RET Chuỗi buffer[]=chuỗi bufin[] Y Y Y Y N N N N CHƯƠNG TRÌNH XỬ LÝ TẬP LỆNH: Chương trình xử lý tập lệnh bước đầu thực hiện việc kiểm tra một số byte control fiels được nhận về từ PC nhằm tránh sự trùng lặp trong quá trình xử lý. Vì theo giao thức truyền thông đặt ra (protocol), nếu trong khoảng thời gian và số lần nhắc lại qui định, kể từ sau khi PC gởi một yêu cầu đến máy tính, mà PC vẫn không nhận được kết quả phản hồi theo mong muốn ( lỗi này có thể xảy ra khi kit vi xử lý không nhận đầy đủ dữ liệu gởi đến từ PC, có thể do các byte control fiel không được xác lập đúng qui định … ) hoặc kết quả nhận về từ khối vi xử lý báo lỗi thì nó gởi lại frame truyền mới, mà frame gởi lại này mang đầy đủ thông tin vừa rồi cho khối vi xử lý (xem chi tiết trong phần protocol). Tuy nhiên, không phải bất cứ khi nào PC không nhận được frame truyền mang theo thông tin trả lời từ vi xử lý đều xem là lỗi mà có thể do gặp sự cố về vấn đề thời gian. Trong trường hợp đó, chương trình không xử lý lại từ đầu mà tiếp tục công việc xử lý cũ. Nên bước kiểm tra này giải đáp cho câu hỏi khối vi xử lý có nhận được và có xử lý yêu cầu vừa rồi không? Tiếp theo quá trình kiểm tra, việc xử lý tập lệnh sẽ thực hiện dựa trên các kết quả của quá trình xử lý theo chức năng cụ thể cho từng hệ thống được đưa vào các vùng nhớ và sử dụng các lệnh được xây dựng trong tập lệnh. N Lưu đồ: chương trình xử lý ứng dụng tập lệnh Bit b1=buffer[2]&0x02 Frame gởi lần đầu (b1=0)? buffer[4] ≠ địachỉ[0]? Và buffer[5] ≠ địachỉ[1]? Địachỉ[0]=buffer[4] Địachỉ[1]=buffer[5] Gọi tập lệnh Cờ xử lý =1 (xử lý xong) RET Y Y N N Kết quả nhận đúng ? Y Frame nhận vào có dữ liệu ? Y N START CHƯƠNG TRÌNH ĐÓNG GÓI DỮ LIỆU: Chương trình đóng gói dữ liệu là tạo ra một frame truyền trả về cho PC mỗi khi nhận yêu cầu gởi đến từ nó. Frame này cũng tuân theo qui định của các byte control fiel, và có thông báo kết quả của lần nhận vừa rồi. Đối với frame gởi về từ vi xử lý, mã ID là mã của frame nhận từ PC. Ngoài ra, việc đóng gói dữ liệu còn nhằm mục đích là đảm bảo trong quá trình gởi 1 khung dữ liệu từ Kit về PC nếu có sự gián đoạn nào xảy ra (1 chương trình interrupt chẳng hạn ) thì sự thay đổi giá trị của một biến bất kỳ cũng không gây ảnh hưởng đến dữ liệu truyền, tuy trường hợp này chỉ xảy ra với xác suất thấp vì tốc độ truyền dữ liệu rất cao nhưng nó cũng là một khuyết điểm đáng chú ý của chương trình nếu không được quan tâm đến. Quá trình đóng gói dữ liệu và trả lời cho PC không phụ thuộc vào chương trình xử lý về mặt thời gian. Nó được thực hiện sau khi hoàn tất chương trình kiểm tra frame nhận vào, kết quả của quá trình xử lý sẽ quyết định nội dung gởi về cho PC, số byte dữ liệu là không nếu chương trình xử lý vẫn đang thực hiện tại thời điểm đóng gói. Bufout[0]=header Bufout[1]=bufin[1] Khởi tạo bufout[2]=0x80 Kết quả nhận đúng? Bit b2=0 (bufout[2]=. . . b2b1b0) Xử lý xong? Bit b0=0 Bufout[3]=chiều dài chuỗi dữliệu Bufout[i+4]=dulieu[i] Gởi chuỗi bufout Bit b2=1 (bufout[2]=. . . b2b1b0) Bufout[3]=0(chiều dài chuỗi dữliệu=0) Bit b0=0 Bufout[3]=0(chiều dài chuỗi dữliệu=0) Y Y N N CHƯƠNG TRÌNH DEMO-KIT: Chương trình xử lý cho ứng dụng Demo-kit luôn phải cập nhật ngõ vào input 1 từ switch để biết chế độ hoạt động của hệ thống là Kit hay PC. Chương trình xử lý được bắt đầu khi nhận được tín hiệu RUN và kết thúc tại STOP do PC gởi đến. Các ngõ vào Input 2, 3, 4 được đọc về từ switch nên được thực hiện theo mức ưu tiên (từ 2 đến 4) nếu có nhiều ngõ vào cùng tích cực. Nếu tại một thời điểm mà không có dạng sóng ra nào được chọn thì hệ thống ở chế độ chờ và có thông báo ra PC. Các dạng sóng ngõ ra chỉ nhằm mục đích minh họa cho ứng dụng của việc sử dụng tập lệnh nên nó được xây dựng rất đơn giản với các dạng sóng ngõ ra có độ dốc không đổi . CÁC DẠNG SÓNG NGÕ RA End Đọc ngõ vào input 1 từ kit để chọn chế độ hoạt động Trạng thái RUN? Y Input 1=1 Hoạt động từ kit Đọc các ngõ vào input 2,3,4 từ data switch input 2=1? Sóng ra dạng răng cưa lên Sóng ra dạng răng cưa xuống Chế độ chờ input4=1? Y Y Sóng ra dạng nón Y input3=1? N N N N Hoạt động từ PC Đọc các ngõ vào input 2,3,4 PC truyền về Y N Lưu đồ: Sóng ra dạng nón Cài đặt trị đỉnh Sóng ra =0 Sóng ra < trị đỉnh Tăng sóng ra Y Y N Timer = 100ms N Cài đặt trị đỉnh Sóng ra =trị đỉnh Sóng ra ¹0? Giảm sóng ra Y Y N Timer = 100ms N Sóng ra dạng răng cưa xuống Sóng ra dạng răng cưa lên

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

  • docGiao tiếp PC và vi xử lý trong hệ thống SCADA.doc