3.2 Các IC sử dụng trong việc mở rộng Port
3.2.1.3 Cấu tạo và nguyên tắc hoạt động
3.2.1.3.1 Cấu tạo:
Hình 50: Cấu tạo IC 74HC5959
Bên trong gồm 8 con FlipFlop D mắc nối tiếp . Từ tầng 0 - 7 cho ngõ ra từ Q0 - Q7 .
3.2.1.3.2 Nguyên tắc hoạt động:Bảng sự thật: Bảng sự thật: Bảng 16: Bảng sự thật IC 74HC595 Trong đó: + H: Mức điện áp cao. + L: Mức điện áp thấp.
+ ↑: Chuyển đổi điện áp từ thấp lên cao. + ↓: Chuyển đổi điện áp từ cao xuống thấp. + n.c.: Khơng thay đổi.
Dạng sóng điều khiển:
Hình 51: Dạng sóng điều khiển IC 74HC595
Hình 52: Ngun lý hoạt động
Để IC hoạt động ta phải nối chân số 10 lên nguồn 5V (không tác động Reset) và nối chân số 13 xuống Mass ( cho phép ngõ ra ). Với dữ liệu 8 bit dữ liệu được đưa vào chân 14 của IC, cứ sau mỗi xung clock được đưa vào chân số 11 của IC thì bit thứ 1 của dữ liệu đầu vào được đưa ra ở ngõ ra. Vậy sau 8 xung clock cung cấp cho chân số 11 thì 8 bit dữ liệu đầu vào sẽ được đưa ra ở ngõ ra từ Q0 – Q7. Khi 8 bit dữ liệu được đưa ra ở ngõ ra như vậy, chúng ta cần 1 xung clock cung cấp cho chân số 12 của IC để chốt dữ liệu đầu ra (Dù có thêm xung clock cung cấp cho chân số 11 thì đầu ra vẫn khơng thay đổi). Lúc này ta sẽ có 8 bit dữ liệu đầu ra từ Q0 - Q7 trùng khớp với 8 bit dữ liệu được đưa ở đầu vào. Muốn dịch bao nhiêu bit thì ta cần bấy nhiêu xung clock rồi đưa 1 xung chốt để đẩy dữ liệu ra ngoài.
Ở đây nếu muốn dịch số bit lớn hơn 8 thì ta cần nối tiếp thêm IC 74HC595. Nếu là 16 bit thì cần 2 IC, 24 bit thì 3 IC, 32 bit thì 4 IC …. Ta dùng chân số 9 của con thứ nhất nối tiếp vào chân dữ liệu đầu vào của con thứ 2 (chân số 14) và dùng chân số 9 của con thứ 2 nối tiếp vào chân dữ liệu đầu vào của con thứ 3, cứ thế tiếp tục. Muốn dịch bao nhiêu bit thì cần bấy nhiêu xung clock và 1 xung chốt để đẩy dữ liệu ra ngồi. Ở đồ án này, nhóm chỉ cần dịch 16 bit dùng 2 IC 74HC595 nối tiếp. Dùng 3 tầng như thế để có dịch được 48 bit.
3.2.2 IC 2803: 3.2.2.1 Giới thiệu:
IC 74HC595 có các đặc điểm sau: + IC có 18 chân.
+ Vi mạch gồm 8 cổng đệm đảo, đầu ra cực thu hở. + Dòng ngõ ra lên tới 500mA.
+ Điện áp ngõ ra lên tới 95V.
Hình 53: Sơ đồ chân IC 2803
Chức năng từng chân:
+ Chân 1 - 8: Điện áp ngõ vào. + Chân 9: Nối Mass.
+ Chân 10: Nối nguồn chuyển đổi (5V,12V). +Chân 11 – 18: Điện áp đảo ngõ ra.
3.2.2.3 Nguyên lý hoạt động:
Hình 54: Nguyên lý hoạt động của IC 2803
Vì mạch chỉ cần dùng điện áp 5V, nên ở đây nối chân 10 của IC2803 lên điện áp 5V (muốn dùng điện áp bao nhiêu thì nối chân số 10 với điện áp đó). Khi có điện áp ngõ vào là 0V IC sẽ đệm lên thành 5V và khi điện áp ngõ vào nhỏ hơn 5V IC sẽ đệm xuống thành 0V. Như thế sẽ cho ra 2 mức logic 1 và 0 để chúng ta có thể sử dụng trong các mạch điều khiển khác.
3.3 Phưong pháp mở rộng Port: 3.3.1 Sơ đồ nguyên lý:
Hình 55: Sơ đồ nguyên lý mở rộng Port
3.3.2 Nguyên lý hoạt động:
Ở đây ta dùng 3 tầng thanh ghi dịch, mỗi tầng sử dụng dịch 16 bit, vậy tổng cộng ta có thể sử dụng 48 bit ghi dịch. Dùng các chân vi điều khiển MSP430F2274 qua IC 2803 để điều khiển các thanh ghi dịch. Chân số 9 của IC 74HC595 thứ 1 nối với chân số 14 của IC 74HC595 thứ 2 tạo thành tầng thứ nhất 16 bit. Chân số 9 của IC 74HC595 thứ 3 nối với chân số 14 của IC 74HC595 thứ 4 tạo thành tầng thứ hai 16 bit. Chân số 9 của IC 74HC595 thứ 5 nối với chân số 14 của IC 74HC595 thứ 6 tạo thành tầng thứ ba 16 bit.
Hình 56: Sơ đồ mạch in mở rộng Port
Hình 57: Mạch hồn chỉnh
3.3.5 Giới thiệu bộ Kit thí nghiệm:
Bộ Kit thí nghiệm bao gồm: + Nguồn cung cấp 12V. + 32 Led đơn có chung Vcc.
+ 8 Led 7 đoạn ANot chung, theo kiểu quét Led. Điều khiển với mức logic 0.
+ 1 LCD 16x2, với 8 đường dữ liệu, 3 đường điều khiển.
+ 1 Led ma trận 8x8, với 2x8 đường điều khiển cột ( màu xanh hoặc đỏ) và 8 đường điều khiển hàng. Điều khiển với mức logic 1.
+ 1 ma trận phím 4x4 với 8 đường điều khiển.
3.4 Các bài tập ứng dụng:3.4.1 Quy ước chung: 3.4.1 Quy ước chung:
+ Chân 7 của eZ430-RF2500T là chân xung clock của 3 tầng ghi dịch. + Chân 12 của eZ430-RF2500T là chân Mass chung.
+ Chân 18 của eZ430-RF2500T là chân dữ liệu vào của tầng thứ nhất thanh ghi dịch.
+ Chân 16 của eZ430-RF2500T là chân điều khiển xung chốt của tầng thứ nhất thanh ghi dịch.
+ Chân 15 của eZ430-RF2500T là chân dữ liệu vào của tầng thứ hai thanh ghi dịch.
+ Chân 17 của eZ430-RF2500T là chân điều khiển xung chốt của tầng thứ hai thanh ghi dịch.
+ Chân 9 của eZ430-RF2500T là chân dữ liệu vào của tầng thứ ba thanh ghi dịch.
+ Chân 11 của eZ430-RF2500T là chân điều khiển xung chốt của tầng thứ ba thanh ghi dịch.
+ Chân 5, 6, 8, 10 của của eZ430-RF2500T được nối qua IC 2803 dùng để điều khiển tuỳ ý.
+ Chân 13,14 không sử dụng được.
3.4.2 Các lưu ý trước khi sử dụng:3.4.2.1 Cách truy xuất bit trong C: 3.4.2.1 Cách truy xuất bit trong C:
Như đã nghiêm cứu ở trên, vi điểu khiển MSP430 thường truy xuất Byte, muốn truy xuất bit ta phải định nghĩa lại vùng nhớ của nó.
Một cách truy xuất bit được sử dụng là:
union reg { // Khai báo 1 byte với 8 bit struct bit { // Khai báo bit trong 1 byte unsigned char b0:1; // Khai báo bit thứ 1
unsigned char b1:1; // Khai báo bit thứ 2 unsigned char b2:1; // Khai báo bit thứ 3
unsigned char b3:1; // Khai báo bit thứ 4 unsigned char b4:1; // Khai báo bit thứ 5 unsigned char b5:1; // Khai báo bit thứ 6 unsigned char b6:1; // Khai báo bit thứ 7 unsigned char b7:1; // Khai báo bit thứ 8 }_BIT; // Tên của bit trong byte unsigned char _BYTE; // Tên của byte
};
Ví dụ: Để khai báo chân xuất / nhập của Port 2 là:
union reg* _P2_DIRECT = (union reg*)0x2A ; // Định nghĩa vùng nhớ 0x2A là _P2_DIRECT, dùng điều khiển Port 2 là xuất hay nhập.
union reg* _P2_IN = (union reg*)0x28 ; // Định nghĩa vùng nhớ 0x28 là _P2_IN, dùng điều khiển các bit nhập của Port 2.
3.4.2.2 Cách mở rộng Port:
Ví dụ: Đưa dữ liệu 0xA4BC ra tầng thứ hai của thanh ghi dịch: Lưu đồ:
Kết nối phần cứng:
+ Nối chân 7 của eZ430-RF2500T làm chân xung clock tầng ghi dịch. + Nối chân 15 của eZ430-RF2500T làm chân dữ liệu vào của tầng thứ hai thanh ghi dịch.
+ Nối chân 17 của eZ430-RF2500T làm chân điều khiển xung chốt của tầng thứ hai thanh ghi dịch.
+ Nối chân 12 của eZ430-RF2500T làm chân Mass chung. Chương trình:
void MoRongP2(unsigned int q); // Khai báo hàm mở rộng tầng thứ hai union reg { // Khai báo 1 byte 8 bit
struct bit { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }_BIT;
unsigned char _BYTE; };
union reg* _P3_DIRECT = (union reg*)0x1A ; // Định nghĩa vùng nhớ 0x1A union reg* _P3_OUT = (union reg*)0x19 ; // Định nghĩa vùng nhớ 0x19 union reg* _P2_DIRECT = (union reg*)0x2A ; // Định nghĩa vùng nhớ 0x2A union reg* _P2_OUT = (union reg*)0x29 ; // Định nghĩa vùng nhớ 0x29
int main(void) // Chương trình chính
{
WDTCTL = WDTPW + WDTHOLD; // Dừng ngắt
_P3_DIRECT->_BYTE = 0xff; // Định nghĩa Port 3 là xuất _P2_DIRECT->_BYTE = 0xff; // Định nghĩa Port 2 là xuất volatile unsigned int a; // Biến khai báo trong RAM
{
a=0xA4BC; // Gán a = A4BC
MoRongP2(a); // Mở rộng tầng 2 với 16 bit của a
} }
void MoRongP2(unsigned int e) // Hàm mở rộng tầng thứ 2 {
volatile unsigned int f,g,h; // Biến khai báo trong RAM f=0x8000; // Gán f=8000
g=16; // Cho g=16
while(g>0) // Trong khi g>0 thì thực hiện {
h = e&f; // h = e and f if ( h == f) // Nếu h=f {
}
Else // ngược lại h không =f {
_P3_OUT->_BIT.b2=0; // bit 2 port 3 mức 0 }
_P2_OUT->_BIT.b4=0; // bit 4 port 2 mức 1(xung clock) _P2_OUT->_BIT.b4=1; // bit 4 port 2 mức 0
f=f>>1; // Xoay phải f g--; // Giảm g đi 1 }
_P3_OUT->_BIT.b0=0; // bit 04 port 3 mức 1(xung chốt) _P3_OUT->_BIT.b0=1; // bit 04 port 3 mức 1
}
3.4.3 Các bài tập về Led đơn:
Bài 1: Điều khiển 16 led chớp tắt. Lưu đồ:
Kết nối phần cứng:
+ Nối 16 bit của tầng mở rộng thứ 2 với 16 Led đơn. Chương trình:
#include "msp430x22x4.h" // Khai báo chip void Delay(unsigned int Value); // Khai báo hàm Delay
void MoRongP2(unsigned int e); // Khai báo hàm mở rộng tầng 2 union reg { // Khai báo 1 byte 8 bit
struct bit { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }_BIT;
unsigned char _BYTE; };
union reg* _P3_DIRECT = (union reg*)0x1A ; union reg* _P3_OUT = (union reg*)0x19 ; union reg* _P2_DIRECT = (union reg*)0x2A ; union reg* _P2_OUT = (union reg*)0x29 ;
int main(void) // Chương trình chính {
WDTCTL = WDTPW + WDTHOLD; // Dừng ngắt _P3_DIRECT->_BYTE = 0xff;
_P2_DIRECT->_BYTE = 0xff;
volatile unsigned int n; // Bien khai báo trong RAM {
for(;;) // Vịng lặp vơ định {
n=0xffff; // 16 Led sáng
MoRongP2(n); // Gọi hàm mở rộng tầng 2 với giá trị n Delay(10000); // Gọi hàm delay với giá trị 10000 n=0x0000; // 16 Led tắt MoRongP2(n); Delay(10000); } } }
void MoRongP2(unsigned int e) // Hàm mở rộng tầng 2 {
volatile unsigned int f,g,h; f=0x8000;
g=16; while(g>0) { h = e&f; if ( h == f) { _P3_OUT->_BIT.b2=1; } else { _P3_OUT->_BIT.b2=0; } _P2_OUT->_BIT.b4=0; _P2_OUT->_BIT.b4=1; f=f>>1; g--; } _P3_OUT->_BIT.b0=0; _P3_OUT->_BIT.b0=1; }
void Delay(unsigned int Value) // Hàm delay {
volatile unsigned int l = 0; for(l=Value; l>0; l--); }
Bài 2: Điều khiển điểm sáng chạy 16 Led đơn: Lưu đồ:
Kết nối phần cứng:
+ Nối 16 bit của tầng mở rộng thứ 2 với 16 Led đơn. Chương trình:
#include "msp430x22x4.h" // Khai báo chip void Delay(unsigned int Value); // Khai báo hàm Delay
void MoRongP2(unsigned int e); // Khai báo hàm mở rộng tầng 2 union reg { // Khai báo 1 byte 8 bit
struct bit { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }_BIT;
unsigned char _BYTE; };
union reg* _P3_DIRECT = (union reg*)0x1A ; union reg* _P3_OUT = (union reg*)0x19 ; union reg* _P2_DIRECT = (union reg*)0x2A ; union reg* _P2_OUT = (union reg*)0x29 ;
int main(void) // Chương trình chính {
WDTCTL = WDTPW + WDTHOLD; // Dừng ngắt _P3_DIRECT->_BYTE = 0xff;
_P2_DIRECT->_BYTE = 0xff;
volatile unsigned int n,p; // Bien khai báo trong RAM {
for(;;) // Vịng lặp vơ định {
n=0x0001; // Gán n = 0001; p=16; // Cho p =16;
while(p>0) // Trong khi p>0 thì {
MoRongP2(n); // Gọi hàm mở rộng tầng 2 với giá trị n Delay(10000); // Gọi hàm Delay với giá trị 10000
n=n<<1; // Xoay trái n p--; // Giảm p đi 1
} } }
void MoRongP2(unsigned int e) // Hàm mở rộng tầng 2 {
volatile unsigned int f,g,h; f=0x8000; g=16; while(g>0) { h = e&f; if ( h == f) { _P3_OUT->_BIT.b2=1; } else { _P3_OUT->_BIT.b2=0; } _P2_OUT->_BIT.b4=0; _P2_OUT->_BIT.b4=1; f=f>>1; g--; } _P3_OUT->_BIT.b0=0; _P3_OUT->_BIT.b0=1; }
void Delay(unsigned int Value) // Hàm delay {
volatile unsigned int l = 0; for(l=Value; l>0; l--); }
Bài 3: Điều khiển điểm sáng chạy 32 Led đơn: Lưu đồ:
+ Nối 16 bit của tầng mở rộng thứ 2 với 16 Led đơn.
+ Nối 16 bit của tầng mở rộng thứ 3 với 16 Led đơn cịn lại. Chương trình:
#include "msp430x22x4.h" // Khai báo chip void Delay(unsigned int Value); // Khai báo hàm Delay
void MoRongP2(unsigned int e); // Khai báo hàm mở rộng tầng 2 void MoRongP3(unsigned int i); // Khai báo hàm mở rộng tầng 3 union reg { // Khai báo 1 byte 8 bit
struct bit { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }_BIT;
unsigned char _BYTE; };
union reg* _P4_DIRECT = (union reg*)0x1E ; union reg* _P4_OUT = (union reg*)0x1D ; union reg* _P3_DIRECT = (union reg*)0x1A ; union reg* _P3_OUT = (union reg*)0x19 ; union reg* _P2_DIRECT = (union reg*)0x2A ; union reg* _P2_OUT = (union reg*)0x29 ;
int main(void) // Chương trình chính
{
WDTCTL = WDTPW + WDTHOLD; // Dừng ngắt _P4_DIRECT->_BYTE = 0xff;
_P3_DIRECT->_BYTE = 0xff; _P2_DIRECT->_BYTE = 0xff;
volatile unsigned int n,m,q,p; // Bien khai báo trong RAM { for(;;) // Vịng lặp vơ định { n=0x0001; p=16; while(p>0) { MoRongP2(n); Delay(10000); n=n<<1; p--; } MoRongP2(n); q=0x0001;
m=17; while(m>0) { MoRongP3(n); Delay(10000); q=q<<1; m--; MoRongP3(q); } } }
void MoRongP2(unsigned int e) // Hàm mở rộng tầng 2 {
volatile unsigned int f,g,h; f=0x8000; g=16; while(g>0) { h = e&f; if ( h == f) { _P3_OUT->_BIT.b2=1; } else { _P3_OUT->_BIT.b2=0; } _P2_OUT->_BIT.b4=0; _P2_OUT->_BIT.b4=1; f=f>>1; g--; } _P3_OUT->_BIT.b0=0; _P3_OUT->_BIT.b0=1; }
void MoRongP3(unsigned int i) // Hàm mở rộng tầng 3 {
volatile unsigned int j,k,l; j=0x8000; k=16; while(k>0) { l = i&j; if ( l == j) { _P4_OUT->_BIT.b4=1; } else
{ _P4_OUT->_BIT.b4=0; } _P2_OUT->_BIT.b4=0; _P2_OUT->_BIT.b4=1; j=j>>1; k--; } _P4_OUT->_BIT.b6=0; _P4_OUT->_BIT.b6=1; }
void Delay(unsigned int Value) // Hàm delay {
volatile unsigned int l = 0; for(l=Value; l>0; l--); }
Bài 4: Điều khiển 32 Led đơn sáng dần: Lưu đồ:
Kết nối phần cứng:
+ Nối 16 bit của tầng mở rộng thứ 3 với 16 Led đơn còn lại. Chương trình:
#include "msp430x22x4.h" void MoRongP2(unsigned int e); void MoRongP3(unsigned int i); void Delay(unsigned int Value); union reg { struct bit { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }_BIT;
unsigned char _BYTE; };
union reg* _P4_DIRECT = (union reg*)0x1E ; union reg* _P4_OUT = (union reg*)0x1D ; union reg* _P3_DIRECT = (union reg*)0x1A ; union reg* _P3_OUT = (union reg*)0x19 ; union reg* _P2_DIRECT = (union reg*)0x2A ; union reg* _P2_OUT = (union reg*)0x29 ;
int main(void) // Chương trình chính
{
WDTCTL = WDTPW + WDTHOLD; _P4_DIRECT->_BYTE = 0xff;
_P3_DIRECT->_BYTE = 0xff; _P2_DIRECT->_BYTE = 0xff; volatile unsigned int o,n,q,m,p,t,s; for(;;) { n=0x0000; m=0x0001; q=16; while (q>0) { n=n|m; MoRongP2(n) Delay(10000);; m=m<<1; q--; }
MoRongP2(n); p=0x0000; t=0x0001; s=16; while (s>0) { p=p|t; MoRongP3(p); Delay(10000); t=t<<1; s--; } MoRongP3(0x0000); } }
void MoRongP2(unsigned int e) // Hàm mở rộng tầng 2 {
volatile unsigned int f,g,h; f=0x8000; g=16; while(g>0) { h = e&f; if ( h == f) { _P3_OUT->_BIT.b2=1; } else { _P3_OUT->_BIT.b2=0; } _P2_OUT->_BIT.b4=0; _P2_OUT->_BIT.b4=1; f=f>>1; g--; } _P3_OUT->_BIT.b0=0; _P3_OUT->_BIT.b0=1; }
void MoRongP3(unsigned int i) // Hàm mở rộng tầng 3 {
volatile unsigned int j,k,l; j=0x8000; k=16; while(k>0) { l = i&j; if ( l == j)
{ _P4_OUT->_BIT.b4=1; } else { _P4_OUT->_BIT.b4=0; } _P2_OUT->_BIT.b4=0; _P2_OUT->_BIT.b4=1; j=j>>1; k--; } _P4_OUT->_BIT.b6=0; _P4_OUT->_BIT.b6=1; }
void Delay(unsigned int Value) // Hàm DeLay