PIC 16F887

Mình rất thích dòng vi điều khiển PIC , việc lập trình PIC đối với người chưa biết gì như mình rất khó, với những ai giống mình , bài viết này sẽ cung cấp cho bạn những kiến những cơ bạn , học tới đâu thì tìm hiểu thêm về nó! Hi vọng bài viết này sẽ có ích cho các bạn, mình chọn chip 16f887 để thực hành :
1,

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:
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)
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:
ANS6 = 0; //RE1 là chân Digital

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

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

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

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

if(RB0 == 0) {

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

}
(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
#include

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

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

BORDIS & IESODIS & FCMDIS & LVPDIS);

__CONFIG(BORV40) ;

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

void delay_ms(int ms);

 

void main()

{

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

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

  while(1){

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

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

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

  }

}

void delay_ms(int ms)

{

    int i;

    for(i=0; i

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

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

    }

}

No comments:

Related Posts Plugin for WordPress, Blogger...

Cùng tôi học Điện Tử ..(http://ilovec.tk)..