DIV nguồn (Unsigned Divide)
G A8 A7 A6 A5 A4 A3 A2 A1 A0 O0 O1 O2 O3 O4 O5 O6 O7 00010110000111
TNNV1 sẵn sàng?
Phương pháp vào/ra dữ liệu bằng cách thăm dò trạng thái sẵn sàng của thiết bị ngoại vi là phương pháp điều khiển vào/ra dữ liệu bằng chương trình – có hội thoại. Tín hiệu hội thoại (handshaking signal) ở đây là tín hiệu báo trạng thái sẵn sàng của thiết bị ngoại vi.
Việc điều khiển vào/ra dữ liệu sẽ trở nên rất đơn giản nếu thiết bị ngoại vi lúc nào cũng sẵn sàng chờ làm việc (trao đổi dữ liệu) với CPU – Như đã đề cập đến trong phần giới thiệu – đó là phương pháp vào/ra dữ liệu đồng bộ (trực tiếp – không hội thoại). Tuy nhiên trong thực tế không phải lúc nào CPU cũng làm việc với các thiết bị ngoại vi “liên tục sẵn sàng” như trên, vì tốc độ làm việc của thiết bị ngoại vi và CPU là rất chênh lệch. Thông thường khi CPU muốn trao đổi dữ liệu với một thiết bị ngoại vi nào đó, thơng qua chương trình nó liên tục kiểm tra trạng thái sẵn sàng của thiết bị ngoại để xem có yêu cầu trao đổi dữ liệu (yêu cầu phục vụ) hay khơng? Đến khi có một thiết bị ngoại vi nào đó có yêu cầu trao đổi dữ liệu (tức là có tín hiệu báo trạng thái sẵn sàng – readly) thì chương trình sẽ chuyển sang thực hiện việc trao đổi dữ liệu (cơng việc trao đổi này có thể là các lệnh ngay trong chương trình chính hoặc là một chương trình con phục vụ – hoặc ISR) rồi lại tiếp tục kiểm tra thiết bị ngoại vi kế tiếp. Quá trình này được thực hiện tiếp tục đến thiết bị ngoại vi cuối cùng rồi lại được lặp lại từ đầu. Vậy, nếu làm việc theo phương pháp thăm dị thì thơng thường CPU phải được dành riêng cho cơng việc trao đổi dữ liệu vì nó phải liên tục kiểm tra trạng thái sẵn sàng của thiết bị ngoại vi thơng qua các tín hiệu móc nối. Các tín hiệu này được lấy từ mạch phối ghép, do người thiết kế mạch tạo ra để cho chương trình có thể kiểm tra nó. Việc này được
tính tốn đồng bộ khi xây dựng mạch và chương trình điều khiển.
Nói chung, phương pháp này đơn giản trong tổ chức phần cứng và phần mềm nhưng gặp phải nhược điểm là khi số lượng thiết bị ngoại vi tăng lên thì sẽ làm lãng phí thời gian CPU cho việc kiểm tra trạng thái sẵn sàng và khả năng đáp ứng tức thời với phục vụ của CPU là rất thấp.
Hình vẽ cho thấy lưu đồ của chương trình điều khiển theo phương pháp thăm dị khi số lượng số thiết bị ngoại vi > 1.
TNNV1 sẵn sàng? sẵn sàng?
Vào/ra dữ liệu với TBNV1 Chương trình điều khiển T TNNV1 sẵn sàng?
Vào/ra dữ liệu với TBNV1
F
TNNV1 sẵn sàng? sẵn sàng?
Vào/ra dữ liệu với TBNV1 T F T F ...
Hình vé: Lưu đồ điều khiển của Phương pháp thăm dò trạng thái sẵn sàng
Nếu thơng tin được phát hoặc nhận từ một thiết bị ngoại vi nào đó sẽ thiết lập một cờ trạng thái thích hợp (thơng thường là bằng một mạch lật trạng thái bởi xung STB của thiết bị ngoại vi). Bộ vi xử lý sẽ kiểm tra cờ trạng thái này và sẽ thực hiện modul chương trình trao đổi dữ liệu khi cờ trạng thái báo rằng thiết bị ngoại vi sẵn sàng cho việc trao đổi dữ liệu. Nó như một tín hiệu u cầu phục vụ (thụ động) cho việc vào/ra dữ liệu.
Sau đây là một ví dụ về cách tạo tín hiệu móc nối trong tổ chức phần cứng và lưu đồ thuật tốn (chương trình điều khiển) dùng cho việc trao đổi dữ liệu giữa CPU và thiết bị ngoại vi.
Để đơn giản, trong ví dụ này ta giả thiết CPU chỉ làm việc với 1 thiết bị ngoại vi và và 1 thiết bị ngoại vi ra. Việc tổ chức phối ghép phần cứng được thực hiện trên các vi mạch (IC) cỡ vừa để dễ theo dõi các tín hiệu.
Một cổng vào có địa chỉ 00 được dùng để đọc trạng thái sẵn sàng của thiết bị ngoại vi số 1 và số 2. (TB1: vào; TB2: ra). Tín hiệu báo sẵn sàng của thiết bị ngoại vi số 1 (có địa chỉ 01) được đặt vào bit D0 và tín hiệu báo sẵn sàng của thiết bị ngoại vi số 2 (có địa chỉ 02) được đặt vào bit D1 của bus dữ liệu. Các bit tín hiệu này sẽ có giá trị bằng 1 khi thiết bị ngoại vi tương ứng ở trạng thái sẵn sàng trao đổi dữ liệu với CPU và chúng sẽ được đưa vào bus dữ liệu khi CPU đọc nó bằng lệnh đọc cổng có địa chỉ 00. Chương trình điều khiển trao đổi dữ liệu sẽ kiểm tra các bit báo sẵn sàng này và có các đáp ứng thích hợp.
Cụ thể hoạt động của phần mạch vào dữ liệu như sau: Khi thiết
bị vào (TB1) có (1 byte) dữ liệu cần (trao đổi) đưa vào hệ thống, nó đưa ra xung STB để cho phép mạch chốt 8 bit chốt lấy dữ liệu đó đồng thời kích cho mạch lật D (mạch tạo tín hiệu sẵn sàng) làm việc => đầu ra Q = 1. Bộ vi xử lý (CPU) thông qua lệnh đọc cổng 00 để thăm dò trạng thái sẵn sàng của thiết bị ngoại vi số 1 thông qua bit D0. Khi thấy D0 = 1, nó đọc 1 byte dữ liệu vào đồng thời xố ln Q (Q = 0, thiết bị ngoại vi không sẵn sàng) để chuẩn bị lần đọc byte dữ liệu khác.
Tương tự như vậy ta có thể thấy được sự hoạt động của phần mạch ra dữ liệu – thiết bị ngoại vi số 2. ACK Mạch 3 trạng thái /OC Mạch chốt 8 bit /G Input Device (1) pr Q D lck clr +5V Mạch Chốt 8 bit /G Mạch 3 trạng thái /OC Output Device (2) pr Q D lck clr +5V Bus dữ liệu D0 D1 ... D7 ISP01 ISP00 ISP01 STB OSP02 OSP00 OSP02
Yêu
cầu: Lập
trình theo
lưu đồ
(a) –
đường nét liền để thực hiện việc đọc vào một byte dữ liệu mỗi khi cổng 01 báo sẵn sàng rồi hiển thị byte dữ liệu đó. Giả thiết có 100 byte dữ liệu phải đọc và có sẵn thủ tục thực hiện hiển thị giá trị trong thanh ghi al lên màn hình có tên là hien_thi.
…
Mov cx, 100 ; Số byte dữ liệu cân đọc trong cx Lặp: