trong thời gian học vừa qua chúng ta đang học môn kĩ thuật vi xử lí.
và một số nhóm đã được giao cho một số bài tập lớn về ghép nối thiết bị ngoại vi 8255;
và sau đây mình xin hướng dẫn các bạn lập trình với con ic này.
1./ PPI-8255A đây là một chíp vào/ra đa năng khả trình.nó được thiết kế ghép nối với các thiết bị ngoại vi với vi xử lý của hãng intel theo các phướng thức truyền thông dữ liệu song song.
ta có sơ đồ khối của nói như sau:
giới thiệu qua về PPi 8255A:
Vi mạch này có 24 chân cho thiết bị I/O có thể lập trình hoạt động trong 3 mode khác nhau .8255A-5 có thể nối ghép bất kỳ thiết bị vào ra kiểu TTL và tương thích với 8088 .8255A-5 thường được sử dụng để ghép nối với bàn phím và cổng máy in song song trong các máy PC . Ba cổng vào ra của nó được lập trình thành các nhóm 12 chân .Nhóm A bao gồm cổng A ( PA7 - PA0 ) và nửa cao của cổng C (PC7 - PC4 ) , nhóm B bao gồm cổng B (PB7 - PB0 ) và nửa thấp của cổng C ( PC3 - PC0 ). 8255A-5 được chọn bằng chân CS của nó để lập trình và phục vụ việc ghi đọc ra cổng I/O . Hai chân A1,A0 chọn thanh ghi nội để lập trình hoặc hoạt động .Trong máy PC 8255A-5 được giải mã tại địa chỉ 60h-63h . Ðể 8255A-5 có thể đọc ghi thì chân CS phải ở mức logic 0 và địa chỉ I/O phải được nối với chân A1 và A0 ,không cần quan tâm đến các chân địa chỉ cổng còn lại và được giải mã bên ngoài để chọn 8255A-5 .
2/ phương thức lập trình.
để có thể lập trình con 8255A này chúng ta cần phải quan tâm tới các chân chọn cổng
A1,A0,va CS.
chức năng của nó được tóm tắt như sau;
[img]
[/img]
ngoài ra ta còn quan tâm tới các khối:
* Khối đệm bus dữ liệu .
Ðây là bộ đệm 8 bit ,hai chiều được sử dụng để nối ghép 8255 với bus hệ thống . Dữ liệu được gửi đi hay được tiếp nhận vào buffer thông qua việc thực hiện lệnh IN (Input ) hoặc OUT (output )của CPU .Các từ điều khiển và thông tin trạng thái cũng được vận chuyển qua bộ đệm bus dữ liệu .
* Khối logic điều khiển ghi/đọc .
Chức năng của khối này là điều khiển việc trao đổi bên trong và bên ngoài của các từ dữ liệu , từ điều khiển hay thông tin trạng thái .
- CS = 0: tín hiệu chọn mạch cho phép CPU điều khiển 8255
- RD =0 : Tín hiệu cho phép 8255 gửi dữ liệu hay thông tin trạng thái cho CPU thông qua bus dữ liệu .Nghĩa là CPU đọc thông tin này từ 8255 .
- WR = 0 : Tín hiệu cho phép CPU ghi thông tin trạng thái (dữ liệu hoặc từ điều khiển vào 8255 ).
- A0, A1 : Các tín hiệu vào này chọn một trong ba cổng làm việc , hoặc thanh ghi điều khiển kết hợp với các tín hiệu RD ,WR thực hiện thao tác đọc ghi các cổng hoặc thanh ghi điều khiển . Bình thường các bit này được nối với các bit thấp nhất của bus địa chỉ (A0 - A1 ) .
- RESET =1 : Xoá tất cả các thanh ghi bên trong của 8255 ,kể cả thanh ghi điều khiển (control register) và tất cả các cổng (A,B,C ) được đặt về chế độ các cổng vào .
* Khối điều khiển nhóm A và nhóm B.
Mỗi cổng trong số các cổng của vi mạch (cổng A ,B,C ) đều hoạt động theo chương trình điều khiển . Quá trình như sau, CPU 8088 gửi một từ điều khiển cho 8255 . Từ điều khiển này chứa các thông tin như : chế độ hoạt động ,xác lập hoặc khởi tạo các bit...điều khiển hoạt động của 8255 . Mỗi một khối điều khiển ( nhóm A và nhóm B ) tiếp nhận lệnh từ khối logic điều khiển đọc /ghi và nhận từ điều khiển từ bus dữ liệu bên trong vi mạch và tạo ra các lệnh tương ứng cho các cổng .
Nhóm A bao gồm cổng A và cổng C ( 4 bit cao C7 - C4 ).
Nhóm B bao gồm cổng B và cổng C ( 4 bit thấp C3 - C0 ).
Ðối với thanh ghi từ điều khiển ( control word register ) , chúng ta chỉ có thể ghi mà thôi ,nghĩa là không thể đọc được nội dung của nó .
* Các cổng A ,B,C .
Cổng A : Ðây là cổng ra đệm và chốt 8 bit dữ liệu ,và là cổng vào chốt (latch).
Cổng B: Ðây là cổng vào/ra chốt/đệm 8 bit dữ liệu và đệm vào 8 bit dữ liệu
Cổng C : Ðầu ra 8 bit dữ liệu chốt /đệm và đầu vào đệm 8 bit.Cổng này có thể được chia thành hai cổng chốt 4 bit riêng biệt và được sử dụng để đưa ra tín hiệu điều khiển và nhận vào tín hiệu trạng thái phối hợp với cổng A và cổng B.
và điều chú ý nhất là chúng ta quan tâm tới thanh ghi từ điều khiển D:
D7 chính là chân cho phép chọn từ điều khiển (khi lập trình bắt buôc D7 =1)
D6,D5 là chân chọn chế độ hoạt động.
Mode 0 : Chế độ vào ra cơ bản
Mode 1 : Chế độ vào ra có hội thoại (Strobe Input/Output )
Mode 2 : Chế độ vào ra bus hai chiều .
Hình vẽ sau minh hoạ các chế độ hoạt động cơ bản của 8255 :
chân D4: là chân chọn cổng A,nếu D4=1 thì in data,D4=0 thì out data.
chân D3 nửa cao của cổng C (có 4 bit)
chân D2:chân con chế độ
chân D1 là chân cổng B,
chân D0 là chân nửa thấp của cổng C
nói chung lôm la là vậy.
khi chân nào set lên 1 thì nó có chức năng in data
còn bằng 0 tì out data.
khi nghép nối ,thì với nhiều phương thức lập trình khác nhau thì người ta nghép nối khác nhau.có thể nhờ 74ls373 để chốt dữ liệu hoăc ko cần mà ta có thể ghép nối trực tiếp.
ở đây mình sẽ đưa ra cách ghep nối và lập trình trực tiếp.
hình ảnh ghép nối:
[img]
[/img]
với cách ghép nối như thế này bài lập trình của mình như sau:
à với các hiệu ứng thì bạn cũng có thể làm như các chân của 8051 nhá.
thích led nào sáng tắt tùy ý.ok
- Code:
-
#include <REGX51.H>
sbit A0 = P3^0; //dat cac chan A0,A1,WR,RD tuong ung voi cac port cua P3.
sbit A1 = P3^1;
sbit WRITE = P3^6;
sbit READ = P3^7;
int i,n;
//==== delay===//
void delay(unsigned int ms)
{
unsigned int j,i;
for(i=0;i<ms;i++)
for(j=0;j<125;j++)
{;}
}
void nhap_nhay()
{
A0=0;
A1=0;
P1=0X01;
WRITE=0; WRITE=1;
delay(100);
P1=0X02;
WRITE=0; WRITE=1;
delay(100);
P1=0X04;
WRITE=0; WRITE=1;
delay(100);
P1=0X08;
WRITE=0; WRITE=1;
delay(100);
P1=0X10;
WRITE=0; WRITE=1;
delay(100);
P1=0X20;
WRITE=0; WRITE=1;
delay(100);
P1=0X40;
WRITE=0; WRITE=1;
delay(100);
P1=0X80;
WRITE=0; WRITE=1;
delay(100);
}
//===== SANG TUNG LED=======//
void sang()
{
P1=0X01;
for(i=0;i<8;i++)
{
A0=1;
A1=0;
P1=P1<<1 ;
WRITE=0;
WRITE=1;
delay(100);
}
}
// ======= ca ba cong nhap nhay =======//
void nhay_deu()
{
for(n=0;n<6;n++)
{
A0=0;
A1=1;
P1=0Xf0;
delay(100);
WRITE=0;
WRITE=1;
P1=0Xff;
WRITE=0;
WRITE=1;
delay(100);
}
}
//======= main========//
void main()
{
WRITE=1; //SET RD,WR len muc cao khi khoi dong 8255
READ=1;
A0=1; // chon tu dieu khien,cho phep tu dieu khien hoat dong
A1=1;
P1=0x80; //out tat ca data ra cac port A,B,C.
WRITE=0; // WR=0,1 de tao xung de xuat du lieu.
WRITE=1;
delay(1);
while(1) // vong lap vo han
{
nhay_deu();
sang();
nhap_nhay();
}
}