Mỗi vi điều khiển khác nhau có cấu hình các port cũng khác nhau, phần này sẽ khảo sát các port của vi điều khiển PIC bao gồm port A, B, C, D , E và các lệnh ngôn ngữ C liên quan đến các
Trang 1BÀI 4
GIỚI THIỆU
CÁC PORT XUẤT NHẬP IO
PORTA và thanh ghi TRISA
PORTB và thanh ghi TRISB
PORTC và thanh ghi TRISC
PORTD và thanh ghi TRISD
PORTE và thanh ghi TRISE
LỆNH SET_TRIS_X() - LỆNH ĐỊNH CẤU HÌNH VÀO/RA CHO PORT
LỆNH OUTPUT_X(VALUE) - XUẤT DỮ LIIỆU 8 BIT RA PORT
LỆNH OUTPUT_HIGH(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT LÊN MỨC CAO
LỆNH OUTPUT_LOW(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT XUỐNG MỨC 0
LỆNH OUTPUT_TOGGLE(PIN) - LỆNH ĐẢO TRẠNG THÁI CỦA 1 CHÂN
LỆNH OUTPUT_BIT(PIN,VALUE) - LỆNH XUẤT DỮ LIỆU RA 1 CHÂN
LỆNH value = GET_TRIS_x() - LỆNH ĐỌC THANH GHI ĐỊNH CẤU HÌNH
LỆNH value = INPUT(pin) - LỆNH ĐỌC DỮ LIỆU TỪ 1 CHÂN CỦA PORT
LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
Value = INPUT_x()
LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
LỆNH OUTPUT_DRIVE(PIN) - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
LỆNH OUTPUT_FLOAT(PIN) - LỆNH THÃ NỖI CHÂN TÍN HIỆU
LỆNH PORT_B_PULLUP( ) - LỆNH TREO PORT B QUA ĐIỆN TRỞ LÊN NGUỒN
Trang 2I GIỚI THIỆU
Vi điều khiển có các port để xuất nhập dữ liệu giao tiếp với các đối tượng điều khiển Tín hiệu điều
khiển từ CPU gởi ra port để điều khiển, đồng thời có các port nhận dữ liệu về để xử lý Trong một hệ thống
luôn có các tín hiệu vào ra ví như hệ thống điều khiển robo như hình sau:
Hình 4-1: Sơ đồ kết nối port với đối tượng điều khiển
Mỗi vi điều khiển khác nhau có cấu hình các port cũng khác nhau, phần này sẽ khảo sát các port của
vi điều khiển PIC bao gồm port A, B, C, D , E và các lệnh ngôn ngữ C liên quan đến các port
Mỗi port của vi điều khiển PIC gồm có thanh ghi port và thanh ghi định hướng cho Port ví dụ như
hình 4-2 là PORTA và TRISA Bit của thanh ghi định hướng TRIS bằng 0 thì port có chức năng xuất dữ
liệu, nếu bằng 1 thì có chức năng nhập dữ liệu
Chú ý: '0' tương ứng với 'OUT', '1' tương ứng với 'IN'
Hình 4-2: Sơ đồ kết nối port: xuất nhập tín hiệu điều khiển
Phần tiếp sẽ khảo sát chi tiết từng port
II CÁC PORT XUẤT NHẬP (IO)
1 PORTA và thanh ghi TRISA:
Trang 3PORTA là port hai chiều 6 bit, thanh ghi định hướng là TRISA
Chân RA4 được đa hợp với ngõ vào xung clock của module Timer0 có tên là RA4/T0CKI – có cấu hình Schmitt trigger và cực máng để hở Tất cả các chân còn lại của PORTA ở chuẩn TTL khi nó là ngõ vào
và khi xuất dữ liệu thì theo chuẩn CMOS
Hình 4-3: Sơ đồ mạch chân RA3:RA0 Hình 4-4: Sơ đồ mạch chân RA4/T0CKI
Những chân khác của PortA được đa hợp với các ngõ vào tương tự cho các bộ chuyển đổi A/D và các
bộ so sánh Thanh ghi ADCON1 sẽ thiết lập các bit cho portA làm việc tương tự hay số
Thanh ghi TRISA điều khiển hướng cho PortA cho dù portA sử dụng cho ngõ vào tương tự Khi sử dụng portA là ngõ vào tương tự thì bit tương ứng trong thanh ghi TRISA phải bằng 1
Các chức năng của PortA
TÊN BIT# KIỂU ĐỆM CHỨC NĂNG
RA0/AN0 Bit 0 TTL I/O
RA1/AN1 Bit 1 TTL I/O
RA2/AN2/VREF-/CVREF Bit 2 TTL I/O hoặc VREF- hoặc VCREF
RA3/AN3/VREF+ Bit 3 TTL I/O hoặc VREF+
RA4/T0CKI/C1OUT Bit 4 TTL I/O hoặc ngõ vào xung clock cho
Timer0 hoặc ngõ ra bộ so sánh 1
Trang 4RA5/AN4/ /C2OUT Bit 5 TTL I/O hoặc ngõ vào tương tự
Hình 4-5: Sơ đồ mạch chân RA5
Tóm tắt các thanh ghi liên kết với PortA
2 PORTB và thanh ghi TRISB:
PortB là port hai chiều 8 bit Thanh ghi định hướng là TRISB
Ba chân của PortB là RB3/PGM, RB6/PGC và RB7/PGD được đa hợp với mạch điện gỡ rối bên trong
và mạnh lập trình điện áp thấp để nạp chương trình vào bộ nhớ nội Sơ đồ kết nối mạch nạp và mạch gỡ rối:
SS
Trang 5Hình 4-6: Các chân PortB giao tiếp với mạch nạp, gỡ rối
Mỗi chân của PortB đều có điện trở kéo lên Bit (OPTION_REG<7>) nếu bằng 0 thì sẽ treo tất cả các port qua điện trở lên nguồn Khi PortB được thiết lập là các ngõ ra thì sẽ tự động tắt chức năng điện trở kéo lên, tương tự khi CPU bị reset
Hình 4-6: Sơ đồ kết nối port với đối tượng điều khiển
Khi port dùng để kết nối với nút nhấn thì cần phải dùng điện trở kéo lên nguồn để tạo mức logic 1, khi nhấn nút thì ngắn mạch ngõ vào xuống mức 0, xem hình 4-6 Trong ứng dụng này phải cần điện trở kéo lên Với ứng dụng port điều khiển đối tượng là led thì không cần dùng điện trở kéo lên
Bốn chân từ RB4 đến RB7 phát sinh ngắt khi có sự thay đổi mức logic Chỉ có những chân được thiết lập ở cấu hình là ngõ vào thì mới có chức năng ngắt Các chân ngõ vào (RB7:RB4) được so sánh với giá trị
cũ đã được chốt trong lần đọc trước của PortB Các ngõ ra không trùng nhau của các chân RB4:RB7 được
OR lại với nhau để tạo ngắt ở PortB với bit cờ báo ngắt RBIF (INTCON<0>)
Ngắt portB có thể kích hoạt vi điều khiển trở lại trạng thái hoạt động nếu đang ở chế độ ngủ (SLEEP) Trong chương trình phục vụ ngắt thì ngắt có thể xóa bằng các cách sau:
o Bất kỳ lệnh đọc hay ghi PortB Điều này sẽ kết thúc điều kiện không tương thích
o Xóa bit cờ RBIF
Điều kiện không tương thích sẽ tiếp tục làm cờ báo ngắt RBIF bằng 1 Khi đọc PortB sẽ chấm dứt điều kiện không tương thích và cho phép xóa bit cờ báo ngắt RBIF
RBPU
Trang 6Hình 4-12: Sơ đồ mạch các chân RB3:RB0 Hình 4-13: Sơ đồ mạch các chân RB7:RB4
Ngắt không tương thích của PortB có điện trở kéo lên dễ dàng cho phép giao tiếp với phím hoặc bàn
phím ma trận
Hình 4-14: Sơ đồ kết nối port với đối tượng điều khiển
Tên Bit# Kiểu đệm Chức năng
RB0/INT Bit 0 TTL/ST I/O hoặc ngõ vào ngắt Có lập trình điện trở kéo lên
RB1 Bit 1 TTL I/O Có lập trình điện trở kéo lên
RB2 Bit 2 TTL I/O Có lập trình điện trở kéo lên
RB3/PGM Bit 3 TTL I/O hoặc lập trình ở chế độ LVP
Có lập trình điện trở kéo lên
RB4 Bit 4 TTL I/O (ngắt khi có thay đổi) Có lập trình điện trở kéo lên
RB5 Bit 5 TTL I/O (ngắt khi có thay đổi) Có lập trình điện trở kéo lên
RB6/PGC Bit 5 TTL/ST I/O (ngắt khi có thay đổi) hoặc chân mạch gỡ rối
Có lập trình điện trở kéo lên Xung lập trình nối tiếp
RB7/PGD Bit 5 TTL/ST I/O (ngắt khi có thay đổi) hoặc chân mạch gỡ rối
Trang 7Có lập trình điện trở kéo lên Dữ liệu lập trình nối tiếp
Các thanh ghi liên quan đến portB:
3 PORTC và thanh ghi TRISC:
PortC là port hai chiều 8 bit Thanh ghi định hướng là TRISC Khi bit TRISC =1 thì PORTC là port nhập, khi bit TRISC= 0 thì PORTC là port xuất
PortC đa hợp với các chức năng ngoại vi, các chân PortC có mạch đệm Schmitt Trigger ở ngõ vào Khi khối I2C được cho phép thì các chân PORTC<4:3> có thể được định cấu hình ở các mức I2C hoặc mức SMBUS bằng cách sử dụng bit CKE (SSPSTAT<6>)
Khi cho phép các chức năng ngoại vi nên chú ý đến các bit TRISC cho mỗi chân của PORTC Người
sử dụng tham chiếu tới phần thiết bị ngoại vi tương ứng để thiết lập cho đúng bit TRISC
Hình 4-15: Sơ đồ các chân RC7:RC5 và RC2:RC0 Hình 4-16: Sơ đồ mạch các chân RC4:RC3
ĐỆM
CHỨC NĂNG
RC0/T1OSO/T1CKI Bit 0 ST I/O hoặc ngõ ra bộ dao động
Trang 8Timer1/ngõ vào xung của Timer1
RC1/T1OSI/CCP2 Bit 1 ST I/O hoặc ngõ vào bộ dao động
Timer1/ngõ vào Capture, ngõ ra compare2/ngõ ra PWM
RC2/CCP1 Bit 2 ST I/O hoặc ngõ vào Capture1/ngõ ra
Compare1/ngõ ra PWM
RC3/SCK/SCL Bit 3 ST RC3 cũng có thể là xung clock nối tiếp
đồng bộ cho chế độ SPI và I2
C
RC4/SDI/SDA Bit 4 ST RC4 cũng có thể là dữ liệu SPI hoặc dữ
liệu xuất/nhập (chế độ I2
C)
RC5/SDO Bit 5 ST I/O hoặc ngõ ra dữ liệu port nối tiếp
đồng bộ
RC6/TX/CK Bit 6 ST I/O hoặc truyền bất đồng bộ USART
hoặc xung đồng bộ
RC7/RX/DT Bit 7 ST I/O hoặc nhận bất đồng bộ USART
hoặc dữ liệu đồng bộ
4 PORTD và thanh ghi TRISD:
PortD là port 8 bit với ngõ vào có mạch Schmitt Trigger Thanh ghi TRISD sẽ cấu hình là ngõ vào
hoặc ngõ ra
PortD có thể định cấu hình nhƣ port của vi xử lý 8 bit bằng cách thiết lập bit điều khiển PSPMODE
(TRISE<4>) Trong cấu hình này thì các bộ đệm ngõ vào dạng TTL
Chú ý: PortD và TRISD không đƣợc xây dựng cho chip PIC 28 chân
Hình 4-17: Sơ đồ mạch các chân PORTD
Các thanh ghi kết nối với PortD
Trang 9Các chức năng của PortD
TÊN
BIT# KIỂU ĐỆM CHỨC NĂNG RD0/PSP0 Bit 0 ST/TTL Port I/O hoặc bit 0 của port song song
RD1/PSP1 Bit 1 ST/TTL Port I/O hoặc bit 1 của port song song
RD2/PSP2 Bit 2 ST/TTL Port I/O hoặc bit 2 của port song song
RD3/PSP3 Bit 3 ST/TTL Port I/O hoặc bit 3 của port song song
RD4/PSP4 Bit 4 ST/TTL Port I/O hoặc bit 4 của port song song
RD5/PSP5 Bit 5 ST/TTL Port I/O hoặc bit 5 của port song song
RD6/PSP6 Bit 6 ST/TTL Port I/O hoặc bit 6 của port song song
RD7/PSP7 Bit 7 ST/TTL Port I/O hoặc bit 7 của port song song
5 PORTE và thanh ghi TRISE:
PORTE có 3 chân: RE0/ /AN5, RE1/ /AN6 và RE2/ /AN7 có cấu hình độc lập để thiết lập ngõ vào hoặc ngõ ra Những chân này có mạch điện Schmitt Trigger ở ngõ vào
PORTE là port nhập khi bit PSPMODE (TRISE<4>) bằng 1, các bit TRISE<0:2> phải bằng 1 và cấu hình các bit trong thanh ghi ADCON1 để portE là xuất/nhập số Trong chế độ này, bộ đệm ngõ vào dạng TTL
PORTE cũng đa hợp với các ngõ vào tương tự Khi định cấu hình là ngõ vào tương tự thì khi đọc các chân này sẽ có giá trị là „0‟
Các thanh ghi kết nối với PORTE
Hình 4-18: Sơ đồ mạch các chân PORTE
Các chức năng của PORTE
Trang 10TÊN BIT# KIỂU ĐỆM CHỨC NĂNG RE0/ /AN5 Bit 0 ST/TTL I/O hoặc ngõ ra điều khiển đọc port song
song hoặc ngõ vào tương tự
RE1/ /AN6 Bit 1 ST/TTL I/O hoặc ngõ ra điều khiển ghi port song
song hoặc ngõ vào tương tự
RE2/ /AN7 Bit 2 ST/TTL I/O hoặc ngõ ra chọn lựa port song song
hoặc ngõ tương tự
1
CS : VĐK tớ không được chọn
0
CS : VĐK tớ được chọn
Trạng thái port song song/các bit điều khiển:
Bit 7 IBF: bit báo trạng thái bộ đệm ngõ vào đầy (Input Buffer Full Status bit):
1= một word đã nhận và đang chờ CPU đọc
0= không có word nào được nhận
Bit 6 OBF: bit báo trạng thái bộ đệm ngõ ra đầy (Output Buffer Full Status bit):
1= bộ đệm ngõ ra vẫn còn giữ word đã ghi trước đó
0= bộ đệm ngõ ra đã được đọc
Bit 5 IBOV: bit phát hiện tràn bộ đệm ngõ vào (Input Buffer Overflow Detect bit):
1= quá trình ghi xảy khi word ngõ vào trước đó chưa được đọc
0= không xảy ra tràn
Bit 4 PSPMODE: Bit chọn lựa chế độ port song song
1= PORTD được định ở chế độ là port song song
0= PORTD được định ở chế độ là port xuất nhập
Bit 3 Chưa dùng: đọc là „0‟
Các bit ở PORTE là các bit dữ liệu trực tiếp:
Bit 2 Bit 2: bit điều khiển hướng cho chân RE2/ /AN7
1= ngõ vào
0= ngõ ra
Bit 1 Bit 1: bit điều khiển hướng cho chân RE1/ /AN6
1= ngõ vào
0= ngõ ra
Bit 0 Bit 0: bit điều khiển hướng cho chân RE0/ /AN5
1= ngõ vào
0= ngõ ra
III TẬP LỆNH C CHO CÁC PORT
Các lệnh của ngôn ngữ lập trình C liên quan đến các port bao gồm:
Lệnh OUTPUT_FLOAT()
Lệnh OUTPUT_LOW()
Lệnh OUTPUT_HIGH()
Lệnh OUTPUT_TOGGLE()
Lệnh OUTPUT_BIT()
Lệnh OUTPUT_X()
RD WR CS
CS
WR
RD
Trang 11Lệnh SET_TRIS_X()
Lệnh GET_TRIS_X()
Lệnh INPUT_X()
Lệnh INPUT()
Lệnh PORT_A_PULLUPS()
Lệnh PORT_B_PULLUPS()
Lệnh INPUT_STATE()
Lệnh OUTPUT_DRIVE()
1 LỆNH SET_TRIS_X() - LỆNH ĐỊNH CẤU HÌNH VÀO/RA CHO PORT
Cú pháp: set_tris_x(value); thiết lập cấu hình INPUT/OUTPUT cho portx
Thông số: value là 1 số nguyên 8 bit tương ứng với các bit của port I/O
Chức năng: các lệnh có chức năng định hướng cho các port I/O (TRI-State) Mỗi bit tương ứng 1 chân
Mức 1 thì chân tương ứng là ngõ vào, mức 0 thì chân là ngõ ra
Có hiệu lực: cho tất cả các vi điều khiển PIC
Ví dụ: SET_TRIS_B (0x0F); // 0F=00001111: B7- B4 là ngõ ra, B3-B0 là ngõ vào
2 LỆNH OUTPUT_X(VALUE) - XUẤT DỮ LIIỆU 8 BIT RA PORTX
Cú pháp: output_x (value)
Thông số: value là hằng số 8 bit kiểu int
Chức năng: Xuất dữ liệu 1 byte ra 1 port
Có hiệu lực: Lệnh này áp dụng cho tất cả các port
Ví dụ: OUTPUT_B(0xF0); xuất dữ liệu F0 ra portB
3 LỆNH OUTPUT_HIGH(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT LÊN MỨC CAO
Cú pháp: output_high(pin); tương đương lệnh BSF PORTX,B
Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác Chức năng: làm 1 chân của port lên mức cao
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
Ví dụ OUTPUT_HIGH(PIN_A0); // làm cho chân RA0 của port A lên 1
4 LỆNH OUTPUT_LOW(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT XUỐNG MỨC 0
Cú pháp: output_low(pin); tương đương lệnh BCF PORTX,B
Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác Chức năng: làm 1 chân của port xuống mức thấp
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
Ví dụ output_low(pin_a0); // làm cho chân RA0 của PortA xuống mức 0
5 LỆNH OUTPUT_TOGGLE(PIN) - LỆNH ĐẢO TRẠNG THÁI CỦA 1 CHÂN
Cú pháp: output_toggle(pin);
Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Trang 12Chức năng: làm đảo trạng thái 1 chân của port
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
Ví dụ OUTPUT_TOGGLE(PIN_B0); // đảo trạng thái chân RB0 của port B
6 LỆNH OUTPUT_BIT(PIN,VALUE) - LỆNH XUẤT DỮ LIỆU RA 1 CHÂN
Cú pháp: output_bit(pin,value);
Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Chức năng: xuất dữ liệu 0 hoặc 1 ra 1 chân của port
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
Ví dụ: output_bit(pin_b0,0); // xuất dữ liệu 0 ra RB0
7 LỆNH value = GET_TRIS_X() - LỆNH ĐỌC THANH GHI ĐỊNH CẤU HÌNH
Cú pháp: value = get_tris_x();
Thông số: không có thông số
Kết quả trả về: là byte dữ liệu đã định cấu hình từ thanh ghi TRIS
Chức năng: kết quả trả về là giá trị của thanh ghi TRIS của các port A, B, C or D
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
8 LỆNH value = INPUT(pin) - LỆNH ĐỌC DỮ LIỆU TỪ 1 CHÂN CỦA PORT
Cú pháp: value = input(pin);
Thông số: pin là chân để đọc - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Kết quả trả về: 0 (or FALSE) nếu chân ở mức thấp, 1 (or TRUE) nếu chân ở mức cao
Chức năng: đọc dữ liệu 1 bit từ 1 chân của port, chân này phải ở cấu hình là chân vào
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
Ví dụ while (! Input (PIN_B1)); //đợi cho đến khi chân Rb1 lên mức cao
If (input(PIN_A0)) Printf(“A0 is now high \r\n”);
Int16 i = PIN_B1 Whiel (!i); //đợi chân RB1 lên mức cao
9 LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
Cú pháp: value = input_state(pin);
Thông số: pin là chân để đọc - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Trả về: kết quả đọc bằng 1 nếu chân đọc ở mức cao, kết quả đọc bằng 0 nếu chân đọc ở mức thấp
Chức năng: lệnh đọc mức logic của 1 chân nhưng không làm thay đổi hướng của chân
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị
Ví dụ level = input_state(pin_A3);
10 Value = INPUT_X() - LỆNH ĐỌC DỮ LIỆU TỪ PORTX