Lập trình giao tiếp cổng song song với ngoại vi sử dụng Led đơn

Một phần của tài liệu Bài giảng điều khiển bằng máy tính (Trang 94)

1. Mạch điều khiển Led đơn

Ta sẽ thiết kế một mạch đèn nháy gồm 8 led, việc nháy như thế nào (chạy đuổi, sáng dần, tắt dần…) là hoàn toàn phụ thuộc vào chương trình trên máy tính.

Mạch sử dụng 8 led, 8 điện trở, và một đầu nối 25 chân dương. Đa số các mạch dùng máy tính điều khiển đều có ưu điểm là đơn giản nhưng lại có rất nhiều chức năng.

Yêu cầu: Lập trình điều khiển 8 Led đơn nối với cổng máy in (LPT) của máy tính để bàn với yêu cầu 8 led đơn chớp tắt lặp lại liên tục. Biết rằng địa chỉ của thanh ghi dữ liệu là 378H, đầu ra tích cực ở mức cao.

+ Sơ đồ nguyên lý. S4 D0 D1 D2 D3 D4 D5 D6 D7 C0\ C1\ C2 C3\ C4 S3 S5 S6 S7\ D0 D1 D2 D3 D4 D5 D6 D7 1 14 2 15 3 16 4 17 5 18 6 19 7 20 8 21 9 22 10 23 11 24 12 25 13 J1 CONN-D25M

SO DO DIEU KHIEN 8 LED DON QUA THANH GHI DATA

A0 2 B0 18 A1 3 B1 17 A2 4 B2 16 A3 5 B3 15 A4 6 B4 14 A5 7 B5 13 A6 8 B6 12 A7 9 B7 11 CE 19 AB/BA 1 U1 74HC245 R1 1k D1 LED-RED R2 1k D2 LED-RED R3 1k D3 LED-RED R4 1k D4 LED-RED R5 1k D5 LED-RED R6 1k D6 LED-RED R7 1k D7 LED-RED R8 1k D8 LED-RED

Bước 1: Vẽ lưu đồ giải thuật

- Lưu đồ giải thuật có thể tham khảo như sau:

Bước 2: Viết chương trình

;Chuong trinh viet dang EXE

.MODEL small ;khai báo quy mô sử dụng chương trình là nhỏ .DATA ;khai bao doan du lieu

du_lieu db "chop tat 8 led don $" .STACK 100 ;khai bao doan ;***********************

.CODE ;khai bao doan ma

Main Proc ;bắt đầu chương trình chính ;dat cac thanh ghi doan

mov ax,data ;muon AX de nap dia chi du lieu vao thanh ghi doan du lieu mov ds,ax

;viet tiep doan ma cua ban vao day

Xác lập các khai báo Nạp địa chỉ cổng LPT Nạp AL =0 Xuất ra cổng LPT Tạo trễ Nạp AL =0FFH Xuất ra cổng LPT Tạo trễ Bắt đầu

lea dx,du_lieu ;nap du lieu vao dx

mov ah,9 ;ngat xuat du lieu lam trong ds ra man hinh( du lieu bat ;buoc ;ket thuc=$)

int 21h

; ngat cho doi nhan phim lap: mov dx,378h mov al,0 out dx,al call delay mov al,0ffh out dx,al call delay jmp lap ends

mov ax, 4ch ; thoat khoi he mo int 21h

delay: mov cx,1000 loop $

ret

ends main ;ket thuc viec hop dich chuong trinh

Trên máy tính có thể có tối đa đến 4 cổng song song và mỗi cổng cần 3 địa chỉ cho ba thanh ghi: dữ liệu, trạng thái, điều khiển. Tuy nhiên ta chỉ dùng thanh ghi dữ liệu và đối với máy tính thông thường thì địa chỉ của thanh ghi này là : 378H (cổng LPT1). Chương trình ở đây minh họa dãy led sáng tắt dần viết bằng Pascal, nếu bạn đã từng viết chương trình thì có thể tùy biến thành nhiều kiểu nháy khác nhau, còn nếu không biết viết chương trình thì cũng không sao, hãy mở Pascal và gõ đoạn chương trình sau rồi cho chạy.

Program LED; Uses CRT;

Var port_address :word; I : integer;

A : array[0..15]of byte ={$FF, $7F, $3F, $0F, $07, $03, $01, $00, $80, $A0, $E0, $F0, $F8, $FA, $FE};

Loop : boolean; Begin

Port_address:=$378; {có thể thay đổi tùy theo máy} Loop :=true; {lặp vòng}

I:=0;

While (loop) do Begin

If (I>15) then I:=0;

Port{port_address}:=a[I]; I:=I+1;

End; End.

2. Tạo xung vuông ở D0 (chân 2) của thanh ghi dữ liệu:

Sử dụng lập trìnhhợp ngữ : Mov dx, 378h; địa chỉ LPT1

Mov bx, const1; số xung được xuất ra Xuat_ra: mov al,1

Out dx, al; “high” ở chân 1 Mov al,0

Out dx, al;”low” ở chân 2 Cho_doi: mov cx,const2

Loop cho_doi; thời gian chờ, ấn định bằng const.2 Dec bx Jnz xuat_ra Bằng turbo C: For(i=1;i<=const1;i++) Outportb(0x378,0); Outportb(0x378,1); Delay(const2);

Hằng số 1 xác định số xung được xuất ra, hằng số 2 xác định số mili giây giữa hai xung kế tiếp.

Một đoạn chương trình tương ứng : For(i=1;i<=const.1;i++)

Outportb(0x378,0); Delay(const2); Outportb(0x378,1); Delay(const3);

Hằng số 1 xác định số xung được xuất ra, hằng số 2 xác định độ kéo dài của xung và hằng số 3 xác định độ trống của xung, cộng lại thành chu kì xung , lấy nghịch đảo ta nhận được tần số xung .

4.1.3. Lập trình ghép nối cổng song song với bộ điều khiển động cơ một chiều.

Lập trình điều khiển động cơ một chiều nối với cổng máy in ( LPT) của máy tính để bàn với yêu cầu động cơ quay thuận. Biết rằng địa chỉ của thanh ghi dữ liệu là 378H, đầu ra tích cực ở mức cao.

Card giao tiếp PC điều khiển động cơ DC 12V quay thuận nghịch.

Card giao tiếp bao gồm IC đệm 74244 các transistor làm nhiệm vụ điều khiển đảo chiều quay cho Motor. Nguồn cấp cho mạch là + 5V và +12V.

S4 D0 D1 D2 D3 D4 D5 D6 D7 C0\ C1\ C2 C3\ C4 D0 D1 D2 D3 D4 D5 D6 D7 S3 S5 S6 S7\ 1 14 2 15 3 16 4 17 5 18 6 19 7 20 8 21 9 22 10 23 11 24 12 25 13 J1 CONN-D25M A0 2 A1 4 A2 6 A3 8 OE 1 Y0 18 Y1 16 Y2 14 Y3 12 U1:A 74ALS244 A0 11 A1 13 A2 15 A3 17 OE 19 Y0 9 Y1 7 Y2 5 Y3 3 U1:B 74ALS244 DC CONTROLLER Q3 TIP31 Q4 TIP32 Q1 BC184 R2 1k R1 1k Q7 TIP32 Q8 BC184 R3 1k R4 1k +12V Q5 TIP31 Q2 BC184 Q6 BC184 +88.8

Hình 4.2 Mạch điều khiển động cơ một chiều

Viết chương trình

;Chuong trinh viet dang EXE

.MODEL small ;khai báo quy mô sử dụng chương trình là nhỏ .DATA ;khai bao doan du lieu

du_lieu db " Dong co một chiều quay thuan $" .STACK 100 ;khai bao doan

;***********************

.CODE ;khai bao doan ma

Main Proc ;bắt đầu chương trình chính

mov ax,data ;muon AX de nap dia chi du lieu vao thanh ghi doan du lieu mov ds,ax

mov ah,9 ;ngat xuat du lieu lam trong ds ra man hinh( du lieu bat buoc ;ket thuc=$) int 21h mov dx,378h mov al,00000001b out dx,al

mov ax, 4ch ; thoat khoi he mo int 21h

ends main ;ket thuc viec hop dich chuong trinh

4.2. Lập trình giao tiếp qua cổng nối tiếp

4.2.1. Phương thức giao tiếp máy tính

1. Giao tiếp PC với PC.

Cáp Null Modem dùng để kết nối hai máy tính với nhau hay máy tính với một thiết bị ngoại vi có giao diện tuần tự và dùng biên bản Zero Modem hay X modem để truyền dữ liệu.

Tín hiệu DSR nối với tín hiệu DTR tín hiệu RTS nối với CTS, bằng cách này giao diện của máy tính luôn hoạt động, dữ liệu được trao đổi qua đường TD và TR.

Hình 4.3 Sơ đồ giao tiếp PC với PC

2. Giao tiếp PC với thiết bị ngoại vi

- Sơ đồ giao tiếp đầu ra của cổng COM với thiết bị ngoại vi tương thích TTL.

Ta phải sử dụng vi mạch chuyển đổi MAX232 để chuyển thành vào ra TTL cho các chân RD và TD.

DCD DSR RD RTS TD CTS DTR RI O T D IR D T D R D DCD IRD DSR CTS RI OTD DTR RTS COM INTERFACE TTL 1 6 2 7 3 8 4 9 5 TO PC CONN-D9F T1IN 11 R1OUT 12 T2IN 10 R2OUT 9 T1OUT 14 R1IN 13 T2OUT 7 R2IN 8 C2+ 4 C2- 5 C1+ 1 C1- 3 VS+ 2 VS- 6 U1 MAX232 C1 1uF C2 1uF C3 1uF C4 1uF 1 2 3 4 5 6 IN CONN-SIL6 1 2 3 4 OUT CONN-H4

Hình 4.4 Sơ đồ giao tiếp PC với thiết bị ngoại vi

- Sơ đồ giao tiếp đầu ra của cổng COM với vi điều khiển 8051.

Ta phải sử dụng vi mạch chuyển đổi MAX232 để chuyển thành vào ra TTL cho các chân RD và TD vì vi điều khiển tương thích mức TTL , giao tiếp với PC qua hai chân đó là RXD ( nhận ) và TXD ( phát ).

4.2.2. Ngôn ngữ lập trìnhgiao diệnmáy tính

1. Lập trình trong DOS a. Ngôn ngữ Qbasic:

Lệnh khởi động cổng COM n:

OPEN “COM n,[Baud], [Parity], [Data], [Stop]” for RANDOM as#m N=1,2,3,4; m=1255

Thí dụ : OPEN “COM 2, 9600, E, 7, 2” FOR RANDOM AS#1 Lệnh xuất ra một chuỗi :

PRINT #,S$

Lệnh đọc vào một chuỗi: INPUT #1, R$

Ngoài ra còn có cáclệnh truy xuất thanh ghi của vi mạch UART.

b. Ngôn ngữ Pascal và C:

Dùng các lệnh truy xuất thanh ghi.

c. Trong MsDOS ở dòng lệnh đánh :

MODE COM n : 96, E, 7, 1 sẽ mở COM n.

Ngôn ngữ Visual Basic có modul phần mềm MSCOMM.OC phục vụ cho truyền thông, với Visual Basic 4.0 là MSCOMM16.OCX còn với Visual Basic 6.0 là MSCOMM32.OCX.

a. Sử dụng MSComm

MSComm l yêu cầu điều khiển cho thông tin trong cổng nối tiếp

Cài đặt:

ActiveX MsComm được bổ sung vo một Visual Basic Project thông qua menu

Project > Components

Tính chất

MSComm: có một số tính chất liên kết. Tính chất liên hệ tới cấu hình của port, truyền dữ liệu, sử dụng tín hiệu bắt tay, và nhận ra điều khiển

Cấu trúc:

 CommID: tra lại việc điều khiển khi nhận ra thiết bị  Commport: đặt và trả lại vị trí của port

 Inbuffersize: đặt và trả lại kích thước của bộ đệm.(bằng byte)

 Inputlen: đặt và trả lại những con số hoặc những ký tự ở ngõ vào sẽ đọc

 Inputmode: đặt và trả lại kiểu dữ liệu.(dạng chữ hay nhị phn) trả lại bằng ngõ vào hay được đồng ý ở ngõ ra

 Nulldiscard: xác định ký tự có rỗng hay không. (Chr.(0).) đã được truyền từ port tới bộ đệm nhận hoặc được bỏ qua

 Outbuffersize: đặt và trả lại kích thước của bộ đệm truyền (khoảng 512 byte)  Parityreplace: kiểm tra cờ chẵn lẻ

 Portopen: đặt và trả lại trạng thái của port. (giá trị boolean)

 Rthreshold: đặt và trả lại một số hoặc ký tự tới bộ nhận trước khi so sánh tới comEvReceive

 Settings: đặt và trả lại tốc độ truyền, cờ chẵn lẻ và dữ liệu vả bit stop

 Sthreshold: đặt và trả lại số hoặc ký tự nhỏ nhất trong bộ đệm truyền trước khi so sánh với comevsend

b. Phần truyền dữ liệu:

 Commevent: trả lại hầu hết các sự kiện hoặc lỗi gần đây  Inbuffercount: trả lại một số hay ký tự trong bộ đệm truyền  Input: trả lại vả xóa dữ liệu từ bộ đệm truyền

 Outbuffercount: trả lại một số hoặc một ký tự trong bộ đệm truyền  Output: ghi dữ liệu ra bộ đệm truyền

c. Phần điều khiển có sự bắt tay

 Break: đặt hoặc xóa đi tín hiệu bị hỏng  Cdholding: trả lại trạng thi của CD

 CTSHoding: trả lại trạng thi của CTS  DSRHolding: trả lại trạng thi của DSR  DTREnable: đặt hoặc xóa DTR

 Handshaking: đặt vả trả lại chuẩn bắt tay  RTSEnable: đặt và xóa RTS

Ví dụ:

Private Sub Form_Load Dim Buffer$ as string

‘Dùng COM1, 9600 baud, không parity, 8 bit data, 1 bit stop MSComm1.Comport=1

MSComm1. Settings=”9600, N, 8, 1” ‘Đọc toàn bộ bộ đệm

MSComm1. Inputlen=0

‘Mở cổng và gửi lệnh đến modem chế độ trả lời bằng chữ MSComm1.PortOpen=True

MSComm1.Output=”ATV1Q0” & Chr$(13) ‘Chờ trả lời “Ok”, nếu có Ok thì đóng cổng Do

DoEvents

Buffer$=Buffer$ & MSComm1.Input Loop Until InStr (Buffer$, “OK”&vbCrLf) MSComm1.PortOpen=False

End Sub

Chương trình trên dùng kỹ thuật hỏi vòng. Ta có thể dùng kỹ thuật sự kiện object.commevent. Khi có sự kiện xảy ra chương trình cho cổng object_oncomm() sẽ được gọi để xử lý các sự kiện hay các lỗi.

Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent

‘Xử lý sự kiện hay lỗi bằng cách đặt lệnh dưới mỗi phát biểu Case ‘Lỗi

Case ComEventBreak ‘Nhận Break Case ComEventFrame ‘Sai frame Case ComEventOverrun ‘Mấtdữ liệu Case ComEventRXOver ‘Đệm thu tràn Case ComEventRXParity ‘Sai parity Case ComEventTXFull ‘Đệm phát đầy Case ComEventDCB ‘Sai khi đọc DCB

‘Sự kiện

Case ComEvCD ‘Đường CD thay đổi Case ComEvCTS ‘CTS thay đổi

Case ComEvDSR ‘DSR thay đổi từ 1 xuống 0 Case ComEvRing ‘RI thay đổi

Case ComEvReceive ‘Số byte đệm thu đạt mức Rthreshold Case ComEvSend ‘Số byte đệm phát ít hơn Sthreshold

Case ComEvEOF ‘Nhận ký tự EOF kết thúc file (mã ASCII 26) trong chuỗi nhập End Select

End Sub

3. Lập trình dùng ngôn ngữ lậptrình DELPHI 5.0 và VISUAL C++ 6.0

Hai ngôn ngữ này dùng các hàm của Win API32.

Do tính chất phức tạp của các hàm và giới hạn của giáo trình, xin trình bày vắn tắt để áp dụng vào chương trình trong Delphi. Chi tiết có thể đọc trong Win 32 Program Reference.

Mở cổng COM dùng hàm Createfile, hàm này trả về một biến (handle). Nếu không mở cổng đuợc biến trả về -1 ,đóng cổng dùng closehandle biến trả về là khác

zero, nếu trả về zero là có lỗi.

Get Commstate lấy cấu hình hiện tại của cổng cất vào khối DCB(device control block).

Set Commstate đặt cấu hình cổng theo nội dung của DCB. Purge Comm_ xoá bộ đệm vào ra, chấm dứt đọc , viết. Writefile viết data (xuất ra cổng com).

Readfile đọc cổng.

EscapeCommFinetion đặt và xóa RTS hay DTR.

4. Lập trình truy xuất trực tiếp cổng.

- Để lập trình điều khiển thiết bị ngoại vi bằng phương pháp truy xuất trực tiếp cổng ta phải nắm được địa chỉ cổng cần truy xuất, các thanh ghi điều khiển, phương thức truyền, định dạng khung dữ liệu...

- Ngôn ngữ lập trình viết trên dos của Windows.

5. Lập trình truy xuất gián tiếp thông qua driver.

Driver ở đây chính là các thư viện liên kết động cho phép người lập trình truy xuất cổng gián tiếp. Chúng hỗ trợ cta đơn giản hoá việc lập trình.

- Sử dụng phần Mscomm

+ Để có được Mscomm sau khi cài phần mềm ta phải nhập thêm đối tượng này bằng cách sau:

Chọn Component trên menu của chương trình sau đó chọn Import Actix X lúc này chương trình hiện ra một hộp thoại cho phép ta lựa chọn các đối tượng cần nhập vào. Ta tiến hàn kéo thanh cuốn dọc và lựa chọn Microsoft Comm Control 6.0 sau đó chọn Install .

Sau đó ta chọn Actix X trên thanh công cụ để lấy Mscomm ra ứng dụng + Các thuộc tính điều khiển cổng

Hình 4.5 Khai báo Import Actix X

+ Các thuộc tính khi lập trình nhận và xuất dữ liệu.

Input: nhận một chuỗi ký tự và xoá khỏi bộ đệm.

InBufferCount: số ký tự có trong bộ đệm nhận

InBufferSize: kích thước bộ đệm nhận

Output, OutBufferCount OutBufferSize hoàn toàn tương tự nhưng là để xuất

+ Thiết lập các thuộc tính cho Mscomm

Để thiết lập thuộc tính cho Mscomm ta có thể thiết lập trong Object Inspector sau khi đã nhấp chuột vào đối tượng. Hoặc ta nháy đúp chuột vào biểu tượng của Mscomm để thiết lập thuộc tính.

Khi đó ta có các thông số cần thiết lập như sau:

Hình 4.6 Thiết lập các thông số cổng COM

Trong nhãn Generalcho ta thiết lập:

Thông số CommPort: Xác định cổng cần truyền thông.

Thông số Settingscho ta thiết lập: Tốc độ truyền: 4200b/s, 9600b/s, .... Kiểm tra chẵn lẻ với bảng sau:

Số bit dữ liệu: 4 bit, 5 bit, 7 bit, 8 bit. Số bit Stop: 1 bit ,1.5 bit, 2 bit.

Thông số Handshahing: cho phép thiết lập chế độ bắt tay hay không bắt tay khi truyền dữ liệu, mặc định là không chọn.

Hình 4.7 Thiết lập thuộc tính MSComm

InBufferSize ( bộ đệm dữ liệu đầu vào ) ta thiết lập là 1024. OutBufferSize ( bộ đệm dữ liệu đầu ra) ta thiết lập là 1024.

Trong nhãn Hardware: cho ta thiết lập các thông số để kiểm tra như: chọn tiếp việc thay thế bit kiểm tra chẵn lẻ ( Parity Replace )....

Sau khi thiết lập xong các thông số cơ bản ta nhấn OK để chấp nhận .

6. Lập trình dùng Matlab

Cho phépgiao tiếp nối tiếp giữa Matlab với thiết bị ngoại vi qua cổng nối tiếp Các lệnh dùng cho việc giao tiếp:

 Instrcallback: Thông tin về sự kiện khi một sự kiện xảy ra.

 Instrfind: Truy xuất các đối tượng cổng COM từ bộ nhớ để xuất ra Workspace.  Instrfindall: Tìm các đối tượng cổng COM có thuộc tính ấn và không ẩn.

 Readasync: Đọc dữ liệu từ thiết bị ngoại vi gửi lên theo phương thức bất đồng bộ.

 Record: Lưu giữ lại dữ liệu và thông tin về sự kiện vào một tập tin.  Serial: Tạo mới đối tượng cổng COM.

 Serial.delete: Xóa đối tượng cổng COM khỏi bộ nhớ.

 Serial.fgetl: Đọc chuỗi ký tự được gửi lên từ thiết bị ngoại vi nhưng không đọc ký tự kết thúc.

 Serial.fgets: Đọc chuỗi ký tự được gửi lên từ thiết bị ngoại vi bao gồm cả ký tự

Một phần của tài liệu Bài giảng điều khiển bằng máy tính (Trang 94)

Tải bản đầy đủ (PDF)

(155 trang)