You are on page 1of 42

Phần II.

Ghép nối đo lường điều khiển sử máy tính


(Phần 1, có các câu hỏi về lý thuyết + Bài tập – đã nhắc
và đặt vấn đề qua từng tiết học)
+ Máy tính: Máy tính tương tự, to, cồng kềnh, máy tính
số, Pentium 1,2,3,4,5, có rất nhiều hãng chế tạo,…, máy
tính quả táo (đen trắng, môi trường dos)
+ Kỳ vọng ban đầu: Các nhà chế tạo máy tính cho mục
đích đo, điều khiển, quản lý,,, (Tự động hóa – điều khiển
tự động) -> áp dụng cho công nghiệp.
+ Mỗi một máy tính (các hãng chế tạo) đều phải tuân thủ
1 quy chuẩn (địa chỉ cho phép người sử dụng can thiệp
(ghép nối thêm) cho mục đích điều khiển.
+ Máy tính trước đây: nhu cầu nghe nhạc, mua thêm 1 ổ
CD, mua thêm 1 card sound, cắm vào máy tính; cài đặt
đạt phần mềm để hệ điều hành windows của máy tính
điều khiển được; (DVD),,
+ muốn kết nối internet, mua thêm 1 card phần cứng,
cắm vào máy tính; cài phần mềm; kết nối với đường dây
điện thoại cố định.
+ Xem tivi bằng máy tính, card +software.
+ Game, đồ họa, lắp thêm phần cứng, card màn hình .,,,
Để có thể kết nối được với những thiết bị người dùng.
Máy tính (4 cổng LPT (cổng song song), 4 rãnh cắm mở
rộng – theo chuẩn công nghiệp -ISA, 4 cổng nối tiếp -
COM) các hãng phải quy chuẩn địa chỉ, A
+ Máy tính chỉ còn 2 COM, 2LPT, 4 rãnh ISA (A,Cổng
đọc thẻ nhớ)
+ Máy tính 1COM, 1LPT, 4 rãnh ISA, USB
+ Máy tính 1 COM, 2 rãnh ISA, USB
+ bỏ hết COM/ ISA/LPT
+ Máy tính USB, HDMI
+ Tích hợp các ineternet, wifi, sound, trên main.
///////
Thương mại: tích hợp hết các cổng -> tăng giá thành,
bán được ít; trong khi các máy tính phục vụ cho văn
phòng nhiều hơn;
+ Máy tính văn phòng
+ Máy tính công nghiệp
Ban đầu, máy tính cho công nghiệp, sau đó thấy chủ yếu
dùng cho văn phòng, quản lý vật tư, thiết bị,….
Bán được ít, giá thành cao, giảm các giao diện, giá hạ
xuống.
Đến nay các máy tính xách tay, bàn, giao tiếp ghép nối
với bên ngoài chỉ còn qua cổng USB
+ Phân dòng: máy tính văn phòng
Máy tính công nghiệp

Cổng song song, giao diện có 3 thanh ghi 8 bit


+ Thanh dữ liệu
+ Thanh ghi trạng thái
+ Thanh ghi điều khiển
Dữ liệu cho phép đi 2 chiều:
Ví dụ: sử dụng LPT2; địa chỉ DataRegister 378
Điều khiển, đưa số liệu ra điều khiển
Ngôn ngữ C/C++: outportb(0x378, 0xFF); tương đương
outportb(0x378,255);
+ Đo số; đọc cổng
Khai báo biến int Doluong;
Doluong=inportb(0x378);
Riêng giao diện thanh ghi data, tương đương 1port của
VXL (I/O số).
+ Thanh ghi trạng thái 8bits
Địa chỉ LPT2, 379h; có 5 bit giao tiếp với bên ngoài (chỉ
cho phép đi vào máy tính, đo), bit S7 bị đảo trước khi
vào;
Doluong_sobo=inportb(0x379);
GT=inportb(0x379)&0xF8; // loại được 3 bit thấp
(không phải giá trị đo mà nó là giá trị bất kỳ luẩn quẩn
bên trong)
+ Thanh ghi điều khiển

Chỉ có 4 bit kết nối với bên ngoài (4bit thấp), có 3 bít bị
đảo trước khi I/0
Địa chỉ 0x37A
Vào:
GT=inportb(0x37A)&0x0F;
Điều khiển: outportb(0x37a, số):
Bài toán điều khiển số (in số, ra số, logic -> lập trình
trên máy tính C/C++; bạn cần đọc lại các lệnh logic;
AND/OR,NOR,NOT, khâu phải câu chữ, các ký hiệu ,
and bit/ and byte,….; & &&, ||,…
Quy chuẩn 4 conngr LPT/ thi 1 cổng sử dụng mặc định
là LPT2 (378, 379, 37A)
Tổng kết lại
8 bit data thực tế chỉ đi ra
5 bit trạng thái chỉ đi vào
4 bit điều khiển (đi vào/đi ra)
Tổng = 17 tín hiệu:
Ví dụ bài toán logic bạn cần 8 đầu vào số; 9 dầu ra số:
+ 8 bít data – sử dụng là đầu ra + 1 bit điều khiển (làm
đầu ra)
+ 5 bit trạng thái làm đầu vào + 3 bit còn lại của điều
khiển làm đầu vào.
+ Lập trình: lệnh làm với cổng
Lấy số liệu: DL= inportb(địa chỉ cổng)
Xuất tín hiệu điều khiển: outportb(Địa chỉ cổng, số điều
khiển)
+ Nội dung thuật toán – chính là xử lý các lệnh logic
Cần xem lại các lênh logic của C/C++
And bit, and byte, or,… &, &&, ||
(ngôn ngữ C) – Giải lao 15’

Xem trước các IC thường sử dụng để phục vụ cho bài


toán ghép nối tiếp theo

Bài tập: 1 cảm biến đo nhiệt độ (giả thiết CB+mạch so


sánh) đầu ra là =”1” khi nhiệt độ >= 300C; và =’0’ khi
nhiệt độ <300C.
Thiết kế mạch ghép nối với cổng LPT để thực hiện bài
toán điều khiển quạt, dựa trên cơ sở nhiệt độ
Viết chương trình phần mềm điều khiển sao cho khi
nhiệt độ >=300 thì bật quạt, <300 thì tắt quạt.
(bài này đã có, nhưng phần đo lường đang dùng S7,
phần điều khiển C0.
Cũng yêu cầu như trên,
(1) nhưng sử dụng thanh ghi data để điều khiển, thanh
ghi trạng thái để đo;
(2) thanh ghi data để điều khiển, thanh ghi điều khiển
để đo.
(LPT: dataRegs 0x378; statusRegs 0x379;
controlRegs 0x37A- Chú thêm chiều tín hiệu; bit
nào bị đảo trước khi I/O).

#include <conio.h>
#include <iostrem.h>
int kt;
void main() {
do {
kt=inportb(0x379) & 0x80; // đọc nội dung thanh ghi trạng thái và and với
0x80 (s7=1)
if (kt==128)
{
outportb(0x37A, 0x01); // điều khiển bật quạt C0=1
cout<<”\n Nhiet do dang lon hon 30 do C”;
}
else {
outportb(0x37A, 0x00); // điều khiển ngắt quạt C0=0
cout<<”\n Nhiet do dang nho hon 30 do C”;
}
cout<<”\n Muon thoat chuong trinh thi go mot phim bat ky”;
} while(!kbhit());
} // end of main

Bộ biến đổi tín hiệu tương tự sang tín hiệu số - ADC


+ ADC0809
Chương trình đọc số liệu đo lường lần lượt 8 kênh vào máy tính và hiển thị kết
quả như sau:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
int k, GT, GT1, GT2;
void main()
{
clrscr();
do{
for(k=0;k<8;k++)
{
outport(0x378,k+8); //chọn kênh thứ k, chốt và khởi động kênh thứ k
delay(300); // trễ 300ms đảm bảo cho ADC biến đổi xong
outport(0x378, k+8+16); // duy trì trạng thái và kích OE=1 (của ADC)
GT1=inportb(0x379)&0xF0; // đọc và tách lấy 4 bit cao
GT2=inportb(0x37A)&0x0F; // đọc và tách lấy 4 bit thấp
GT=GT1+GT2; // ghép byte giá trị đo được
cout<<"\n Gia tri do luong tai kenh "<<k<<" = "<<GT; // hiển thị kết quả
}
cout<<"\n Dang do luong, muon thoat chuong trinh thi go phim bat ky";
} while (!kbhit()); // điều kiện kết thúc vòng lặp
}// end of main.... kết thúc chương trình
//Kết thúc của lớp N02

Làm bài tập; các ví dụ trong sách; cải tiến theo ý của bạn
11/10/2021 – 12/10/2021
+ LPT ghép I/O số, bài toán logic (phần cứng + chương
trình phần mềm)
+ LPT ghép ADC,
+ LPT ghép với ADC, HC257 (vào 8 ra 4, đem lại khả
năng dư cổng (ControlRegts) để làm việc khác)
+ Tăng khả năng mở rộng I/O, chúng ta sẽ dùng thêm
đệm số liệu;
Đặt bài toán: Thiết kế mạch phần cứng ghép với LPT
với mục đích đo lường: ADC0809, đệm số liệu 1 chiều
74LS273, HC257. Viết chương trình phần mềm để đọc
số liệu đo lường từ kênh 3 vào máy tính và hiển thị:

Viết chương trình đọc lần lượt 8 kênh vào máy tính và
hiển thị kết quả đo.
+ Thiết kế phần cứng để ghep nối LPT mục đích điều
khiển, có 2 kênh ra tương tự; viết chương trình điều
khiển theo biểu đồ xung. (DAC0808, 74LS273)
Gải lao
Sơ đồ tổng quát

Đệm số liệu 1 chiều 8 bit, có chân CLR =0, thì xóa dữ


liệu, khi sử dụng ta phải treo lên ‘1’;
Khi CLK=’0’ cho phép số liệu đi qua;
Giả sử thiết kế như hình vẽ:
Đọc kênh k;
….
outport(0x378,0); // đưa ra bus số liệu 0;
outport(0x37A,0);// điều khiển 273 thông
// đo
Chọn kênh, chốt kênh, chờ, đọc
int k=3;
// khóa 273 (phần điều khiển), mở 273 ở phần chọn kênh
C2=1; C1=0;
outport(378,(k+8));// chọn k, start/ALE
chờ

Đọc số liệu: điều khiển Select 257, đọc 2 lần, ghép byte;
// điều khiển
Khóa 237 ở phần ADC; mở 273 ở phần DAC;
Nếu cấu trúc hiện tại, thì do ta còn dư 1 chân C3, ta có
thể ghép được thêm 1 kênh ra tương tự (sử dụng thêm
273+DAC)
Bài tập: Làm lại bài đo, có sử dụng thêm đệm số liệu
273
Bài tập:
Thiết kế một mạch phần cứng ghép với LPT với mục
đích điều khiển, Sử dụng DAC0808, 74LS273, các linh
kiện cần thiết khác. Viết chương trình điều khiển theo
biểu đồ xung/
Ghép nối LPT để điều khiển, có 2 kênh ra để điều khiển
tương tự: sử dụng DAC0808, và các linh kiện cần thiết
khác. Viết chương trình điều khiển theo biểu đồ xung

Cổng song song: Các bài ghép nối đo lường, HC257,


74LS273, ADC0809.
Ghép nối điều khiển, ít nhất là 2 kênh theo biểu đồ xung
DAC0808, đệm số liệu 1 chiều, 74LS273

Rãnh cắm mở rộng theo chuẩn công nghiệp -ISA -8bits

+ Có 8 bit data (D0-D7) 2 chiều;


+ 20 đường địa chỉ A0-A19
+ /RD; /WR: nếu có lệnh đọc số liệu (inportb(…)) thì
/RD tự động=0; /WR =1
Lệnh viết số liệu ra (ouportb(….)) /RD=1; /WR=0;
Reset
IRQ (các ngắt)
+-5V/+-12V có thể sử dụng
Các chân Gnd.
AEN- chân này luôn bằng 0, khi sử dụng vùng địa chỉ
(có vẻ như rãnh cắm nó có các chân giao tiếp với CPU
của máy tính; đồng thời các chân để đấu nối ra gần
giống như VXL)
+ Giải mã địa chỉ:
- theo quy định của các hãng máy tính, dành vùng địa
chỉ (0x300-0x31f) để cho người sử dụng:
- Ghép nối 8bit, vì vậy vùng địa chỉ trên, chúng ta có
thể tách ra thành 4 vùng:
0x300-0x307
0x308-0x30f
0x310-0x317
0x318-x031f
Giải mã 74LS 138:
G2a,G2b=0 và G1=1; thì 74LS138 được kích hoạt (cho
phép hoạt động)
CBA là 3 bit điều khiển đầu ra của 138; dầu ra nào được
chọn thì nó sẽ chuyển từ mức 1 xuống mức “0” (còn gọi
là kích hoạt ở mức 0);
Nguyên tắc giải mã: đưa các Ai, AEN, /RD,/WR vào tổ
hợp mạch logic để trên cơ sở vùng địa chỉ chọn trước ta
sẽ tổ hợp logic để tạo ra mức 0, mức 1 đưa vào kích hoạt
138 hoạt động.
Ví dụ: Giải mã địa chỉ 0x310-0x317; sử dụng HC688,
74LS138
Lệnh outportb(0x317,255); Y7 đang từ 1 xuống mức 0,
đựa vào CLK của 273, 273 cho phép dữ liệu đi qua,
DAC0808 hấng 255, biến đổi thành đầu ra là 5V
Theo nguyên lý 74LS138 thì tại 1 thời điểm chỉ có một
đàu ra được kích hoạt (‘0’);
Giả sử outportb(0x316, 128); kênh 2 lúc đó là 2,5 V;và
kênh 1 vẫn là 5V.
Bài tập: Thiết kế một phần cứng ghép qua ISA mục
đích điều khiển có hai kênh ra tương tự. Sử dụng
DAC0808, 74LS273, 74LS138, HC688, Vùng địa chỉ
cho phép 0x318-0x31F.
Viết chương trình đưa số liệu ra 2 kênh theo biểu đồ
xung.

(buổi sau, chúng ta sẽ thay HC688 bằng 74LS85, hoặc


hoàn toàn các cổng logic)
Nguyên lý hoạt động của bộ so sánh 74LS85
Bộ so sánh 4 bit

Ví dụ: Thiết kế một mạch phần cứng phục vụ cho đo


lường ghép qua ISA, sử dụng 74LS85, ADC0809,
74LS273, 74LS138, và các linh kiện cần thiết khác,
Vùng địa chỉ cho phép 0x308-0x30F.
Viết chương trình đọc số liệu từ kênh 3 vào máy tính và
hiển thị kết quả.

+ Gải mã địa chỉ


A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 0 0 0 0 1 0 0 0 0x308
3 0 1 0 0 1 0x309
. . . .
1 1 1 1 0x30F
Cố định Thay đổi

Chương trình:
#include <….>
int k, GT;
void main()
{ k=3;
do{ outportb(0x309,k); // tạo mức 0 để mở 273, ,.chốt và
start ADC chọn kênh k và khởi động ADC
delay(10); // chờ ADC biến đổi xong
GT=inportb(0x308); // kích OE của ADC lên 1 cho phép
số liệu của ADC gửi lên bus.
cout<<”\n Giá trị đo tại kênh: “<<k<<”là=”<<GT;
} while(!kbhit());
}
Phát triển: Viết chương trình đọc lần lượt 8 kênh/
Giải lao 15 phút
Ví dụ: Thiết kế mạch phần cứng ghép qua ISA với mục
địch điều khiển, yêu cầu có 2 kênh ra để điều khiển
tương tự; sử dụng DAC0808, 74LS273, 74LS138,
74LS85; vùng địa chỉ cho phép (0x308-0x30F).
Viết chương trình đưa số liệu ra điều khiển 2 kênh theo
biểu đồ xung
+ Tiến hành ghép nối với ADC
(bên cạnh 74LS273, còn có 74LS373 và 74LS245 (2
chiều)
///02/11/2021
Đệm số liệu 2 chiều 74LS245
Ví dụ: Ghép nối điều khiển qua ISA – 8bit
Thiết kế 1 card ghép qua ISA để điều điều khiển, yêu
cầu có hai kênh ra tương tựm sử dụng 74LS273,
DAC0808, HC688, 74LS138, các linh kiện cần thiết
khác. Vùng địa chỉ cho phép 0x310-0x317. Viết chương
trình đưa số liệu ra điều khiển theo biểu đồ xung/

Giải mã địa chỉ


A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 0 0 0 1 0 0 0 0
0 0 1
0 1 0
1 1 1
3 1 0-7

HC257 là bộ so sánh 8 bít


Nếu đầu vào Pi=Qi và đầu vào P/Q=0 thì đầu ra P/Q=0

Như vậy nếu địa chỉ khác, cải tiến giải mã?
Nếu thay HC688 bằng 74LS85?
Nếu sử dụng hoàn toàn các cổng logic ?
(16/10/2021-N03)
Giải mã địc chỉ:
Từ vùng địa chỉ yêu cầu, trải bus địa chỉ
A9A8….A2A1A0
Kết hợp với ALE, /RD; /WR , tổ hợp logic sao cho thì
đầu ra logic đó đạt được 0/1 để đưa vào điều khiển kích
hoạt 138 hoạt động.
Ví dụ: Sử dụng ADC0809, đệm số liệu 1 chiều
74LS273, giải mã đại chỉ 74LS138, So sánh 74LS85, và
các linh kiện cần thiết khác để thiết kế một giao diện
phần cứng (card) ghép với ISA. Vùng địa chỉ cho phép
(0x318-0x31F)
Viết chương trình đọc số liệu đo lường từ kênh 3 vào
máy tính và hiển thị.

+ Gải mã địa chỉ


A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 0 0 0 1 1 0 0 0 0x318
3 1 1 0 0 1 0x319
1 0 1 0 0x31A
1 .. .. .. ….
1 1 1 1 0x31F

#include<conio.h>
#include<dos.h>
#include<iostream.h>
#include<stdio.h>
int k, GT;
void main()
{ k=3; // kênh 3
do{
outport(0x319,k); // chọn kênh k, kích Start&ALE
delay(10); // chờ ADC biến đổi xong
GT=inportb(0x318); // kích OE =1, đọc số liệu
cout<<”\n GTĐL tai kenh “<<k<<”la=”<<GT;
} while(!kbhit());
}
// Viết chương trình đọc số liệu đo lần lượt 8 kênh/
// Vùng địa chỉ 0x300-0x307
// Tổ hợp logic thay đổi HC688/ hoàn toàn các cổng logic
Khi ghép với DAC, điều khiển 2 kênh theo biểu đồ xung/

Giải lao 15’


Tìm hiểu về COM
+ Viết 3 hàm: Hàm setup – cài đặt chế độ COM; Hàm
nhận tín hiệu, Hàm truyền dữ liệu – N01

/// Đối với ghép nối qua cổng COM (N03)


- Viết hàm cài đặt chế độ cho cổng COM theo yêu
cầu:
Ví dụ: 1 bit start.\, 1 bit stop, non parity, data 8bit,
tốc độ truyền 9600 b/s
(có parity , kểu parity;…
- Viết hàm truyền số liệu qua cổng COM
- Viết hàm nhận số liệu qua cổng COM
(Tập trung vào đọc các thanh ghi sau:
Thanh ghi đệm truyền/nhận
Thanh ghi trạng thái đường truyền
Thanh ghi điều khiển đường truyền.
Viết hàm:
float tinh(foat x, y)
{ float z;
z = x*x+y*y;
return(z);
}
void tenham()
{///
return(0);
}
Cài đặt chế độ COM: tốc độ truyền:
+ Điều khiển C7 của Control Regs =1; // lúc đó mới cho
phép nạp số chia để tính toán tốc độ truyền.
+ Xuất (ghi) số chia (theo bảng tốc độ) vào thanh ghi
data regs.
+ Tùy theo chế độ hoạt động, có kiểm tra parity, kiểu
parity, số bít của data, số bit stop
Tính ra con số, nạp vào Cotrol Regs
Giả sử Tốc độ 4800b/s; data 7bit, nhieu stop; có prity,
kiểu parity chẵn, normal (xem kỹ yêu cầu)
+ C7=1; -- ControlRegster
+ nạp số chia vào DataRegster
+ tính toán số: C7C6C5C4 C3 C2 C1 C0
1 1 1 0 =14 (E)
void caidat()
{ outportb(0x3FB, 0x80);
outportb(0x3F8, 24); //tốc độ
outportb(0x3FB, 0x0E);
}
Còn 2 hàm:truyền/nhận
(N03)
+ Hàm truyền, hàm nhận dữ liệu qua COM
Truyền, có 1 thanh ghi đệm truyền, phải kiểm tra xem
thanh ghi đệm truyền đã trống (truyền hết chưa), nếu
chưa hết thì chưa ra lệnh chuyển dữ liệu cần truyền đến
thanh ghi này, còn nếu rỗng rồi, có nghĩa là số liệu trước
đó đã được truyền hết thì lúc này ta mới ra lệnh.
Quá trình nhận dữ liệu: Kiểm tra xem thanh ghi nhận đã
rỗng chưa.
Truyền/nhận dữ liệu đều phải thông qua 1 thanh ghi đệm
truyền nhận (COM 0x3F8).
Làm thể nào để biết trạng thái của thành ghi đệm truyền
nhận  vai trò của thanh ghi trạng thái.
// KẾT THÚC LÝ THUYẾT – N03
Giải đáp – có vấn đề gỉ cần trao đổi
Làm bài tập: báo cáo
Bài tập tuần này: tích cực báo cáo
+Tuần sau – Kiểm tra
+ Tuần sau nữa: buổi cuối, tính điểm thành phần, lưu ý
để thi/
Dự kiến:
+ Lý thuyết: theo kiểu hiểu
+ Bài tập: Cho đặc tính cảm biến (R, U, I), Thiết kế
mạch đo (KĐ ĐL) sao đầu ra đạt [0- Uout]; đo tốc độ
động cơ Encoder/máy phát tốc, Điều khiển đóng cắt đèn
tự động
+ Bài tập phần ghép nối: LPT/ ISA (bài đo, bài điều
khiển)- ADC/DAC.
+ 3 hàm phục vụ cho cổng COM
(chọn các bài đặc trưng ở cuối các chương để làm)

You might also like