Tải bản đầy đủ (.doc) (23 trang)

Chương I: TỔNG QUAN VỀ CHÍP BỔ TRỢ PPI – 8255A ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (383.31 KB, 23 trang )

Chương I:
TỔNG QUAN VỀ CHÍP BỔ TRỢ
PPI – 8255A
PPI 8255A là vi mạch ghép nối ngoại vi lập trình được ( Programmable
periferal interface), thường được gọi là mạch ghép nối vào ra song song lập
trình được. Do khả năng mềm dẻo trong các ứng dụng thực tế, nó là mạch
ghép nối được dùng rất phổ biến trong các hệ vi xử lý 8 bit, 16 bit và 32 bit.
1.1- Sơ đồ chân:
Vi mạch gồm 40 chân trong đó. Gồm: PA
0
÷ PA
7
, PB
0
÷ PB
7
, PC
0
÷ PC
7
,
D
0
÷ D
7
, A
0
, A
1
, , , CS, Reset, Vcc và GND.
Có 24 đường dẫn lối vào/ra xếp thành 3 cổng song song ( portA, portB,


portC).
Một nửa cổng C ( PC4 … PC7) thuộc nhóm A gọi là PC
H
, còn nửa kia
thuộc nhóm B, gọi là PC
L
Chân Reset phải được nối với tín hiệu Reset chung của toàn hệ thống (khi
Reset các cổng được định nghĩa là cổng vào để không gây ra sự cố cho các
mạch điều khiển).
Tín hiệu CS được nối với mạch tạo xung chọn thiết bị để đặt mạch 8255
vào một địa chỉ cơ sở nào đó. Các tín hiệu địa chỉ A0, A1 sẽ chọn ra 4 thanh
ghi bên trong 8255: một thanh ghi để ghi từ điều khiển (CWR – control
word register) cho hoạt động của 8255 và 3 thanh ghi khác ứng với các cổng
là PA, PB, PC để ghi đọc dữ liệu theo bảng:
A
1
A
0
Lệnh
(của VXL)
Hướng chuyển số
liệu với VXL
0 0 0 0 1 Đọc PortA PortA →D0 ÷ D7
0 1 0 0 1 Đọc portB PortB →D0 ÷ D7
1 0 0 0 1 Đọc portC PortC →D0 ÷ D7
1 1 0 0 1 Không có giá trị
0 0 0 1 0 Ghi PortA D0 ÷ D7→ PortA
0 1 0 1 0 Ghi PortB D0 ÷ D7→ PortB
1 0 0 1 0 Ghi PortC D0 ÷ D7→ PortC
1 1 0 1 0 Ghi thanh ghi

điều khiển
D0 ÷ D7→ thanh
ghi điều khiển
x x 1 x x Vi mạch ở trạng
thái trở kháng
cao
Không có trao đổi
số liệu
Tính linh hoạt của vi mạch này thể hiện ở khả năng lập trình. Ta có thể
đặt các mode hoạt động thông qua thanh ghi điều khiển.
Các chân D0 đến D7 tạo nên kênh dữ liệu 2 hướng có độ rộng 8 bit. Tất
cả dữ liệu khi truy nhập ghi hoặc đọc được dẫn qua kênh dữ liệu này.
Trạng thái logic ghi/đọc được nhận biết qua các tín hiệu điều khiển ,
. Trao đổi thông tin với 8255 chỉ có thể được tiến hành khi CS =
0. Khi RD= 0 dữ liệu của cổng được chọn được đưa ra kênh dữ liệu và có
thể được sử dụng bởi các vi mạch khác. Khi WR = 0, thì moi việc xảy ra
ngược lại.
Các bit địa chỉ A0 và A1 cùng với các tín hiệu ghi đọc báo cho biết sẽ
truy nhập lên cổng nào.
Sơ đồ khối mô tả chức năng của 8255:
1.2- Các chế độ làm việc của 8255:
Để xác lập chế độ làm việc cho 8255 ta ghi từ điều khiển vào thanh ghi từ
điều khiển CWR ( Control Word Register ).
Có 2 loại từ điều khiển cho 8255:
- Từ điều khiển định nghĩa cấu hình cho các cổng PA, PB, PC.
- Từ điều khiển lập/xoá từng bit ở đầu ra của PC.
- Tuỳ theo từ lệnh được ghi vào thanh ghi điều khiển khi khởi động của
vi mạch mà ta có các PortA,B,C hoạt động ở:
+ Các chế độ 0, 1, 2 khác nhau.
+ Chiều trao đổi dữ liệu khác nhau, tức PortA, B, C là cổng ra hay vào.

1.2.1- Từ điều khiển định nghĩa cấu hình cho các cổng:
1.2.2- Thanh ghi từ điều khiển việc thiết lập/ xóa bit ra PCi:
1.2.3- Các chế độ làm việc:
Chip 8255A có 3 chế độ làm việc:
• Chế độ 0: Vào ra cơ sở (còn gọi là vào ra đơn giản).
Trong chế độ 0, 8255 cho một khả năng xuất và nhập dữ liệu đơn giản
qua 3 cổng A,B,C. PA, PB, PC được sử dụng độc lập với nhau, 3 đường dây
đều được dùng để trao đổi số liệu hoặc thông tin về điều khiển và trạng thái
một cách bình đẳng với nhau và tuỳ ý lựa chọn.
Chế độ 1:
Trong chế độ này các cổng A và B có thể được dùng như các cổng đầu
vào hoặc đầu ra với các khả năng bắt tay. Tín hiệu bắt tay được cấp bởi các
bit của cổng C.
- Xuất dữ liệu ra trong mode 1
Cổng PA, PB có tín hiệu đối thoại tương tự nhau. Tín hiệu ,
báo rằng bộ đệm ra đã đầy cho ngoại vi biết CPU đã ghi dữ liệu vào cổng để
chuẩn bị đưa ra.
Tín hiệu này thường nối với tín hiệu của thiết bị nhận.
Tín hiệu , là tín hiệu của ngoại vi cho biết nó đã nhận được
dữ liệu từ các cổng PA, PB.
Tín hiệu INTRA, INTRB là tín hiệu yêu cầu ngắt từ PA, PB. INTEA,
INTEB là tín hiệu của một mạch lật bên trong 8255 để cho phép hoặc cấm
yêu cầu ngắt INTRA hoặc INTRB của PA hoặc PB. INTEA được lập/xoá
thông qua bit PC6. INTEB được lập/xoá thông qua bit PC2.
Khi làm việc ở chế độ xuất thông tin mode 1, thanh ghi trạng thái của
8255 cung cấp các thông tin phản ánh trạng thái hiện hành của mình.
Sơ đồ ghép nối của 8255 ở mode 1:
(Output Bufer A full): Báo hiệu bộ đệm cổng ra A đã đầy
(Output Bufer B full): Báo hiệu bộ đệm cổng ra B đã đầy
INTEA ( Interrupt Enable For PortA): cho phép PA chạy ở chế độ ngắt.

INTEB ( Interrupt Enable For PortB): cho phép PB chạy ở chế độ ngắt.
INTRA ( Interrupt PortA ): PA ngắt
INTRB ( Interrupt PortB ): PB ngắt
Nội dung thanh ghi trạng thái của 8255 ở mode 1 cho huớng ra:
- Nhận dữ liệu vào trong mode 1
Khi nhận dữ liệu vào trong mode 1 các cổng PA, PB có tín hiệu đối thoại
tương tự nhau:
STB ( cho phép chốt dữ liệu). Khi dữ liệu đã sẵn sàng trên kênh PA, PB
ngoại vi phải dùng STB để báo cho 8255 biết để chốt dữ liệu vào cổng PA
hoặc PB. Sau khi 8255 chốt được dữ liệu do thiết bị ngoại vi đưa đến, nó
đưa ra tín hiệu IBF (In Buffer full) để báo cho ngoại vi biết.
Nội dung thanh ghi trạng thái của 8255 ở mode 1 cho hướng vào:
• Chế độ 2:
Vào/ra 2 chiều. Trong chế độ này chỉ riêng cổng PA có thể được định
nghĩa thành cổng vào ra 2 chiều với các tín hiệu bắt tay do các bit của cổng
PC đảm nhiệm. Lúc này cổng PB có thể làm việc ở chế độ 0 hoặc 1.
Chế độ này chỉ dùng cho cổng PA với vào/ra 2 chiều và các bit PC3 ÷
PC7 dùng làm tín hiệu giao tiếp.
Mạch logic của 8255 ở mode 2 và các tín hiệu giao tiếp:
Cổng PB có thể làm việc ở mode 1 hoặc mode 0 tuỳ theo bit điều khiển
trong thanh ghi CWR.
INTRA: yêu cầu ngắt cho dữ liệu 2 chiều vào/ra.
INTE 1, INTE 2: là 2 tín hiệu của 2 mạch lật bên trong 8255 để cho phép
hoặc cấm yêu cầu ngắt của PA, các bit này được lập xoá bởi PC6 và PC4.
Khi dùng 8255 trong chế độ bus 2 chiều để trao đổi dữ liệu theo cách
thăm dò, phải kiểm tra xem bit IBFA có bằng 0 (đệm vào rỗng) hay không
trước khi dùng lệnh IN để nhận dữ liệu từ cổng PA.
Khi làm việc ở chế độ truyền thông tin 2 chiều của mode 2, thanh ghi
trạng thái của 8255 cung cấp các thông tin phản ánh trạng thái hiện hành của
mình.

Nội dung thanh ghi trạng thái:

Chương II:
GHÉP NỐI 8255 VỚI VI XỬ LÝ
2.1-Ghép nối với 8086:
VD: Thiết kế sơ đồ ghép nối 8255 với 8086 và viết chương trình đọc từ cổng PA,
đưa ra PB, rồi cộng thêm 5 và đưa ra PC
Giải:
Địa chỉ cơ sở của 8255 ở sơ đồ trên là F00h
Địa chỉ các thanh ghi
PA: F00h
PB: F01h
PC: F02h
CWR: F03h
Chương trình như sau:
include<dos.h>
void main()
{
Long a;
Outport (0xF03, 0x90);
a= import(0xF00);
outport (0xF01,a);
a=a+5;
outport(0xF02,a);
}
2.2- Ghép nối với 8051:
8255 được lập trình một trong ba chế độ vừa trình bày ở trên bằng cách gửi một từ
điều khiển tới thanh ghi từ điều khiển của 8255. Trước hết chúng ta phải tìm ra các
địa chỉ cổng được gán cho mỗi cổng A, B, C và thanh ghi điều khiển.
Theo sơ đồ trên, địa chỉ cơ sở của 8255 là 4000h tương đương với địa chỉ của

thanh ghi PA là 4000h, PB là 4001h, PC là 4002h và CWR là 4003h.
Xét những ví dụ sau:
VD1: Hãy tìm từ điều khiển của 8255 cho các cấu hình sau:
a, Tất cả các cổng A, B và C đều là các cổng đầu ra (chế độ 0).
b, PA là đầu vào, PB là đầu ra, PCL là đầu vào và PCH là đầu ra.
Giải:
a, Để các cổng A, B, C đều là các cổng đầu ra, ta phải nạp vào thanh ghi từ điều
khiển giá trị
1000 0000 = 80h.
b, PA, PCL là đầu vào, PB, PCH là đầu ra phải nạp vào thanh ghi từ giá trị: 1001
0000h = 90h
VD2: Viết một chương trình để gửi 55H và AAH đến cổng liên tục.
MOV A, #80H ; Nạp giá trị từ điển khiển
MOV DPTR, # 4003H ; Nạp địa chỉ cổng của thanh
ghi từ điều khiển
MOVX @DPTR, A ; Xuất từ điển khiển
MOV A, # 55H ; Gán A = 55
AGAIN: MOV DPTR, # 4000H ; Địa chỉ cổng PA
MOVX @DPTR, A ; Lấy các bit cổng PA
INC DPTR ; Địa chỉ cổng PB
MOVX @DPTR, A ; Lấy các bít cổng PB
INC DPTR ; Địa chỉ cổng PC
MOVX @DPTR, A ; Lấy các bít cổng PC
CPL A ; Lấy các bít thanh ghi A
ACALL DELAY ; Chờ
SJMP AGAIN ; Tiếp tục
VD3: Điều khiển LED đơn:
• Sơ đồ nguyên lý:
• Chương trình:
#include<stdio.h>

#include<reg51.h>
int j;
unsigned char x,y,k,a;
xdata unsigned char PA _at_ 0x00;
xdata unsigned char PC _at_ 0x02;
xdata unsigned char CREG _at_ 0x03;
void delay()
{
unsigned long int i;
for(i=0;i<=5000;i++);
}
void main()
{
CREG=0x81;
while(1)
{
a=PC ;
if(a==1)
{
x=0x80;
for(j=0;j<8;j++)
{ PA=x;delay();
x=x>>1;
}
x=0x01;
for(j=0;j<8;j++)
{
PA=x;delay();
x=x<<1;
}

}
if(a==2)
{
x=0x10;y=0x08;
PA=(x|y);delay();
for(j=0;j<=3;j++)
{
x=x<<1;x=x|0x10;
y=y>>1;y=y|0x08;
PA=(y|x);delay();
}
}
if(a==3)
{
x=0;y=0;
PA=(x|y);delay();
for(k=8;k>0;k )
{
x=0x80;
for(j=0;j<=k-1;j++)
{
PA=(x|y);delay();
x>>=1;
}
y<<=1;y=(y|0x01);
}
}
}
}
Chương III:

GHÉP NỐI 8255 VỚI THIẾT BỊ NGOẠI VI
3.1- Ghép nối với LCD:

; Ghi các lệnh và dữ liệu tới LCD không có kiểm tra cờ bận.
; Giả sử PA của 8255 được nối tới D0 - D7 của LCD và
; IB - RS, PB1 = R/W, PB2 = E để nối các chân điều khiển LCD
MOV A, #80H ; Đặt tất cả các cổng 8255 là đầu ra
MOV R0, #CNTPORT ; Nạp địa chỉ thanh ghi điều khiển
MOVX @R0, A ; Xuất từ điều khiển
MOV A, #38H ; Cấu hình LCD có hai dòng và ma
trận 5x7
ACALL CMDWRT ; Ghi lệnh ra LCD
ACALL DELAY ; Chờ đến lần xuất kế tiếp
(2ms)
MOV A, # 0EH ; Bật con trỏ cho LCD
ACALL CMDWRT ; Ghi lệnh này ra LCD
ACALL DELAY ; Chờ lần xuất kế tiếp
MOV A, # 01H ; Xoá LCD
ACALL CMDWRT ; Ghi lệnh này ra LCD
ACALL DELAY ; Dịch con trỏ sang phải
MOV A, # 06 ; Ghi lệnh này ra LCD
ACALL CMDWRT ; Chờ lần xuất sau
ACALL DELAY ; Ghi lệnh này ra LCD
; v.v cho tất cả mọi lệnh LCD
MOV A, # 'N' ; Hiển thị dữ liệu ra (chữ N)
ACALL DATAWRT ; Gửi dữ liệu ra LCD để hiển thị
ACALL DELAY ; Chờ lần xuất sau
MOV A, # '0' ; Hiển thị chữ "0"
ACALL DATAWRT ; Gửi ra LCD để hiển thị
ACALL DELAY ; Chờ lần xuất sau

; v.v cho các dữ liệu khác
; Chương trình con ghi lệnh CMDWRT ra LCD
CMDWRT: MOV R0, # APORT ; Nạp địa chỉ cổng A
MOVX @R0, A ; Xuất thông tin tới chân dữ
liệu của LCD
MOV R0, # BPORT ; Nạp địa chỉ cổng B
MOV A, # 00000100B ; RS=0, R/W=1, E=1 cho xung cao
xuống thấp
MOVX @R0, A ; Kích hoạt các chânRS, R/W,
E của LCD
NOP ; Tạo độ xung cho chân E
NOP
MOV A, # 00000000B ; RS=0, R/W=1, E=1 cho xung cao
xuống thấp
MOVX @R0, A ; Chốt thông tin trên chân dữ liệu của LCD
RET
; Chương trình con ghi lệnh DATAWRT ghi dữ liệu ra LCD.
CMDWRT: MOV R0, # APORT ; Nạp địa chỉ cổng A
MOVX @R0, A ; Xuất thông tin tới chân dữ
liệu của LCD
MOV R0, # BPORT ; Đặt RS=1, R/W=0, E=0 cho xung
cao xuống thấp
MOV A, # 00000101B ; Kích hoạt các chân RS, R/W, E
MOVX @R0, A ; Tạo độ xung cho chân E
NOP
NOP
MOV A, # 00000001B ; Đặt RS=1, R/W=0, E=0 cho xung
cao xuống thấp
MOVX @RC, A ; Chốt thông tin trên chân dữ
liệu của LCD

RET
; Ghi các lệnh và dữ liệu tới LCD có sử dụng kiểm tra cờ bận.
; Giả sử PA của 8255 được nối tới D0 - D7 của LCD và
; PB0 = RS, PB1 = R/W, PB2 = E đối với 8255 tới các chân điều khiển LCD
MOV A, #80H ; Đặt tất cả các cổng 8255 là đầu ra
MOV R0, #CNTPORT ; Nạp địa chỉ thanh ghi điều khiển
MOVX @R0, A ; Xuất từ điều khiển
MOV A, #38H ; Chọn LCD có hai dòng và ma trận
5 7
ACALL NMDWRT ; Ghi lệnh ra LCD
MOV A, # 0EH ; Lệnh của LCD cho con trỏ bật
ACALL NMDWRT ; Ghi lệnh ra LCD
MOV A, # 01H ; Xoá LCD
ACALL NMDWRT ; Ghi lệnh ra LCD
MOV A, # 06 ; Lệnh dịch con trỏ sang phải
ACALL CMDWRT ; Ghi lệnh ra LCD
; v.v cho tất cả mọi lệnh LCD
MOV A, # 'N' ; Hiển thị dữ liệu ra (chữ N)
ACALL NCMDWRT ; Gửi dữ liệu ra LCD để hiển thị
MOV A, # '0' ; Hiển thị chữ "0"
ACALL NDADWRT ; Gửi ra LCD để hiển thị
; v.v cho các dữ liệu khác
; Chương trình con ghi lệnh NCMDWRT có hiển thị 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, #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
3.2- Các chế độ khác của 8255:
Ở chương này chúng ta sẽ đi tìm hiểu kĩ hơn về chế độ lập/xóa bít BSR( Bit

Set/Reset)
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ư hình sau:
Xét ví dụ sau để biết chế độ này hoạt động như thế nào:

×