CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN
VÀO RA DỮ LIỆU
Mục lục
1. GIỚI THIỆU CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO/RA DỮ LIỆU.
2. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP QUÉT VÒNG.
3. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP NGẮT.
Nội dung
CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO RA DỮ LIỆU
1. GIỚI THIỆU CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO/RA DỮ LIỆU.
Như đã biết hệ thống CPU bao gồm 3 phần chính : CPU, bộ nhớ và vào ra. Trong đó
CPU đóng vai trò là nơi chỉ đạo tất cả các hoạt động của các nơi còn lại. Đối với bộ nhớ
chúng có tốc độ hoạt động khá nhanh, có thể đáp ứng gần như tức thời khi CPU truy
cập, mặt khác bộ nhớ sử dụng lưu trữ các hằng và biến nên khi cần chúng sẽ được truy
xuất bằng một lệnh truyền dữ liệu, khi đó dữ liệu đã có sẵn trong bộ nhớ mà không
phải chờ đáp ứng từ bên ngoài. Còn đối với vào ra thông thường có tốc độ đáp ứng
chậm, mặt khác đôi khi chúng còn phải chờ tác động từ bên ngoài (ví dụ như khi đọc
bàn phím CPU phải chờ cho người sử dụng nhấn phím …). Khi hệ thống CPU có nhiều
thiết bị vào ra có thể thực hiện ba giải pháp quản lý thiết bị bao gồm:
- Vào ra dữ liệu bằng phương pháp quét vòng (polling).
- Vào ra dữ liệu bằng ngắt (interrupt).
- Vào ra dữ liệu bằng phương pháp thâm nhập trực tiếp bộ nhớ ( DMA -Direct
Memory Access).
Với phương pháp quét vòng CPU sẽ hoạt động theo chế độ phân chia thời gian, nó sẽ
kiểm tra lần lượt từng thiết bị và thực hiện chương trình phục vụ khi có thiết bị hoạt
động. Với phương pháp ngắt thiết bị hoạt động sẽ thông báo để CPU biết phục vụ nó.
Còn với phương pháp vào ra bằng DMA, CPU sẽ được yêu cầu ngưng hoạt động để
thiết bị vào ra (thường là ổ đĩa) truyền dữ liệu theo từng khối với bộ nhớ.
Mỗi phương pháp điều khiển vào ra dữ liệu nêu trên có các đặc điểm khác nhau và sẽ
được ứng dụng trong các trường hợp khác nhau, chúng sẽ được mô tả cụ thể trong các
mục kế tiếp của chương.
2. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP QUÉT VÒNG.
Như đã nói trong phương pháp quét vòng CPU sẽ kiểm tra lần lượt từng thiết bị có
trong hệ thống của nó. Đối với các thiết bị luôn sẵn sàng hoạt động thiết bị có thể truyền
dữ liệu một cách hoàn toàn thụ động tới vào ra, CPU sẽ mở cửa vào ra để đọc dữ liệu
hoặc ghi dữ liệu tới thiết bị khi chúng tới vòng phục vụ. Lúc này các bộ vào ra chỉ đóng
vai trò là các cổng ngăn cách giữa Bus hệ thống và thiết bị, để các hoạt động của thiết bị
không ảnh hưởng tới hệ thống trong khi CPU phục vụ các thiết bị khác. Ví dụ như trong
hệ thống đo nhiệt độ và hiển thị lên LED 7 đoạn: cứ tới vòng phục vụ CPU sẽ đọc được
giá trị số tương ứng với nhiệt độ đầu dò luôn sẵn sàng tại ngõ ra bộ biến đổi A/D, và sau
đó sẽ cung cấp ra LED 7 đoạn để hiển thị. Và nếu vòng phục vụ đủ ngắn, có thể luôn
thấy nhiệt độ cần đo hiển thị trên LED trong khi các thiết bị khác của hệ thống vẫn được
phục vụ. Tuy nhiên trong thực tế không phải tất cả các thiết bị làm việc với CPU đều
luôn ở trạng thái sẵn sàng như trên. Nên rất dễ xảy ra khả năng tới vòng phục vụ mà
thiết bị chưa sẵn sàng truyền dữ liệu với CPU. Để chắc chắn truyền được dữ liệu với
thiết bị trong phương pháp thăm dò khi tới vòng phục vụ, trước khi thực hiện việc
truyền dữ liệu CPU sẽ kiểm tra trạng thái của thiết bị bằng cách đọc vào các tín hiệu bắt
tay (Handshake Signal). Ví dụ trên hình 6.1 trình bày mạch giao tiếp vào (Input) có bắt
tay giữa một thiết bị và CPU.
Trên hình 6.1 khi thiết bị vào có dữ liệu truyền cho CPU, nó cung cấp tín hiệu STB để
cài dữ liệu vào bộ cài đồng thời kích cho mạch lật tạo tín hiệu sẵn sàng làm việc mức 1.
Khi tới vòng phục vụ của thiết bị này, trước hết CPU đọc cổng 0 (CS0 = 0) nếu được dữ
liệu với bit D
0
= 1 thì nó hiểu rằng thiết bị này đã sẵn sàng làm việc. Khi CPU đọc cổng
1 (CS1 = 0) để lấy dữ liệu nó sẽ xoá luôn tín hiệu sẵn sàng để chuẩn bị cho lần truyền dữ
liệu tiếp theo.
Trong các hệ thống vi xử lý các mạch vào ra có bắt tay thông thường được thực hiện
bằng các bộ vào ra có lập trình, việc thiết kế mạch sẽ đơn giản hơn rất nhiều vì các mạch
tạo tín hiệu bắt tay được tích hợp ngay trong chip vào ra này. Hình 6.2 trình bày sơ đồ
vào ra có bắt tay sử dụng 8255. Trên sơ đồ, 8255 đóng vai trò giao tiếp với một thiết bị
vào và một thiết bị ra. Cổng A của 8255 dành cho việc truyền dữ liệu vào, PC
4
, PC
5
sử
dụng làm các thiết bị bắt tay vào. Khi thiết bị vào có dữ liệu truyền, trước hết nó kiểm
tra tín hiệu ACK, nếu tín hiệu này tích cực thì dữ liệu truyền trước đó chưa được CPU
đọc vào, nếu ACK không tích cực thiết bị sẽ cung cấp tín hiệu STB để cài dữ liệu vào
PA của 8255, 8255 sẽ nhận dữ liệu và tác động ACK. Tín hiệu STB sẽ được giữ nguyên
cho đến khi ACK hết tích cực, do đó CPU có thể kiểm tra tín hiệu này để xác định đã có
dữ liệu sẵn sàng chưa. Khi CPU đọc dữ liệu từ cổng A, STB và ACK sẽ được xoá. Một
giao tiếp gần tương tự sẽ sử dụng cho thiết bị ra.
3. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP NGẮT.
i. Khái quát.
Với phương pháp quét vòng dù chỉ kết nối thụ động theo dữ liệu hay có bắt tay, CPU
đều đóng vai trò chủ động nó đi quét thường xuyên các thiết bị xem có cần phục vụ hay
Thiết bị
vào
STB
Mạch cài
G
Mạch
đệm
OC
pr
Q D
clk
clr
CS1
CS1
CS0
Data Bus
D
0
–D
7
Data Bus
D
0
Hình 6.1: Mạch giao tiếp vào có bắt tay.
+5V
STB Thiết bị vào
ACK
D
0
–D
7
STB Thiết bị ra
ACK
D
0
–D
7
8255
PC4
PC5
PA
0
-PA
7
PC1
PC2
CPU
D
0
-D
7
Hình 6.2: Vào ra có bắt tay sử dụng 8255
PB
0
-PB
7
không. Giải pháp này sẽ làm lẵng phí thời gian của CPU khi các thiết bị không có nhu
cầu phục vụ thường xuyên, mà CPU vẫn phải thực hiện chương trình kiểm tra. Có một
giải pháp vào ra khác tránh được nhược điểm trên, đó là cơ chế ngắt. Trong giải pháp
này các thiết bị có yêu cầu phục vụ sẽ nhắc chừng CPU bằng cách cung cấp tín hiệu từ
ngoài, lúc này CPU sẽ tạm ngưng công việc nó đang thực hiện để phục vụ thiết bị, khi
thiết bị được phục vụ xong CPU sẽ quay về với công việc mà nó đang thực hiện dở.
Hầu hết các họ vi xử lý đều cho phép ngưng chương trình bình thường đang thực hiện
để chuyển qua một chương trình tại vị trí đặc biệt, bằng một số tín hiệu cung cấp từ
bên ngoài hoặc một số lệnh đặc biệt trong chương trình. Việc chuyển điều khiển này
giống như cơ chế gọi chương trình con, hoạt động được chuyển từ chương trình chính
qua chương trình con phục vụ cho ngắt.
Thông thường các CPU có hai tín hiệu để nhận các tín hiệu yêu cầu ngắt là: ngắt
không che (NMI - Non Mask able Interrupt), và ngắt có thể che được bằng phần mềm
(INT - Interrupt). Tín hiệu yêu cầu ngắt NMI có độ ưu tiên cao hơn INT, và khi nhận
được tín hiệu NMI thì CPU bắt buộc phải chuyển điều khiển qua chương trình ngắt. Còn
khi nhận được tín hiệu INT thì CPU còn đi xét cờ ngắt, nếu cờ ngắt đã được lập nó sẽ
chuyển điều khiển qua chương trình ngắt, còn nếu cờ ngắt chưa được lập thì yêu cầu
ngắt sẽ không được phục vụ. Cờ ngắt có thể được lập hay xóa bằng lệnh hợp ngữ trong
chương trình, với các công việc quan trọng không cho phép tạm ngưng chúng ta có thể
cấm ngắt bằng lệnh xoá cờ ngắt ở đầu chương trình.
Để phục vụ ngắt được nhiều thiết bị, trong các hệ thống vi xử lý thường sử dụng bộ
điều khiển ngắt. Các tín hiệu yêu cầu sẽ được đưa tới bộ điều khiển ngắt và tùy theo
thứ tự ưu tiên sẽ gửi tới CPU như hình 6.3.
Nếu chỉ có một yêu cầu ngắt nó sẽ được chuyển ngay tới CPU, nếu có nhiều yêu cầu
ngắt xảy ra đồng thời thì yêu cầu nào có độ ưu tiên cao hơn sẽ được bộ điều khiển ngắt
gửi tới CPU phục vụ trước. Độ ưu tiên sẽ được lập trình khi khởi động bộ điều khiển
ngắt.
ii. Ví dụ về cơ chế ngắt của CPU 8086/8088 và Z80.
• Cơ chế ngắt của CPU 8086/8088.
Khái quát:
Một yêu cầu ngắt trong hệ thống 8086/8088 có thể cung cấp từ một trong 3 nguồn sau:
- Nguồn thứ nhất cung cấp từ bên ngoài qua các ngõ vào INTR (Interrupt Request),
hoặc NMI, chúng được gọi là các ngắt cứng.
CPU Bộ điều khiển
ngắt
INTR
INTA
Các yêu cầu
ngắt
Hình 6.3: Cung cấp các yêu cầu ngắt cho CPU thông qua bộ điều khiển ngắt.
- Nguồn thứ 2 thực hiện bằng một lệnh ngắt trong chương trình (INT), trường hợp này
được gọi là ngắt mềm.
- Nguồn thứ ba xuất phát từ một số điều kiện lỗi trong một số lệnh mà chương trình
thực hiện. Ví dụ như khi thực hiện lệnh chia cho 0, 8086/8088 sẽ tự động ngắt chương
trình đang thực hiện. Trường hợp này được gọi là ngắt ngoại lệ (exception).
Tại cuối mỗi chu kỳ thực hiện lệnh 8086/8088 sẽ kiểm tra các yêu cầu ngắt. Khi có yêu
cầu 8086 sẽ đáp ứng bằng các bước sau:
- Nạp thanh ghi cờ vào đỉnh ngăn xếp và giảm thanh ghi con trỏ ngăn xếp đi 2.
- Không cho phép ngắt INT bằng cách xóa cờ ngắt IF trong thanh ghi cờ.
- Xóa cờ bẫy TF trong thanh ghi cờ.
- Nạp thanh ghi đoạn lệnh CS vào đỉnh ngăn xếp và giảm con trỏ ngăn xếp đi 2.
- Nạp thanh ghi con trỏ lệnh IP vào đỉnh ngăn xếp và giảm con trỏ ngăn xếp đi 2.
- Nhảy xa tới chương trình con phục vụ ngắt tương ứng theo yêu cầu.
Quá trình trên được tổng kết trong hình 6.4. Như trên hình vẽ, 8086 cất thanh ghi cờ
vào đỉnh ngăn xếp, không cho phép ngõ vào yêu cầu ngắt INTR và chức năng chạy
từng bước, rồi thực hiện lệnh gọi xa tới chương trình phục vụ ngắt. Lệnh IRET tại cuối
chương trình phục vụ ngắt sẽ chuyển điều khiển quay về chương trình chính.
Như đã biết khi thực hiện lệnh gọi xa 8086/8088 sẽ lập giá trị mới cho thanh ghi đoạn
CS và thanh ghi con trỏ lệnh IP. Để thực hiện việc gọi xa gián tiếp, 8086 lấy giá trị mới
cho CS và IP từ 4 ô nhớ. Tương tự như vậy khi đáp ứng ngắt 8086/8088 cũng lấy địa
chỉ chương trình ngắt từ 4 ô nhớ liên tiếp. Trong hệ thống 8086/8088, 1KB bộ nhớ từ
địa chỉ 00000H tới địa chỉ 003FFH được dành riêng để chứa các địa chỉ của các chương
trình ngắt được gọi là bảng vector ngắt, hay bảng con trỏ ngắt. Mỗi địa chỉ sẽ chứa
trong 4 ô nhớ, nên bảng này sẽ chứa được địa chỉ của 256 chương trình ngắt. Hình 6.5
trình bày bảng vector ngắt. Chú ý là giá trị nạp cho thanh ghi con trỏ lệnh (IP) luôn đặt
PUSH FLAGS
CLEAR IF
CLEAR TF
PUSH CS
PUSH IP
Nhảy tới chương
trình ngắt
POP IP
POP CS
POP FLAGS
Chương trình chính
Chương trình phục vụ ngắt
PUSH các thanh ghi
POP các thanh ghi
IRET
Hình 6.4: Qui trình phục vụ ngắt của 8086/8088.
tại địa chỉ thấp, còn cho thanh ghi đoạn lệnh (CS) nằm ở địa chỉ cao. Mỗi từ kép cho
một vector ngắt được nhận dạng bằng một số trong khoảng từ 0 tới 255. Nó được gọi là
số hiệu ngắt hay số kiểu ngắt.
Trong bảng 5 vector ngắt đầu tiên dành cho các ngắt đặc biệt, các vector từ 5 tới 31 dự
phòng cho các thế hệ vi xử lý sau của Intel, các vector từ 32 tới 255 đã được sử dụng
cho các ngắt cứng và các ngắt mềm. Do mỗi vector ngắt gồm 4 byte, vì thế 8086/8088
sẽ xác định địa chỉ của các vector ngắt trong bảng bằng cách nhân số hiệu ngắt với 4.
Người sử dụng cũng có thể thay thế địa chỉ chương trình của mình vào bảng vector
ngắt, lúc này mỗi lần xảy ra ngắt điều khiển sẽ được chuyển tới chương trình của người
sử dụng thay vì chuyển tới chương trình phục vụ ngắt cũ.
Các kiểu ngắt của 8086/8088.
- Ngắt kiểu 0 : chia cho 0.
8086/8088 sẽ tự động thực hiện ngắt kiểu 0 khi kết quả các phép chia vượt quá khả
năng chứa trong thanh ghi đích. Khi đó các cờ, CS, IP sẽ được nạp vào đỉnh ngăn xếp,
IF và TF sẽ bị xóa. Sau đó CS và IP sẽ được nạp giá trị mới từ các địa chỉ 00002Hvà
00000H trong bảng vector ngắt.
Vì ngắt 0 xảy ra một cách tự động không thể cấm được, do đó để tránh ngắt này trong
chương trình phải kiểm tra để chắc rằng số chia khác 0. Hoặc viết một chương trình
phục vụ ngắt mới, sau đó đổi vector ngắt hiện có trong bảng, nhưng khi đó chương trình
sẽ khá phức tạp.
- Ngắt kiểu 1: Chạy từng bước.
Ngắt này sẽ thực hiện chương trình theo từng lệnh, khi này có thể xem nội dung của các
ô nhớ và các thanh ghi để kiểm tra kết quả của lệnh. Khi lệnh đã thực hiện đúng có thể
cho phép CPU thực hiện lệnh tiếp theo. Nói cách khác trong chế độ chạy từng bước
Con trỏ ngắt kiểu 255
Con trỏ ngắt kiểu 33
Con trỏ ngắt kiểu 32
Con trỏ ngắt kiểu 31 (dự trữ)
Con trỏ ngắt kiểu 5 (dự trữ)
Con trỏ ngắt kiểu 4 (tràn)
Con trỏ ngắt kiểu 3 (1byte lệnh INT)
Con trỏ ngắt kiểu 2 (ngắt không che)
Con trỏ ngắt kiểu 1 (chạy từng bước)
Con trỏ ngắt kiểu 0 (lỗi chia)
03FFH
03FCH
084H
080H
014H
010H
00CH
008H
004H
000H
244 vector
ngắt đã sử
dụng
27 vector
ngắt dự
phòng
5 vector
ngắt dành
riêng
Hình 6.5: Bảng vector ngắt trong hệ thống 8086/8088.
8086 ngưng lại sau khi chạy xong mỗi lệnh, và chờ quyết định tiếp theo từ người sử
dụng. Nhờ việc lập xóa thanh ghi cờ nên thủ tục chạy từng bước thực hiện khá dễ dàng
trong hệ thống 8086.
Khi cờ bẫy được lập, 8086 sẽ tự động thực hiện ngắt 1 sau khi thực hiện xong một
lệnh, với vector ngắt được lấy trong bảng vector ngắt tại các địa chỉ từ 00004H tới
00008H. Khi đó cờ bẫy sẽ được lập các thanh ghi được lưu vào đỉnh ngăn xếp, chương
trình con phục vụ cho ngắt 1 sẽ tùy thuộc theo hệ thống. Chú ý là không có lệnh thiết lập
hay xóa cờ bẫy, muốn thực hiện công việc trên cần nạp thanh ghi cờ vào đỉnh ngăn xếp
sau đó sử dụng một lệnh xử lý dữ liệu để lập bit, và cuối cùng phục hồi lại thanh ghi cờ
từ đỉnh ngăn xếp. Trong quá trình thực hiện chương trình phục vụ ngắt cờ bẫy sẽ được
xóa.
- Ngắt kiểu 2: Phục vụ ngắt không che.
8086/8088 sẽ tự động thực hiện ngắt 2 khi nhận được một cạnh lên tại ngõ vào NMI.
Ngắt này luôn được thực hiện mà không bị che bởi phần mềm, vì thế ngắt này thường
được sử dụng cho các công việc quan trọng. Ví dụ có thể sử dụng ngắt 2 để backup
chương trình khi mất nguồn.
- Ngắt kiểu 3 : Thiết lập điểm dừng trong chương trình.
Ngắt này được sử dụng cho việc gỡ rối một chương trình. Khi chèn vào chương trình
một điểm dừng hệ thống sẽ thực hiện các lệnh của chương trình cho tới điểm dừng rồi
chuyển điều khiển qua thủ tục ngắt 3. Tùy theo từng hệ thống, thủ tục ngắt 3 có thể
gửi nội dung các thanh ghi, hoặc các ô nhớ lên màn hình rồi chờ cho tới khi nhận được
lệnh kế tiếp từ người sử dụng.
- Ngắt kiểu 4 : Ngắt tràn.
Cờ tràn OF của 8086 sẽ tự động được thiết lập sau khi thực hiện các phép tính số học
mà kết quả có sự tràn bit 1 qua bit có trọng số lớn nhất. Ví dụ khi cộng 01101100 (108
thập phân) với 01010001 (81 thập phân) kết quả sẽ là 10111101 (189 thập phân). Kết
quả này chỉ đúng đối với phép cộng số nhị phân không dấu, mà không đúng đối với số
nhị phân có dấu. Đối với số nhị phân có dấu, bit cao nhất bằng 1 sẽ chỉ thị số âm và
giá trị sẽ là bù 2, như vậy kết quả ở trên sẽ là -67 thập phân. Có hai cách để phát hiện
và đáp ứng một lỗi tràn. Cách thứ nhất có thể sử dụng lệnh JO (nhảy khi cờ tràn = 1)
ngay sau các lệnh số học, nếu cờ tràn được thiết lập sau lệnh số học điều khiển chương
trình sẽ được chuyển tới địa chỉ thị trong lệnh JO để có thể xử lý lỗi tràn. Cách thứ hai
là việc phát hiện và đáp ứng một lỗi tràn được đặt vào một ngắt. Trong chương trình sau
các lệnh số học sẽ đặt lệnh INT 0 để chuyển tới chương trình ngắt khi cờ ngắt được lập.
- Các ngắt mềm từ 0 tới 255.
Lệnh INT của 8086/8088 có thể sử dụng để gọi các ngắt mềm từ 0 tới 255. Ngắt được
gọi sẽ chỉ thị bằng số hiệu của nó trong lệnh INT, ví dụ INT 32H sẽ gọi chương trình
ngắt 32H. Địa chỉ chương trình ngắt trong bảng vector ngắt sẽ nằm tại địa chỉ bằng số
hiệu ngắt nhân 4. Lệnh INT có nhiều cách sử dụng, có thể dùng INT 0 để chạy thử
chương trình phục vụ ngắt chia cho 0, mà không cần phải thực hiện lệnh chia cho 0
thực sự, hoặc cũng có thể thử chương trình ngắt NMI bằng lệnh INT 2 mà không cần có
tín hiệu yêu cầu ngắt đưa vào chân NMI.
- Các yêu cầu ngắt kiểu 0 tới 255.
Ngõ vào INTR của 8086 cho phép nhận các tín hiệu yêu cầu ngắt từ bên ngoài để thực
hiện các chương trình ngắt tương ứng với chúng. Khác với ngõ vào NMI, INTR có thể
che được bằng phần mềm. Nếu cờ ngắt IF bị xóa thì các yêu cầu đưa tới INTR sẽ
không được đáp ứng. Cờ ngắt IF có thể thiết lập bằng lệnh STI, và xóa bằng lệnh
CLI. Khi reset cờ ngắt IF sẽ tự động được xóa, như vậy trước khi muốn 8086 đáp ứng
ngắt cần phải lập IF.
Khi chuyển điều khiển qua chương trình ngắt, cờ ngắt cũng tự động được xóa. Điều này
được thực hiện do 2 nguyên nhân sau: nguyên nhân thứ nhất là do nếu không xóa cờ
ngắt thì khi chương trình phục vụ một ngắt này đang thực hiện có thể sẽ có một yêu
cầu ngắt mới, làm điều khiển chương trình sẽ chuyển tiếp tới một chương trình ngắt
mới nữa. Nếu muốn điều đó xảy ra thì chỉ việc thực hiện lệnh lập IF tại đầu chương
trình ngắt. Nguyên nhân thứ hai là nếu không xóa IF thì khi trạng thái mức cao tại ngõ
vào INTR còn được giữ chương trình ngắt sẽ bị gọi lại trong chính nó nhiều lần. Lệnh
IRET tại cuối chương trình ngắt sẽ phục hồi thanh ghi cờ, điều này làm cho cờ ngắt trở
về mức 1 tiếp tục cho phép 8086/8088 đáp ứng ngắt.
Để nhận được nhiều yêu cầu ngắt hệ thống 8086/8088 sử bộ điều khiển ngắt 8259.
8086/8088 sẽ nhận một trong các đường yêu cầu ngắt IR để gửi tới chân yêu cầu ngắt
INTR của 8086. Nếu cờ IF được lập 8086 sẽ trả lời yêu cầu ngắt bằng tín hiệu INTA
(Interrupt Acknowledge), sau đó nó sẽ đọc vào vector ngắt cung cấp từ 8259 qua các
đường dữ liệu thấp D0 tới D7. Vector ngắt chính là số hiệu ngắt được lập trình trước
trong 8259 nó sẽ được nhân với 4 để xác định vị trí chứa địa chỉ chương trình phục vụ
ngắt trong bảng vector ngắt. Khi có đồng thời 2 hoặc nhiều nguồn yêu cầu ngắt, 8086 sẽ
đáp ứng cho ngắt có độ ưu tiên cao nhất, sau đó sẽ tới các ngắt có độ ưu tiên tiếp theo.
Độ ưu tiên của các ngắt cũng được lập trình trước trong 8259.
iii. Cơ chế ngắt của Z80.
- Ngắt có thể che:
Trong hệ thống Z80 ngắt INT sẽ tác động ở cạnh xuống của tín hiệu đưa tới ngõ vào
INT, và cờ ngắt IFF đã được thiết lập bằng lệnh EI. Cờ ngắt cũng bị xóa khi chương
trình ngắt được thực hiện, khi reset, hoặc khi thực hiện lệnh DI. Khi đáp ứng ngắt INT
CPU Z80 có thể hoạt động ở một trong 3 chế độ: Mode 0, Mode 2 và Mode 3 tùy thuộc
vào lệnh khởi tạo chế độ ngắt thực hiện trước khi có tín hiệu yêu cầu ngắt là IM0, IM1
hay IM2.
Mode 0: khi đáp ứng ngắt mode 0 CPU Z80 sẽ yêu cầu thiết bị cung cấp một lệnh vào
BUS dữ liệu, thường là lệnh RST (vì khi này cơ chế cung cấp lệnh sẽ đơn giản do chỉ
có một byte), nhưng cũng có thể là một lệnh gọi chương trình con hoặc một lệnh bất kỳ
nào đó.
Mode 1: khi đáp ứng trong mode này Z80 sẽ nhảy tới địa chỉ 0038H, tại địa chỉ này có
thể là chương trình phục vụ ngắt, cũng có thể chỉ là một lệnh nhảy tới chương trình ngắt.
Cũng có thể sử dụng một lệnh nhảy gián tiếp (ví dụ JP (HL)) để có thể quyết định địa
chỉ chương trình ngắt trước khi có tín hiệu yêu cầu ngắt.
Mode 2 : Mode này là khả năng đáp ứng ngắt mạnh nhất của CPU Z80. Khi khởi động
mode này, CPU sẽ thực hiện chương trình phục vụ ngắt tại địa chỉ chứa trong các ô nhớ
có địa chỉ cung cấp bởi thanh ghi địa chỉ trang ngắt I và thiết bị yêu cầu ngắt. Thanh ghi
I cung cấp 8 bit cao, còn thiết bị yêu cầu ngắt sẽ cung cấp 8 bit thấp của ô nhớ đó. Thực
ra thiết bị chỉ cần cung cấp 7 bit cao, còn bit có trọng số nhỏ nhất (D0) luôn có giá trị là
0, vì giá trị mới trong thanh ghi PC phải được giữ trong hai ô nhớ liên tiếp.
Dựa theo nguyên tắc hoạt động trên, người sử dụng có thể lập một loạt địa chỉ của các
chương trình phục vụ ngắt cho các thiết bị khác nhau tại một vùng nhớ nào đó gọi là
bảng vector ngắt. Khi hệ thống bắt đầu hoạt động có thể nạp địa chỉ trang ngắt bằng lệnh
LD I,A. Mỗi thiết bị sẽ yêu cầu chương trình phục vụ ngắt của mình bằng cách cung
cấp 7 bit địa chỉ còn lại.
Có thể biểu diễn hoạt động của ngắt mode 2 của Z80 trên hình 6.6 :
- Ngắt không che: NMI
Ngắt không che của Z80 sẽ được thực hiện bất chấp giá trị của cờ ngắt IFF, khi đáp
ứng ngắt này cờ ngắt IFF sẽ bị xóa, thanh ghi PC được nạp vào đỉnh ngăn xếp và điều
khiển chương trình sau đó sẽ chuyển qua địa chỉ 0066H. Tương tự như ngắt INT
mode 1, tại địa chỉ này có thể là chương trình phục vụ ngắt cũng có thể chỉ là một lệnh
nhảy tới chương trình phục vụ ngắt.
iv. BỘ ĐIỀU KHIỂN NGẮT 8259.
• Khái quát và nối ghép với hệ thống.
8259 được gọi là bộ điều khiển ngắt ưu tiên, nó nhận các tín hiệu yêu cầu ngắt từ
thiết bị để cung cấp tới CPU theo trình tự ưu tiên. Sơ đồ khối của 8259 được thực hiện
như hình 6.7:
.
.
.
Byte thấp của địa chỉ
chương trình phục vụ ngắt
(UVh)
Byte cao của địa chỉ
chương trình phục vụ ngắt
(XYh)
Chương trình phục vụ
ngắt
000H
UV
XYUVH
Thanh ghi I 7 bit do thiết
bị cung cấp 0
nn
mm
nnmmH
Hình 6.6: Hoạt động của ngắt INT mode 2 của Z80.
DATA BUS
BUFFER
READ/WRITE
LOGIC
CASCADE
BUFFER /
COMPARATOR
CONTROL LOGIC
INTERRUPT MASK REG
(IMR)
PRIORITY
RESOLVER
INTERRUPT
REQUEST
REG
(IRR)
IN
SERVICE
REG
(ISR)
D0 - D7
WR
RD
A0
CS
CAS0
CAS1
CAS2
CP/EN
IR0
IR7
INTA INT
Hình 6.7: Sơ đồ khối bộ điều khiển ngắt 8259.
Trước hết xem xét chức năng của các tín hiệu. Các tín hiệu của 8259 được chia thành 3
nhóm chính:
- Bus dữ liệu D0 - D7 sử dụng để CPU lập trình 8259 hoạt động theo các chế độ
khác nhau, và theo chiều ngược lại sử dụng để 8259 cung cấp vector ngắt tới CPU.
- Các tín hiệu yêu cầu ngắt IR0 - IR7 nhận tín hiệu yêu cầu ngắt từ các thiết bị.
- Các tín hiệu điều khiển bao gồm :
+ RD, WR nhận điều khiển từ CPU để xác định chiều truyền dữ liệu giữa CPU và 8259.
+ A0 xác định các vị trí khác nhau trong 8259 truyền nhận dữ liệu với CPU.
CS chọn mạch: nhận tín hiệu từ giải mã địa chỉ chọn mạch cho phép 8259 được phép
hoạt động.
+ CAS0 - CAS3 (Cascade): tín hiệu sử dụng cho việc ghép tầng 8259.
+ SP/EN: khi 8259 làm việc ở chế độ không có đệm trên bus dữ liệu thì tín hiệu này sử
dụng để chọn 8259 là mạch chủ hay mạch tớ. Còn khi 8259 có đệm thì tín hiệu này đóng
vai trò là tín hiệu cho phép EN để mở cổng đệm dữ liệu tại thời điểm thích hợp.
+ INT sử dụng cung cấp yêu cầu ngắt tới CPU, INTA nhận tín hiệu chấp nhận tín
hiệu yêu cầu ngắt từ CPU.
• Chức năng các thanh ghi bên trong 8259 bao gồm:
- Thanh ghi mặt nạ ngắt (IMR) sử dụng để cho phép (unmask) hoặc không cho phép
(mask) phục vụ các ngõ vào yêu cầu ngắt. Mỗi bit trong thanh ghi này sẽ tương ứng
với một ngõ vào yêu cầu ngắt. Có thể không cho phép một ngõ vào đó bằng cách ghi 0
tới bit tương ứng của nó trong IMR.
- Thanh ghi yêu cầu ngắt (IRR) sẽ giữ lại các yêu cầu ngắt của các ngõ vào. Khi có tín
hiệu yêu cầu ngắt đưa tới ngõ vào nào thì bit tương ứng của nó trong thanh ghi này sẽ
được lập lên 1.
- Thanh ghi phục vụ ngắt (ISR) sẽ lưu trạng thái các ngõ vào yêu cầu ngắt đang được
phục vụ. Bit tương ứng trong thanh ghi sẽ được lập tương ứng với ngõ vào đang được
phục vụ.
- Khối xử lý ưu tiên (Priority resolver) sẽ đóng vai trò quyết định yêu cầu tại ngõ vào
nào được phục vụ, bằng cách xem xét các bit trong các thanh ghi IMR, ISR và IRR.
Ví dụ: giả sử IR2 và IR4 không bị che và có một tín hiệu yêu cầu ngắt đưa tới ngõ vào
IR4. Yêu cầu trên IR4 sẽ lập bit thứ 4 trong thanh ghi IRR lên 1. Trước tiên bộ xử lý ưu
tiên xem bit tương ứng với nó trong thanh ghi IMR, nếu bit này bằng 1 yêu cầu ngắt bị
che và sẽ không được phục vụ. Nếu bằng 0 bộ xử lý ưu tiên sẽ kiểm tra các bit trong
thanh ghi ISR để xem có ngõ vào nào có mức ưu tiên cao hơn đang được phục vụ hay
không. Nếu có một ngõ vào có mức ưu tiên cao hơn đang được phục vụ thì bộ xử lý
ưu tiên sẽ không tạo ra tác động nào cả. Ngược lại nếu không có yêu cầu ngắt ưu tiên
cao hơn đang được phục vụ thì bộ xử lý ưu tiên sẽ chuyển mạch cho tín hiệu yêu cầu
ngắt gửi tới CPU. Khi CPU đáp ứng bằng tín hiệu trả lời INTA, 8259 sẽ gửi số hiệu
ngắt đã được lập trình từ trước tới CPU theo Bus dữ liệu.
• Lập trình cho 8259.
Để 8259 có thể hoạt động được, thì sau khi cấp nguồn nó phải được lập trình từ 2 tới
4 từ điều khiển ICW (Input Control Word), và sau đó là các từ điều khiển OCW (Output
Control Word). Các từ điều khiển sẽ định nghĩa các chế độ hoạt động cụ thể cho 8259,
chúng được định nghĩa như sau:
Các từ điều khiển ICW:
• ICW1
Bit D0 (IC4) xác định 8259 được nối với họ vi xử lý nào. Khi nối với hệ thống 16/32
bit 8086/8088 thì nhất thiết phải cần ICW4 (IC4=1), còn đối với hệ thống 8 bit
8080/8085 thì IC4=0 và như vậy các bit của ICW4 sẽ bị xóa về 0. Bit D1 (SNGL)
định nghĩa 8259 hoạt động trong chế độ chỉ có 1 mạch chủ hay có thêm các mạch tớ. D2
(ADI) định nghĩa khoảng cách địa chỉ của bảng vector ngắt. D3 (LITM) định nghĩa
ngõ vào yêu cầu ngắt tác động mức hay cạnh. Các bit còn lại là các bit địa chỉ
A7A6A5 trong hệ thống 8080/85, đối với các hệ thống 16/32 bit chúng không xác
định.
ICW1:
ICW2:
ICW2 là 8 bit địa chỉ cao của vector ngắt (AD15 - AD8) trong hệ thống 8080/85, là
vector ngắt (T7- T3)trong hệ thống 8086/88.
ICW3 mạch chủ:
T0T1T2T3T4T5T6T7
A0=1
IC4SNGLADILTIM1A5A6A7
A0=0
1: Cần ICW4
0: bỏ ICW4
Address Interval:
K/c giữa các vector ngắt
1: 4 byte (80x86/88)
0: 8 byte (8080/85)
Single:
1: chỉ có 1 mạch 8259
0: nhiều mạch 8259
Là địa chỉ vector đối với 8080/85
Không xác định với hệ 16/32 bit
Level Trigger Mode: Chế độ của xung yêu cầu ngắt
1: theo mức dương
0: theo cạnh lên
S0S1S2S3S4S5S6S7
A0=1
1: ngõ vào tương ứng có 1 mạch tớ
0: không có mạch tớ ở ngõ vào
ICW3 cho mạch tớ:
• ICW2
Từ điều khiển này cho phép chọn kiểu ngắt (số hiệu ngắt) ứng với các bit T7-T3 trong
hệ thống 8086/88, khi đó các bit còn lại luôn được gán giá trị 0 ứng với ngõ vào IR0.
Các vector ngắt của các ngõ vào tiếp theo sẽ lần lượt tăng lên 1. Ví dụ nếu ICW2 = 40H
thì các vector ngắt sẽ lần lượt mang số hiệu từ 40H tới 47H. Trong các hệ thống
8080/85 thì ICW2 sẽ cung cấp các bit địa chỉ cao của địa chỉ vector ngắt.
• ICW3
Từ điều khiển này chỉ dùng tới khi bit SNGL trong ICW1 = 0 tức là trong hệ thống có
nhiều 8259 nối tầng với nhau. Như vậy sẽ tồn tại hai loại ICW3: một cho mạch chủ
(master) và 1 cho mạch tớ (slave). Các bit ICW3 của 8259 chủ sử dụng để chỉ định ngõ
vào nào có ghép tầng (cascade). Trong 8259 tớ chỉ sử dụng 3 bit thấp để xác định nó
được nối tới ngõ vào nào của 8259 chủ.
ICW4
• ICW4
Từ điều khiển này chỉ dùng đến khi trong từ điều khiển ICW1 có bit D0 =1. Bit µPM
cung cấp khả năng chọn vi xử lý làm việc với 8259.
Bit SFNM = 1 cho phép chọn chế độ ưu tiên cố định đặc biệt. Trong chế độ này các
yêu cầu ngắt với mức ưu tiên cao nhất hiện thời từ một mạch tớ làm việc theo kiểu nối
tầng sẽ được mạch chủ nhận biết ngay cả khi mạch chủ còn đang phục vụ một yêu cầu
ngắt ở mạch tớ khác nhưng với mức ưu tiên thấp hơn. Sau khi các yêu cầu ngắt được
phục vụ xong thì chương trình phục vụ ngắt phải có lệnh kết thúc yêu cầu ngắt EOI
đặt trước lệnh IRET đưa đến cho mạch 8259 chủ.
Khi SFNM = 0 thì chọn chế độ ưu tiên cố định ( mức ưu tiên giảm từ IR0 tới IR7).
Nếu 8259 không dùng tới ICW4 thì chế độ này cũng được coi như mặc định. Trong
chế độ này nếu chỉ có một yêu cầu ngắt đang được phục vụ thì các yêu cầu có mức ưu
ID0ID1ID200000A0=1
000 cho mạch tớ tại ngõ vào IR0 …
111 cho mạch tớ tại ngõ vào IR7.
µPM
AEOIM/SBUFSFNM
N
000A0=1
µP mode
1: 8086/88
0: 8080/8085
Auto End Of Interrupt:
1: EOI tự động
0: EOI thông thường
0x: Chế độ không đệm
10: Chế đệm mạch tớ
11: Chế độ đệm mạch chủ
Special Fully Nested Mode
Chế độ lồng hoàn toàn.
1: SFNM