Giáo trình Vi điều khiển 8051 Assembly - Chương 15: Phép ghép 8031/51 với 8255
8255 là một chíp DIP 4 chân
(xem hình 15.1). Nó có 3 cổng truy cập
được riêng biệt. Các cổng đó có tên A,
B và C đều là các cổng 8 bit. Các cổng
này đều có thể lập trình như cổng đầu
vào hoặc đầu ra riêng rẽ và có thể thay
đổi một cách năng động. Ngoài ra, các
cổng 8255 có khả năng bắt tay. Do vậy
cho phép giao diện với các thiết bị khác
cũng có giá trị tín hiệu bắt tay như các
máy in chẳng hạn. Khả năng bắt tay của
8255 sẽ được bàn tới ởmục 15.3.
ác chân RD và RS MOV R0, APORT ; Nạp địa chỉ cổng A READY: MOVX @R0 ; Đọc thanh ghi lệnh RLC A ; Chuyển D7 (cờ bận) vào bit nhớ carry JC READY ; Chờ cho đến khi LCD sẵn sàng MOV A, #80H ; Đặt lại PA, PB thành đầu ra MOV R0, #CNTPORT ; Nạp địa chỉ cổng điều khiển MOVX @R0, A ; Xuất từ điều khiển tới 8255 MOV A, R2 ; Nhận giá trị trả lại tới LCD MOV R0, #APORT ; Nạp địa chỉ cổng A MOVX @R0, A ; Xuất thông tin tới các chân dữ liệu của LCD MOV R0, #BPORT ; Nạp địa chỉ cổng B MOV A, #00000100B ; Đặt RS=0, R/W=0, E=1 cho xung thấp lên cao MOVX @R0, A ; Kích hoạt RS, R/W, E của LCD NOP ; Tạo độ rộng xung của chân E NOP MOV A, #00000000B ; Đặt RS=0, R/W=0, E=0 cho xung cao xuống thấp MOVX @R0, A ; Chốt thông tin ở chân dữ liệu LCD RET ; Chương trình con ghi dữ liệu mới NDATAWRT sử dụng cờ bận NCMDWRT: MOV R2, A ; Lưu giá trị thanh ghi A MOV A, #90H ; Đặt PA là cổng đầu vào để đọc trạng thái LCD MOV R0, # CNTPORT ; Nạp địa chỉ thanh ghi điều khiển MOVX @R0, A ; Đặt PA đầu vào, PB đầu ra MOV A, # 00000110B ; RS=0, R/W=1, E=1 đọc lệnh MOV @R0, BPORT ; Nạp địa chỉ cổng B MOVX R0, A ; RS=0, R/W=1 cho các chân RD và RS MOV R0, APORT ; Nạp địa chỉ cổng A READY: MOVX @R0 ; Đọc thanh ghi lệnh RLC A ; Chuyển D7 (cờ bận) vào bit nhớ carry JC READY ; Chờ cho đến khi LCD sẵn sàng MOV A, #80H ; Đặt lại PA, PB thành đầu ra MOV R0, #CNTPORT ; Nạp địa chỉ cổng điều khiển MOVX @R0, A ; Xuất từ điều khiển tới 8255 MOV A, R2 ; Nhận giá trị trả lại tới LCD MOV R0, #APORT ; Nạp địa chỉ cổng A MOVX @R0, A ; Xuất thông tin tới các chân dữ liệu của LCD MOV R0, #BPORT ; Nạp địa chỉ cổng B MOV A, #00000101B ; Đặt RS=1, R/W=0, E=1 cho xung thấp lên cao MOVX @R0, A ; Kích hoạt RS, R/W, E của LCD NOP ; Tạo độ rộng xung của chân E NOP MOV A, #00000001B ; Đặt RS=1, R/W=0, E=0 cho xung cao xuống thấp MOVX @R0, A ; Chốt thông tin ở chân dữ liệu LCD RET 15.2.3 Nối ghép ADC tới 8255. Các bộ ADC đã được trình bày ở chương 12. Dưới đây một chương trình chỉ một bộ ADC được nối tới 8255 theo sơ đồ cho trên hình 115.11. MOV A, #80H ; Từ điều khiển với PA = đầu ra và PC = đầu vào MOV R1, #CRPORT ; Nạp địa chỉ cổng điều khiển MOVX @R1, A ; Đặt PA = đầu ra và PC = đầu vào BACK: MOV R1, #CPORT ; Nạp địa chỉ cổng C MOVX A, @R1 ; Đọc địa chỉ cổng C để xem ADC đã sẵn sàng chưa ANL A,, #00000001B ; Che tất cả các bít cổng C để xem ADC đã sẵn sàng chưa JNZ BACK ; Giữ hiển thị PC0 che EOC ; Kết thúc hội thoại và bây giờ nhận dữ liệu của ADC MOV R1, #APORT ; Nạp địa chỉ PA MOVX A, @R1 ; A = đầu vào dữ liệu tương tự Cho đến đây ta đã được trao đổi chế độ vào/ ra đơn giản của 8255 và trình bày nhiều ví dụ về nó. Ta xét tiếp các chế độ khác. Hình 15.11: Nối ghép ADC 804 với 8255. 15.3 Các chế độ khác của 8255. 15.3.1 Chế độ thiết lập/ xoá bit BSR. Một đặc tính duy nhất của cổng C là các bit có thể được điều khiển riêng rẽ. Chế độ BSR cho phép ta thiết lập các bit PC0 - PC7 lên cao xuống thấp như được chỉ ra trên hình 15.12. Ví dụ 15.6 và 15.7 trình bày cách sử dụng chế độ này như thế nào? D0 D7 Decoding Circuyiry A2 A7 D0 D7 PA0 PA7 PC0 INTR RESET 8255 VCC CLK R CLK IN Vin(+) Vin(-) A GND Vref/2 GND CS 10K POT 10k 150pF 5V ADC804 RD WR Hình 15.12: Từ điều khiển của chế độ BSR. Ví dụ 15.6: Hãy lập trình PCA của 8255 ở chế độ BSR thì bit D7 của từ điều khiển phải ở mức thấp. Để PC4 ở mức cao, ta cần một từ điều khiển là "0xxx1001" và ở mức thấp ta cần "0xxx1000". Các bít được đánh dấu x là ta không cần quan tâm và thường chúng được đặt về 0. MOV A, 00001001B ; Đặt byte điều khiển cho PC4 =1 MOV R1, #CNTPORT ; Nạp cổng thanh ghi điều khiển MOVX @R1, A ; Tạo PC4 = 1 ACALL DELAY ; Thời gian giữ chậm cho xung cao MOV A, #00001000B ; Đặt byte điều khiển cho PC4 = 0 MOVX @R1, A ; Tạo PC4 = 0 ACALL DELAY Hình 15.13: Cấu hình cho ví dụ 15.6 và 15.7. Ví dụ 15.7: Hãy lập trình 8255 theo sơ đồ 15.13 để: a) Đặt PC2 lên cao b) Sử dụng PC6 để tạo xung vuông liên tục với 66% độ đầy xung. Lời giải: a) MOV R0, # CNTPORT MOV A, # 0XXX0101 ; Byte điều khiển MOV @R0, A b) AGAIN: MOV A, #00001101B ; Chọn PC6 = 1 MOV R0, #CNTPORT ; Nạp địa chỉ thanh ghi điều khiển MOVX @R0, A ; Tạo PC6 = 1 ACALL DELAY ACALL DELAY MOV A, #00001100B ; PC6 = 0 0 x x x Bit Select S/R BSR Mode D7 D6 D5 D4 D3 D2 D1 D0 Not Used. Generally = 0. 000=Bit0 100=Bit4 001 = Bit1 101=Bit5 010 = Bit2 110=Bit6 011 = Bit3 111=Bit7 Set=1 Reset=0 Decoding Circuyiry A2 A7 D0 D7 CS WR RD RD WR A0 A7 A7 A0 PC4 8255 ACALL DELAY ; Thời gian giữ chậm SJMP AGAIN S s Hình 15.14: Biểu đồ đầu ra của 8255 ở chế độ 1. Hình 15.15: Biểu đồ định thời của 8255 ở chế độ 1. 15.3.2 8255 ở chế độ 1: Vào/ ra với khả năng này bắt tay. Một trong những đặc điểm mạnh nhất của 8255 là khả năng bắt tay với các thiết bị khác. Khả năng bắt tay là một quá trình truyền thông qua lại của hai thiết bị thông minh. Ví dụ về một thiết bị có các tín hiệu bắt tay là máy in. Dưới đây ta trình bày các tín hiệu bắt tay của 8255 với máy in. Chế độ 1: Xuất dữ liệu ra với các tín hiệu bắt tay. Như trình bày trên hình 15.14 thì cổng A và B có thể được sử dụng như các cổng đầu ra để gửi dữ liệu tới một thiết bị với các tín hiệu bắt tay. Các tín hiệu bắt tay cho cả hai cổng A và B được cấp bởi các bit của cổng C. Hình 15.15 biểu đồ định thời của 8255. PC4 PC4 PC7 PC6 INTEA PC6 Port A Output PC1 PC2 INTEB PC0 PB7 PB0 Port A Output PC4.5 INTEB INTEA OBFA ACKA OBFB ACKB P or t A w ith H an sh ak e Si gn al s Po rt B w ith H an sh ak e S ig na ls WR 1 0 1/0 1 0 X 1 0 D7 D6 D5 D4 D3 D2 D1 D0 Port B O utput P ort B M ode1 Port B O utput Port A O utput P ort A M ode1 P ort A M ode1 I/O M ode PC 4.51=Input,0=O utpput ControlWord-Mode1Output D7 D6 D5 D4 D3 D2 D1 D0 IN TE B IN TE B I/O I/O iN TE A StatusWord-Mode1Output IN TE A O BFA O BFB INTEA is controlled by PC6 in BSR mode INTEB is controlled by PC2 in BSR mode INTEB OBF WR ACK Output Dưới đây là các phần giải thích về các tín hiệu bắt tay và tính hợp lý của chúng đối với cổng A, còn cổng B thì hoàn toàn tương tự. Tín hiệu OBFa : Đây là tín hiệu bộ đệm đầu ra đầy của cổng A được tích cực mức thấp đi ra từ chân PC7 để báo rằng CPU đã ghi 1 byte dữ liệu tới cổng A. Tín hiệu này phải được nối tới chân STROBE của thiết bị thu nhận dữ liệu (chẳng hạn như máy in) để báo rằng nó bây giờ đã có thể đọc một byte dữ liệu từ chốt cổng. Tín hiệu ACKa : Đây là tín hiệu chấp nhận do cổng A có mức tích cực mức thấp được nhân tại chân PC6 của 8255. Qua tín hiệu ACKa thì 8255 biết rằng tín hiệu tại cổng A đã được thiết bị thu nhận lấy đi. Khi thiết bị nhận lấy dữ liệu đi từ cổng A nó báo 8255 qua tín hiệu ACKa . Lúc này 8255 bật OBFa lên cao để báo rằng dữ liệu tại cổng A bây giờ là dữ liệu cũ và khi CPU đã ghi một byte dữ liệu mới tới cổng A thì OBFa lại xuống thấp v.v... Tín hiệu INTRa: Đây là tín hiệu yêu cầu ngắt của cổng A có mức tích cực cao đi ra từ chân PC3 của 8255. Tín hiệu ACK là tín hiệu có độ dài hạn chế. Khi nó xuống thấp (tích cực) thì nó làm cho OBFa không tích cực, nó ở mức thấp một thời gian ngắn và sau đó trở nên cao (không tích cực). Sườn lên của ACK kích hoạt INTRa lên cao. Tín hiệu cao này trên chân INTRa có thể được dùng để gây chú ý của CPU. CPU được thông báo qua tín hiệu INTRa rằng máy in đã nhận byte cuối cùng và nó sẵn sàng để nhận byte dữ liệu khác. INTRa ngắt CPU ngừng mọi thứ đang làm và ép nó gửi byte kế tiếp tới cổng A để in. Điều quan trọng là chú ý rằng INTRa được bật lên 1 chỉ khi nếu INTRa, OBFa và ACKa đều ở mức cao. Nó được xoá về không khi CPU ghi một byte tới cổng A. Tín hiệu INTEa: Đây là tín hiệu cho phép ngắt cổng A 8255 có thể cấm INTRa để ngăn nó không được ngắt CPU. Đây là chức năng của tín hiệu INTEa. Nó là một mạch lật Flip - Flop bên trong thiết kế để che (cấm) INTRa. Tín hiệu INTRa có thể được bật lên hoặc bị xoá qua cổng C trong chế độ BSR vì INTEa là Flip - Plop được điều khiển bởi PC6. Từ trạng thái: 8255 cho phép hiển thị trạng thái của các tín hiệu INTR, OBF và INTE cho cả hai cổng A và B. Điều này được thực hiện bằng cách đọc cổng C vào thanh ghi tổng và kiểm tra các bit. Đặc điểm này cho phép thực thi thăm dò thay cho ngắt phần cứng. Hình 15.16: Đầu cắm DB-25. (hình 15.17 mờ quá không vẽ được) Hình 15.17: Đầu cáp của máy in Centronics. Bảng 15.2: Các chân tín hiệu của máy in Centronics. 1 13 14 25 Chân số Mô tả Chân số Mô tả 1 2 3 4 5 6 7 8 9 10 STROBE Dữ liệu D0 Dữ liệu D1 Dữ liệu D2 Dữ liệu D3 Dữ liệu D4 Dữ liệu D5 Dữ liệu D6 Dữ liệu D7 ACK (chấp nhận) 11 12 13 14 15 16 17 18-25 Bận (busy) Hết giấy (out of paper) Chọn (select) Tự nạp ( Autofeed ) Lỗi ( Error ) Khởi tạo máy in Chọn đầu vào ( inputSelect ) Đất (ground) Các bước truyền thông có bắt tay giữa máy in và 8255. Một byte dữ liệu được gửi đến bus dữ liệu máy in. Máy in được báo có 1 byte dữ liệu cần được in bằng cách kích hoạt tín hiệu đầu vào STROBE của nó. Khi máy nhận được dữ liệu nó báo bên gửi bằng cách kích hoạt tín hiệu đầu ra được gọi là ACK (chấp nhận). Tín hiệu ACK khởi tạo quá trình cấp một byte khác đến máy in. Như ta đã thấy từ các bước trên thì chỉ khi một byte dữ liệu tới máy in là không đủ. Máy in phải được thông báo về sự hiện diện của dữ liệu. Khi dữ liệu được gửi thì máy in có thể bận hoặc hết giấy, do vậy máy in phải được báo cho bên gửi khi nào nó nhận và lấy được dữ liệu của nó. Hình 15.16 và 15.17 trình các ổ cắm DB25 và đầu cáp của máy in Centronics tương ứng.
File đính kèm:
- Vi_dieu_khien_8051_ Assembly_15_GhepNoi.pdf