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 [...]... chu kỳ này có thể chia thành nhiều trạng thái khác nhau 8237 phân biệt 7 trạng thái hoạt động riêng biệt bao gồm: Trạng thái không tích cực IS (Inactive State): Trạng thái này không có yêu cầu DMA hợp lệ, các ngõ vào yêu cầu ở trạng thái treo IS được tính cả thời điểm 8237 trong trạng thái đang lập trình S0 là trạng thái đầu tiên của chu kỳ phục vụ... các STB bus lên trạng thái trở kháng cao và trả lời cho 8237 bằng tín hiệu HLDA Khi nhận được tín hiệu trả lời của CPU, 8237 bắt đầu quá trình chiếm bus để thực hiện chu AEN kỳ phục vụ DMA Địa chỉ mà A0-A3 A4-A7 bao gồm 2 byte, 8 bit cao cung cấp tới 8237 tạo ra ADSTB DB0các HLDA A0-A7, 8 bit HLDAsẽ cung cấp ra data bus DB0-DB7 và được xung ngõ ra thấp DB7 ADSTB... hiệu hai chiều 3 trạng thái, trong chu kỳ rỗi (không phục vụ DMA) các tín hiệu này là các ngõ vào sử dụng để CPU định vị các thanh ghi điều khiển bên trong 8237 Trong trạng thái phục vụ DMA chúng là các ngõ ra cung cấp các bit địa chỉ thấp ra bus địa chỉ, sử dụng cho các bộ nhớ và thiết bị ngoại vi + A4 - A7 (Address) : là các ngõ ra 3 trạng thái cung... bằng tín hiệu DACK tới cho thiết bị, tín hiệu này sẽ thông báo cho thiết bị trạng thái sẵn sàng cho thiết bị gửi ra một byte dữ liệu Cuối cùng DMAC sẽ tạo ra cả hai tín hiệu ghi bộ nhớ (MEMW) và đọc vào ra (IOR) một cách đồng thời, IOR sẽ cho phép thiết bị cung cấp dữ liệu ra data Bus, MEMW cho phép bộ nhớ nhận dữ liệu từ data Bus Như vậy DMA đã điều... thấp + AEN (Address Enable) : là ngõ ra tác động mức cao cài 8 bit địa chỉ cao lên bus hệ thống, tín hiệu này có thể sử dụng để cấm các thiết bị khác truy cập bus trong khi đang phục vụ DMA + ADSTB (Address Strobe): là ngõ ra tác động mức cao cài các đường địa chỉ cao ra bộ cài bên ngoài + MEMR (Memory Read) : là ngõ ra 3 trạng thái tác động mức thấp sử... được thực hiện hoàn toàn tương tự Khi đó DMAC sẽ tạo ra các tín hiệu điều khiển đọc bộ nhớ (MEMR) và ghi vào ra (IOWC) một cách đồng thời Trong thực tế có 3 chế độ trao đổi dữ liệu theo nguyên tắc DMA: - Treo CPU một khoảng thời gian để trao đổi cả mảng dữ liệu - Treo CPU một số chu kỳ máy để trao đổi từng byte - Tận dụng thời gian CPU không sử dụng... đọc trạng thái hiện hành của các thanh ghi trạng thái, tạm thời, và thanh ghi đếm số từ Trong các chu kỳ DMA 8 bit địa chỉ cao sẽ được cung cấp ra các ngõ ra này, chứa vào bộ cài bên ngoài bằng tín hiệu ADSTB Trong chu kỳ truyền dữ liệu giữa các ô nhớ (Memory - Memory), dữ liệu sẽ được đọc vào 8237 thông qua data bus trong chu kỳ đọc, rồi chuyển ra data... ghi và kiểm tra Trong kiểu ghi dữ liệu sẽ được chuyển từ thiết bị vào ra tới bộ nhớ bằng cách tác động đồng thời các tín hiệu IOR và MEMW Trong kiểu đọc dữ liệu sẽ được chuyển từ bộ nhớ tới thiết bị vào ra bằng cách tác động đồng thời các tín hiệu MEMR và IOW Kiểu kiểm tra sẽ thực hiện các việc truyền giả Trong kiểu này 8237 tạo ra địa chỉ... vào /ra với, các tín hiệu MEMR và IOW hoặc MEMW và IOR tác động một cách đồng thời tại một thời điểm Dữ liệu sẽ không đọc vào hoặc ghi ra 8237 trong các chu kỳ truyền dữ liệu giữa vào ra và bộ nhớ Việc truyền dữ liệu giữa các ô nhớ một chu kỳ đọc từ ô nhớ truyền và 1 chu kỳ ghi vào ô nhớ nhận cho mỗi byte Như vậy trong chu kỳ này sẽ yêu cầu 8 trạng... trạng thái cho việc truyền một byte Các trạng thái S11, S12, S13, S14 cho việc đọc dữ liệu từ bộ nhớ, và các trạng thái S21, S22, S23, S24 cho việc ghi dữ liệu vào bộ nhớ Chu kỳ rỗi Khi không có kênh DMA nào yêu cầu được phục vụ, 8237 sẽ chuyển qua chu kỳ rỗi và thực hiện trạng thái SI Trong chu kỳ này 8237 sẽ kiểm tra các ngõ vào DREQ tại mỗi chu kỳ xung . 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. 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