định thời lập trình đ−ợc PIT 8253/54 Programable Interval Timer dùng để giảm tần số đồng hồ theo đúng yêu cầu của các ứng dụng.. Có thể chia cấu trúc của 8253 làm 3 phần: - Lối vào gồm b
Trang 1định thời lập trình đ−ợc PIT 8253/54 (Programable Interval Timer) dùng để giảm tần số đồng hồ theo đúng yêu cầu của các ứng dụng
Vi mạch lập trình 8253A là một mạch đếm đ−ợc lập trình (programmable interval timer/counter) Nó thực hiện chức năng chính trong máy tính IBM-PC
là mạch điều khiển thời gian, phát tín hiệu đồng hồ, kiểm soát one-shot, đếm sự kiện, phát tần số và điều khiển motor
* Tổ chức sơ đồ khối và bố trí chân của 8253A
Mạch 8253 gồm có ba bộ đếm 16 bits có thể lập trình và hoạt động độc lập với nhau Chúng có thể hoạt động ở Mode đếm nhị phân hoặc BCD
Có thể chia cấu trúc của 8253 làm 3 phần:
- Lối vào gồm bộ đệm dữ liệu vào (Data Bus Buffer), mạch điều khiển logic đọc/ghi (Read/Write Logic) và thanh ghi từ điều khiển (Control Word
D0-D7DataRDWA0A1CS
count0
count1
count2
BUS dữ liệu và điều khiển nội bộ
Bộ đệm BUS dữ
liệu
Đọc ghi logic
Thanh ghi
từ đ/k
CLK0 Gate0 Out0
CLK1 Gate1 Out1
CLK2 Gate2 Out2
Hình 7.1 Sơ đồ chức năng mạch định thời lập trình hoá 8253A
Trang 2Register)
- Bus nội bộ dùng để chuyển số liệu và các tín hiệu điều khiển giữa đầu vào
và đầu ra
- Đầu ra gồm có ba bộ đếm 16 Bits làm việc trong chế độ đếm ng−ợc
• Khối Bộ đệm BUS dữ liệu - Data Bus Buffer: Gồm các đầu ra D0-D7 là các cổng ba trạng thái, có hai chiều đ−ợc dùng để nối 8253 với Bus hệ thống của máy tính Số liệu sẽ đ−ợc phát hoặc nhận nhờ các lệnh INPUT hoặc OUTPUT của BVXL Bộ đệm dữ liệu có 3 chức năng cơ bản sau:
- Lập các Mode làm việc cho 8253
- Nạp số liệu cho các bộ đếm
- Đọc giá trị của các bộ đếm
• Khối dọc ghi Logic: Gồm có Mạch kiểm soát logic đọc/ ghi nhận điều khiển từ Bus hệ thống và phát tín hiệu điều khiển cho các khối chức năng của 8253 Mạch đ−ợc chọn hoặc cấm bởi tín hiệu CS
• Thanh ghi từ điều khiển - Control Word Register
Thanh ghi từ điều khiển đ−ợc chọn khi A0, A1 có giá trị logic 1 1, số liệu
đ−ợc ghi từ Data Bus Buffer vào thanh ghi đó là các chế độ làm việc cho các con đếm là đếm nhị phân, đếm BCD và nạp giá trị đầu cho mỗi con đếm
Control Word Register chỉ có thể ghi số liệu đ−ợc vào chứ không thể đọc
số liệu trên nó
• Ba bộ đếm Counter #0, Counter #1, Counter#2
Ba bộ đếm nh− đã mô tả ở trên, mỗi
bộ đếm là 16 Bits có thể đặt đ−ợc, làm
việc ở chế độ đếm lùi, theo mã nhị phân
hoặc BCD đầu vào và đầu ra có thể lập
trình qua Control Word Register Việc đọc
nội dung của các con đếm có thể đ−ợc
địa chỉ hoá bằng các chân A0, A1 và CS , nh− giới thiệu ở bảng 6.1 Mỗi bộ
Trang 3đếm có 3 chân là CLK (clock),
GATE và OUT (hình 6.2)
RD (chân 22) là tín hiệu có
mức tích cực thấp dùng để báo
cho 8253 biết rằng BVXL đang
đọc số liệu từ 8253
WR (chân 23) là tín hiệu có
mức tích cực thấp dùng để báo
cho 8253 biết rằng BVXL đang
thực hiện ghi số liệu vào các
thanh gi của 8253
CLK
CLK là tần số đồng hồ vào
Đối với 8253, tần số này có giá trị
trong khoảng 0-2 MHz Với tần số
trên 2 MHz cần sử dụng chip
8254 8254 có thể làm việc được
với tần số đến 8 MHz, còn 8254-2
- 10 MHz
OUT
Mặc dù tần số vào là xung
vuông với hệ số đầy xung 33%, nhưng có thể lập trình để chọn dạng xung ra ở chân OUT sau khi thực hiện chia tần số Trong số các tuỳ chọn dạng xung có: xung vuông, xung đơn và xung vuông với các hệ số đầy xung khác nhau, tuy nhiên không có dạng hình sin hoặc răng cưa
GATE
Chân Gate được sử dụng để mở hoặc khoá bộ đếm Đặt chân GATE lên mức cao (5 V) cho phép mở bộ đếm, trái lại đưa về thấp (0V) sẽ khoá bộ đếm Trong một số chế độ, cần đặt vào chân GATE sườn xung lên (từ 0 lên 1) để mở
bộ đếm
D0-D7
D0-D7 của 8253/54 là bus dữ liệu hai chiều được nối tới D0-D7 của bus dữ liệu hệ thống Bus này cho phép CPU truy nhập các thanh ghi của 8253/54 ở cả hai thao tác đọc và ghi Chân RD và WR (cả hai đều tích cực thấp) được nối tới các tín hiệu điều khiển IOR và IOW của bus hệ thống
1 24
2 23
3 22
4 21
5 20
6 19
7 18
8 17
9 16
10 15
11 14
12 13
8
2
5
3
Vcc
WR
RD
CS A1 A0 CLK2 OUT2 GATE2 CLK1 GATE1 OUT1
D7 D6 D5 D4 D3 D2 D1 D0 CLK0 OUT0 GATE 0 GND
D7-D0
WR
RD
A0 A1
CS
8253
CLK0 GATE0 OUT0 CLK1 GATE1 OUT1 CLK2 GATE2 OUT2
Hình 7.2 Sơ đồ chức năng và bố trí chân chip 8253
Trang 4* Khởi tạo 8253/54
Ba bộ đếm của 8253/54 đều được lập trình riêng rẽ Để lập trình cho từng
bộ đếm, trước hết byte điều khiển cần được ghi vào thanh ghi điều khiển với một trong những nội dung là thông báo dạng xung ra cần thiết cho 8253/54 Ngoài ra, giá trị dùng để chia (số chia) xung đầu vào phải được ghi vào bộ đếm của 8253/54 Số chia này có thể lớn, ví dụ FFFF (16 bit), còn bus dữ liệu của
bộ định thời 8253/54 chỉ có 8 bit, dĩ nhiên số chia mỗi lần chỉ gửi được một byte 8253/54 phải được khởi tạo trước khi sử dụng
* Từ điều khiển
Hình 6.3 giới thiệu từ điều khiển 1 byte của 8253/54 Byte này được gửi tới
thanh ghi điều khiển, và gồm các bit như sau:
D0 cho phép chọn số chia là nhị phân (0000-FFFFH) hay BCD (0000-
9999H) Số chia nhỏ nhất cho cả hai tuỳ chọn là 0001 Số chia lớn nhất là 216(nhị phân) và 104 (BCD) Để có được số đếm lớn nhất (65.536 với số thập phân
và 10000 với BCD), bộ đếm cần được nạp giá trị 0
D1, D2 và D3: chọn chế độ Có 6 chế độ xác định dạng tín hiệu ra
Mode 0 Ngắt khi đếm hết
Mode 1 Tạo 1 xung
Mode 2 Bộ tạo hệ số đầy xung
Mode 3 Bộ tạo xung vuông
Trang 51001 01 11 Thanh ghi điều khiển 97
b) So sánh từ điều khiển 00 11 011 0 với bảng 5.1, có thể xác định đó là
bộ đếm 0 vì CS có giá trị là 00 RL bằng 11 xác định rằng đọc/ghi byte LSB trước và MSB sau Chọn chế độ là 011 nên đây là chế độ 3 (xung vuông) và cuối cùng là chọn dạng đếm nhị phân vì bit D0 = 0
D4 và D5 là cho RL0 và RL1 Bus dữ liệu của 8253/54 là 8 bit (1 byte),
nhưng số chia của tần số vào có thể lớn (FFFFH) Vì thế, RL0 và RL1 được sử dụng để chỉ kích thước của số chia RL0 và RL1 có 3 tuỳ chọn: (1) chỉ đọc/viết byte trọng số cao (MSB), (2) chỉ đọc/viết byte trọng số thấp, (3) đọc/viết LSB trước và MSB sau
Như vậy, với các tuỳ chọn của RL0 và RL1, lập trình viên không thể ghi giá trị của số chia vào bộ định thời 8253/54 song lại có thể đọc nội dung của bộ
đếm vào bất cứ lúc nào Tất cả các bộ đếm đều là đếm lùi và thanh ghi đếm là giảm, nên nội dung các thanh ghi đếm có thể đọc ở bất cứ lúc nào
D6 và D7 được sử dụng để chọn trong 3 bộ đếm, bộ đếm 0, bộ đếm 1 hay
bộ đếm 2 được khởi tạo bằng byte điều khiển
Ví dụ 6.2
Sử dụng các địa chỉ cổng ở ví dụ 6.1 để lập trình:
a) Bộ đếm 0 với số đếm nhị phân, chế độ 3 (tạo xung vuông) và chia CLK0 cho 4282 (BCD)
b) Bộ đếm 2 với số đếm nhị phân, chế độ 3 (tạo xung vuông) và chia CLK2 cho C26AH
Trang 6c) Tìm tần số tại OUT0 và OUT2 trường hợp (a) và (b) nếu CLK0=1,2 MHz và CLK2=1,8 MHz
Giải:
a) Để lập trình bộ đếm 0 chế độ 3, chúng ta có từ điều khiển là 0011011, vì thế:
MOV AL,37H ;bộ đếm 0, chế độ 3, BCD
OUT 97H,AL ;gửi tới thanh ghi điều khiển
MOV AX,4282H ;nạp số chia (BCD)
OUT 94H,AL ;gửi byte thấp
MOV AL,AH ;đến bộ đếm 0
OUT 94H,AL ;và sau đó gửi byte cao đến bộ đếm 0
b) Bằng cách tương tự:
MOV AL,B6H ;bộ đếm 2, chế độ 3, nhị phân (hex)
OUT 97H,AL ;gửi tới thanh ghi điều khiển
MOV AX,C26AH ;nạp số chia
OUT 96H,AL ;gửi byte thấp
MOV AL,AH ;đến bộ đếm 2
OUT 96H,AL ;và sau đó gửi byte cao đến bộ đếm 2
c) Tần số ra của OUT0 là 1,2 MHz : 4282, được 280 Hz Chú ý rằng chương trình ở phần A sử dụng lệnh MOV AX, 4282H do các số BCD và Hexa cùng biểu diễn một số như nhau cho đến 9999 Với OUT2, CLK2 là 1,8 MHz chia cho 49770 (do C26AH=49770 D) Vì thế, ở OUT2 có xung vuông với tần số là 36 Hz
Để lập trình bộ đếm của 8253/54 nhằm xác định số chia tần số vào CLK, cần phải gửi số chia tới thanh ghi của bộ đếm đó Nói cách khác, mặc dầu cả 3
bộ đếm đều dùng chung một thanh ghi, song các thanh ghi lưu số chia đều riêng cho từng bộ đếm - như giới thiệu ở ví dụ 6.3
Ví dụ 6.3
Sử dụng các địa chỉ cổng ở ví dụ 6.1, lập trình cho bộ đếm 1 chia CLK1 cho 10.000 tạo ra xung vuông chế độ 3 Hãy sử dụng tuỳ chọn BCD ở byte điều khiển
Giải:
MOV AL,77H ;bộ đếm 1, chế độ 3, BCD
OUT 97H,AL ;gửi đến thanh ghi điều khiển
SUB AL,AL ;AL=0 nạp số chia là 10000
OUT 95H,AL ;gửi byte thấp
Trang 7OUT 95H,AL ;và sau đó gửi byte cao đến bộ đếm 1
Nếu sử dụng tuỳ chọn thập phân (D0=1) và lập trình cho bộ đếm với số chia là 9999, thì dĩ nhiên tần số vào được chia cho giá trị đó Tuy nhiên, nếu số chia là 10.000 thì cần chuyển 0 vào cả 2 byte thấp và cao, như giới thiệu ở ví dụ 5.3
Nếu sử dụng tuỳ chọn nhị phân (D0=0), chúng ta có thể lập trình cho số chia đến 65.536 Để tạo được số chia là 65536, phải nạp 0 vào byte thấp và byte
cao của số chia
6.2 Nối ghép vμ lập trình cho 8253/54
Máy tính IBM PC sử dụng chip 74LS138 để mã hoá địa chỉ chân CS của
8253 như giới thiệu ở hình 6.4 Các địa chỉ cổng được chọn như bảng 6.2, trong
đó giả thiết x là 0 Chương 4 đã trình bày chi tiết việc chọn lựa các cổng
Bảng 6.2 Xác định địa chỉ cổng của 8253/54 ở máy tính PC
A
B
C Y2 G2B G2A
A5 A6 A7 A8 A9 AEN
LS138
CS A0 A1
8253
Trang 8Cả ba đồng hồ của 8253 là CLK0, CLK1 và CLK2 đều được nối tới một tần
số không đổi là 1,1931817 MHz Tần số này có nguồn gốc từ chân PCLK của chip 8284 Như trình bày ở chương 1, PCLK có tần số là 2,3863633 MHz Tần
số này cần được chia đôi vì tần số vào cực đại cho phép CLK của 8253 là 2 MHz Do đó người ta sử dụng mạch chia đôi là D 74LS175 Tín hiệu ra của mạch D được đưa tới các chân CLK của 8253 (xem hình 7.5) GATE0 và GATE1 được nối tới mức cao (5 V) cho phép mở bộ đếm 0 và bộ đếm 1 tương ứng, và như vậy hai bộ đếm này được mở liên tục GATE2 của bộ đếm 2 có thể cho phép mở hoặc cấm nhờ đường PB0 cổng B của 8253 Như vậy, tần số vào ở mỗi bộ định thời là được biết, việc lập trình và ứng dụng từng bộ đếm đã được làm rõ
* Sử dụng bộ đếm 0
CLK0 của bộ đếm 0 có tần số 1,193 MHz và GATE0 luôn được đặt ở mức cao, OUT0 của bộ đếm 0 được nối đến IRQ0 (ngắt có mức ưu tiên cao nhất) của bộ điều khiển ngắt 8259 để cung cấp ngày tháng năm (và dĩ nhiên cùng các dịch vụ khác) Câu hỏi tiếp theo là: IRQ0 được kích hoạt với tần số là bao nhiêu? IRQ0 được kích hoạt 18,2 lần trong một giây, hay nói cách khác - với tần số ở đầu ra OUT0 là 18,2 Hz Tần số CLK0 là 1,193 MHz còn tần số ra là
+5v
+5v
1.19 M Hz
(Chia 2) 74LS175
RESET
OUT0
OUT1
OUT2+5
CLK0 GATE0 8253CLK1
GATE1 CLK2 GATE2
D CIK
Pr CLR 74LS74
18.2 Hz
đến IRQ0 của 8259
DREQ của DMA
8237
đến cassette
đến PC5 của 8255
Trang 918,2 Hz, như vậy bộ đếm cần được lập trình để được số chia bằng 65.536 Sóng
có dạng xung vuông (8253 ở chế độ 3) Người ta sử dụng sườn dương của xung vuông để kích phát IR0 nhằm tránh nhầm lẫn với trường hợp ngắt nhiều lần Xem hình 6.3 và với những thông tin nêu trên, có thể tính được từ điều khiển như sau:
D0=0 cho trường hợp số chia là nhị phân hoặc hexa Bộ đếm thực hiện đếm
lùi sau mỗi xung vào cho đến khi đạt đến 0 rồi sau đó giá trị ban đầu lại được nạp lại Do đó để chia tần số vào cho 65536, giá trị 0 được nạp cho cả byte thấp
MOV AL,36H ;từ điều khiển
OUT 43H,AL ;đến thanh ghi điều khiển của 8253
MOV AL,00 ;LSB và MSB của bộ chia
OUT 40H,AL ;LSB tới bộ đếm 0
OUT 40H,AL ;MSB tới bộ đếm 0
Nên lưu ý là IR0 không chỉ cung cấp ngày tháng năm IR0 có thể hỗ trợ BIOS để kiểm tra trạng thái tắt mở của động cơ ổ đĩa mềm, hoặc giúp người dùng viết các chương trình ứng dụng Với tần số 18,2 Hz (hay cứ mỗi 54,94 ms), BIOS sẽ kích hoạt ngắt này bằng cách nhảy tới INT 1CH của bảng vector ngắt Người dùng cũng có thể định nghĩa CS:IP của chương trình để trỏ tới INT 1CH Nếu người dùng không sử dụng ngắt này, quyền điều khiển sẽ tự động trả
về BIOS
* Sử dụng bộ đếm 1
ở bộ đếm 1, CLK1 được nối đến tần số 1,193 MHz còn GATE được nối trực tiếp đến nguồn 5 V Đầu ra OUT1 tạo ra xung tuần hoàn cần cho làm tươi
bộ nhớ DRAM Quá trình làm tươi từng ô nhớ được thực hiện tối thiểu 15 μs
ở máy tính IBM PC/XT nhiệm vụ làm tươi DRAM là do DMA 8237 đảm nhiệm Chip này sử dụng bộ đếm 1 của 8253 định kỳ thông báo cho DMA về thời gian làm tươi Để thực hiện nhiệm vụ này, OUT1 cung cấp cho DMA xung
Trang 10rộng khoảng 15 μs (hay tần số 66,278 Hz) Nghĩa là, bộ đếm 1 phải chia tần số 1,19318 MHz cho 18 (1,19318 MHz : 18 = 66,278 Hz) Câu hỏi đặt ra là tại sao xung rộng 15 μs? Vì phải làm tươi 128 hàng của các DRAM 64Kbit và 256 Kbit và nếu cứ 15 μs được làm tươi một lần thì chu kỳ làm tươi sẽ là 15 μs x
128 = 1,92 ms (đây là thời gian làm tươi chấp nhận được vì yêu cầu không vượt quá 2 ms) Căn cứ vào hình 6.3, byte điều khiển sẽ như sau:
D0=0 đối với giá trị nhị phân
D3D2D1=010, dạng xung ra ở chế độ 2 ở chế độ này, OUT1 ở mức cao
trong thời gian 18 xung và xuống mức thấp trong 1 xung Quá trình này cứ thế
được lặp lại
D5D4=01 chỉ cần LSB vì byte này nhỏ hơn FF CLK1 được chia cho 18; do
đó, 18 ghi vào LSB là đủ, không cần sử dụng MSB
D7D6=01 chọn bộ đếm 1
Tóm lại từ điều khiển sẽ như sau:
D7 D0
01010100 = 54H
Chương trình bộ đếm 1 của 8253 trong BIOS IBM (với một số thay đổi cho
dễ hiểu) như sau:
MOV AL,54H ;từ điều khiển
OUT 43H,AL ;đến thanh ghi điều khiển
MOV AL,18 ;số chia 18 (hệ thập phân)
OUT 41H,AL ;đến bộ đếm 1
* Sử dụng bộ đếm 2
Đầu ra của bộ đếm 2 được nối đến 2 thiết bị khác nhau: loa và chân PC5 của 8255 Trong các máy IBM PC/XT trước đây, chân này còn được nối tới cassette Tuy nhiên tuỳ chọn này đã từ lâu không còn được sử dụng Cũng cần lưu ý là bộ đếm 2 trong IBM PC được dùng để phát nhạc, do vậy những ai quan tâm có thể tìm hiểu tiếp ở phần sau
* Sử dụng bộ định thời 2 để tạo âm thanh ở loa
Trong máy tính IBM PC, CLK2 được nối với tần số 1,19318 MHz và GATE2 được lập trình qua PB0 của cổng 61H (cổng B) BIOS dùng bộ định thời 2 để tạo tiếng bíp, tuy nhiên bạn có thể thay đổi để có thể chơi các nốt nhạc - như trình bày ở phần tiếp theo Tiếng bíp có tần số 896 Hz của chế độ 3 (xung vuông) Chia tần số vào 1,19318 MHz cho 896 Hz ta được 1331 (0533 hex) là giá trị được nạp vào bộ đếm 2 Như vậy, ta có từ điều khiển như sau:
Trang 11MOV AL,10110110B ;đặt TIM 2, LSB, MSB, nhị phân
OUT TIMER+3,AL ;ghi vào thanh ghi chế độ
MOV AX,533H ;số chia ứng với 896 Hz
OUT TIMER+2,AL ;ghi TIMER 2 CNT - LSB
Do đó, khi PB1 của cổng 61H ở mức cao, nó cho phép đưa OUT2 ra loa Sau
đây là đoạn chương trình bật loa kêu bíp (chương trình trong BIOS)
IN AL,61H ;nhận các thiết lập của cổng B
MOV AH,AL ;chuyển sang AH để cất
OR AL,00000011B ;thiết lập PB0=1 và PB1=1
OUT 61H,AL ;bật loa kêu
{kêu bao lâu do đoạn này xác định}
MOV AL,AH ;trở lại thiết lập ban đầu của cổng B
OUT 61H,AL ;tắt loa
Trang 12Thời gian kéo dài của nốt nhạc sẽ ứng với thời gian trễ do bộ vi xử lý 80x86 của máy tính tạo ra
* Tạo thời gian trễ ở các máy PC 80x86
Rất nhiều các ứng dụng cần đến thời gian trễ Do việc tạo thời gian trễ trong các máy 8088/86 khác với các máy 80286, 386, 486 và Pentium nên chúng ta sẽ tìm hiểu riêng
* Tạo trễ trong PC/XT 8088/86, PS/2 và tương thích
Chương trình con để tạo thời gian trễ là:
AGAIN: LOOP AGAIN
Đối với CPU 8088/86, lệnh LOOP thực hiện mất 17 chu kỳ đồng hồ; do đó thời gian trễ sẽ xấp xỉ N x T chu kỳ x 17 Ví dụ, nếu CX=28000 và tần số hệ thống là 4,7 MHz (đối với PC/XT ban đầu T=210 ns), thì thời gian trễ sẽ khoảng 28000 x 210 ns x 17 ≈ 100 ms Nói thời gian trễ chỉ xấp xỉ vì CPU vẫn
"tạm ngưng" mỗi khi cho phép DMA làm tươi bộ nhớ Nói cách khác, thời gian trễ thực tế có khác 100 ms chút ít Chương trình của BIOS PC/XT, do IBM viết
đã sử dụng phương pháp trên để tạo trễ cho âm bíp như sau:
Với CX=65536, “LOOP G7” cho độ trễ 250 ms (210 ns x 65536 x 17 =
234 ms), chiếm thời gian đáng kể để làm tươi bộ nhớ hệ thống BL chứa thời gian trễ 250 ms Nếu tần số công tác 8088/86 là 8 MHz (như trong IBM PS/2 25), khi đó T = 125 ns (1/8 MHz = 125 ns) thì thời gian trễ sẽ ngắn hơn nhiều
Điều đó có nghĩa là độ trễ không chỉ phụ thuộc vào tần số mà còn phụ thuộc vào CPU, vì trong 80286 lệnh LOOP chỉ mất 8 chu kỳ đồng hồ (chứ không phải 17 chu kỳ đồng hồ như trong CPU 8088/86) Tương tự, lệnh LOOP sẽ là
11 và 7 chu kỳ đồng hồ trong CPU 386 và 486 tương ứng Đây là lý do cho thấy từ các máy tính PC/AT trở đi (80286, 80386, 80486, Pentium ), IBM sử dụng mạch tạo trễ riêng với thời gian trễ không lệ thuộc vào cả tần số lẫn CPU
* Thời gian trễ trong IBM PC 80x86 (từ 286 về sau)
Phương pháp tạo độ trễ cố định bằng phần cứng được thực hiện đầu tiên ở IBM PC/AT và sau đó ở tất cả các máy tính 286, 386, 486 Pentium và tương