Diễn đàn lớp 32CĐ Cơ-Điện Tử ĐHCN Việt - Hung
Chào Mừng bạn đến với diễn đàn của lớp 32CĐ Cơ - Điện Tử ĐHCN Việt-Hung

Diễn đàn lớp 32CĐ Cơ-Điện Tử ĐHCN Việt - Hung

Sân chơi dành cho sinh viên giao lưu học tập
 
Trang ChínhPortalCalendarGalleryTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập

Share | 
 

 PIC 16f887 A

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
Admin
vip
vip
avatar

Tổng số bài gửi : 366
vi phạm : 0
Join date : 15/04/2010
Age : 27
Đến từ : Bình Lục-Hà Nam

Bài gửiTiêu đề: PIC 16f887 A   Sat Nov 26, 2011 9:38 pm

Module I/O PORT của PIC16F887

Hình 1. Sơ đồ chân PIC16F887

Module I/O của PIC16F887 có 35I/O trong đó có 1 input. Tất cả các chân của PIC có khả năng cấp và rút dòng khoảng 25mA, đủ điều khiển 2 LED mắc song song. Tuy nhiên, giới hạn của mỗi PORT (8 chân) chỉ là 90mA mà thôi. Do đó, khi thiết kế cần tính toán tránh quá tải cho từng chân (vượt quá 25mA) và tránh quá tải cho toàn PORT (90mA).
Các PORT của PIC16F887 lần lượt được đặt tên theo chữ cái là PORTA, PORTB, PORTC, PORTD và PORTE, tương ứng với mỗi chân I/O ngoài chứng năng Input và Output logic ra còn tích hợp thêm nhiều tính năng khác, như RX, TX cho module USART, SDO, SDI, SCK, SS cho module SPI ….
Ngoài ra, trên Hình 1, những chân ANx được tô vàng là những chân có tính năng Analog, nghĩa là ngõ và của module ADC.Ứng với mỗi chân sẽ có 1 bit cấu hình chế độ Analog hay Digital trong 2 thanh ghi ANSEL và ANSELH.
Hình 2. Thanh ghi ANSEL

Hình 3. Thanh ghi ANSELH

Tương ứng với mỗi chân ANx (tô vàng trong Hình 1) mỗi bit ANSx (x = 0 – 13) sẽ quyết định chân ANx đó có tính năng Analog hay Digital, trong Hi-Tech C có thể dùng các định nghĩa của Datasheet để gán/đọc giá trị các thanh ghi này. Với giá trị được xóa về không (0) thì chân AN tương ứng sẽ là chân Digital (có thể xuất, đọc mức logic từ PORT), nếu ANSx được gán bằng Một (1) thì chân AN tương ứng sẽ là chân Analog, chỉ có tính năng Analog input cho ADC. Lưu ý cách đọc giá trị thanh ghi trong datasheet, dòng chữ trên cùng R/W-1 có nghĩa là bit này có thể Read/Write và khi Reset sẽ có giá trị là 1. Điều đó cũng có nghĩa là mặc định những chân có kỹ hiệu AN sẽ có tính năng Analog, muốn bật tắt 1 con LED trên những chân này,hãy cấu hình bit AN tương ứng trước nhé. Một ví dụ trong Hi-Tech C:
view sourceprint?


1ANSEL = 0; /* Cấu hình cho các chân AN0 -> AN7 là chân Digital */


2ANSELH = 0; /* Cấu hình cho các chân AN8 -> AN13 là chân Digital */



Hay có thể cấu hình theo từng bit (từng chân)
view sourceprint?


1ANS0 = 0; /* Cấu hình chân AN0 là chân Digital (chân RA0) */


2ANS5 = 1; /* Cấu hình chân AN5 là chân Analog (Chân RE0) */



Ứng với mỗi PORT sẽ có 2 thanh ghi chính để điều khiển là TRIS PORT, tương ứng với PORTA, PORTB, PORTC, PORTD và PORTE có các thanh ghi TRISA, TRISB, TRISC, TRISD và TRISE để điều khiển hướng xuất nhận của PORT.
Lưu ý, TRIS cấu hình cho PORT là input thì lúc này, chân được cấu hình input có trở kháng cao, có thể đọc được logic điện áp trên chân đó, và có thể coi như chân đó cách ly với mạch bên ngoài. Không phải tất cả các PORT đều có đầy đủ 8 bit. PORTB còn có thêm tính năng Interrupt On Change và Internet Pull-Up
Ví dụ PORTA, có thanh ghi TRISA và thanh ghi PORTA
Hình 4. Thanh ghi PORTA

Hình 5. Thanh ghi TRISA

Như vậy để cấu hình I/O PORT để sử dụng, cần 3 bước:
+ Xác định xem chân sử dụng có tính năng Analog hay không, nếu có, cấu hình là Analog (ADC) hay Digital (I/O) tùy thuộc vào mục đích
+ Cần xác định xem I/O cần dùng là ngõ vào hay ngõ ra, nếu ngõ vào điều khiển TRIS tương ứng bằng 1 (số 1 giống chứ i trong input) và ngược lại là 0 (giống chư o trong output)
+ Xuất ra I/O mức cao hay mức thấp tùy thuộc vào yêu cầu mà xuất trên PORT
Ví dụ: Cấu hình RE1 là ngõ ra digital điều khiển LED và RB0 là ngõ vào đọc giá trị nút nhấn:
view sourceprint?


1ANS6 = 0; //RE1 là chân Digital


2ANS12 = 0; //RB0 là chân Digital


3TRISE1 = 0; //RE1 là Digital Output, có thể điều khiển LED


4TRISB0 = 1; //RB0 là Digital Input, có thể đọc giá trị của nút nhấn


5RE1 = 1; //Xuất mức cao ra RE1


6if(RB0 == 0) {


7RE1 = 0; //Đọc giá trị của RB0, kiểm tra nếu RB0 = 0 thì xuất mức 0 ra RE1


8}



(tiếp theo …)
WEAK PULL-UP trên PORTB
IOC trên PORTB
Ví dụ về bật tắt LED trên chân RE1 trong mỗi 500ms
view sourceprint?


01#include


02//Cấu hình sử dụng dao động nội 4MHz


03__CONFIG(INTOSC & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT &


04BORDIS & IESODIS & FCMDIS & LVPDIS);


05__CONFIG(BORV40) ;


06/* Hàm delay một khoảng ms mili giây */


07void delay_ms(int ms);


08


09void main()


10{


11ANSEL = ANSELH = 0; //Cấu hình tất cả các chân AN là chân Digital


12TRISE1 = 0; //Cấu hình chân RE1 là chân Digital Output


13while(1){


14RE1 ^= 1; //Đảo trạng thái của RE1 ( dấu "^" nghĩa là XOR, Nếu RE1 = 1,


15//thì 1^1 = 0, gán lại cho RE1=0, nếu RE1 = 0, 0^1=1, gán lại RE1 = 1


16delay_ms(500); //Chờ trong khoảng 500mili giây


17}


18}


19void delay_ms(int ms)


20{


21int i;


22for(i=0; i


23_delay(1000);//Dao động 4MHz,


24///tần số Clock là 1Mhz, => delay 1000 chu kỳ máy = 1mili giây


25}


26}
Về Đầu Trang Go down
Xem lý lịch thành viên http://loveanhthao.co.cc
 

PIC 16f887 A

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Diễn đàn lớp 32CĐ Cơ-Điện Tử ĐHCN Việt - Hung :: Thông Báo-
Chuyển đến 
Đăng NhậpNhanh
.:Đăngkí:. | .: Quên mật khẩu:.