Giới Thiệu Về PIC16F877A

 

Giới Thiệu Về PIC16F877A

Sơ đồ chân/Sơ đồ khối

Hình 1: Sơ đồ chân của vi điều khiển PIC16F877A
Hình 2: Sơ đồ khối của vi điều khiển PIC16F877A

Tổ chức không gian bộ nhớ

Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu (Data Memory)

Bộ nhớ chương trình

Hình 3: Bộ nhớ chương trình của PIC16F877A

Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash, dung lượng bộ nhớ 8K word (1 word = 14 bit) và được phân thành nhiều trang (từ page0 đến page 3). Như vậy bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192 lệnh (vì một lệnh sau khi mã hóa sẽ có dung lượng 1 word (14 bit).

Để mã hóa được địa chỉ của 8K word bộ nhớ chương trình, bộ đếm chương trình có dung lượng 13 bit (PC<12:0>). Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Reset vector). Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h (Interrupt vector).

Bộ nhớ chương trình không bao gồm bộ nhớ stack và không được địa chỉ hóa bởi bộ đếm chương trình, bộ nhớ stack sẽ được đề cập cụ thể trong phần sau.

Bộ nhớ dữ liệu

Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia ra làm nhiều bank. Đối với PIC16F877A bộ nhớ dữ liệu được chia ra laøm 4 bank. Mỗi bank có dung lượng 128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFR (Special Function Register) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General Purpose Register) nằm ở các vùng địa chỉ còn lại trong bank. Các thanh ghi
SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cả các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh của chương trình.

Hình 4: Bộ nhớ dữ liệu của PIC16F877A

Các thông số cơ bản

Đây là vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài 14 bit. Mỗi lệnh đều được thực thi trong một chu kì xung clock. Tốc độ hoạt động tối đa cho phép là 20 MHz với một chu kì lệnh là 200ns. Bộ nhớ chương trình 8Kx14 bit, bộ nhớ dữ liệu 368x8 byte RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256x8 byte. Số PORT I/O là 5 với 33 pin I/O.

Các đặc tính ngoại vi bao gồm các khối chức năng sau:
o Timer0: Bộ đếm 8 bit với bộ chia tần số 8 bit.
o Timer1: Bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
o Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler.
o Hai bộ Capture/so sánh/điều chế độ rông xung.
o Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.
o Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
o Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD, WR, CS ở bên ngoài.
o Đặc tính Analog: 8 kênh chuyển đổi ADC 10 bit.
o Hai bộ so sánh.
o Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:
Bộ nhớ flash với khả năng ghi xóa được 100.000 lần.
Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần. Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
Khả năng tự nạp chương trình với sự điều khiển của phần mềm. Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming)
Watchdog Timer với bộ dao động trong.
Chức năng bảo mật mã chương trình.
Chế độ Sleep.
Có thể hoạt động với nhiều dạng Oscillator khác nhau.

Quy trình phát triển ứng dụng trên Vi điều khiển

Ngôn ngữ lập trình

Hợp ngữ (Assembly): Đây là một tập hợp các mã gợi nhớ để thực hiện một chức năng nào đó. Hợp ngữ là ngôn ngữ lập trình gần với ngôn ngữ máy nhất và mỗi dòng vi điều khiển đều luôn có một tập lệnh hợp ngữ nhất định. Nhà sản xuất cũng bắt buộc phải có một trình biên dịch hợp ngữ dành riêng cho dòng vi điều khiển đó.

Ngôn ngữ cấp cao: Hầu hết các ngôn ngữ cấp cao dành cho các vi điều khiển đều dừng lại ở ngôn ngữ C. Tuy nhiên ở mỗi cấp độ khác nhau ngôn ngữ C cũng chia ra nhiều dạng khác nhau. Với PIC chúng ta có thể có những trình biên dịch ngôn ngữ C dành riêng như sau: CCS, Hi-Tech C, C18, C30, C33, .... Bộ trình biên dịch C18, C30, C33, … là bộ trình biên dịch được hãng Microchip thiết kế chuyên dụng để lập trình cho vi điều khiển PIC và nó được đưa ra khi một dòng vi điều khiển PIC nào đó ra đời. Chính vì đặc điểm này các trình biên dịch này rất phù hợp với việc lập trình cho dòng vi điều khiển mà nó hỗ trợ. Đây là một dạng ngôn ngữ thao tác trên phần cứng, có thể can thiệp vào cấp thanh ghi của vi điều khiển để quy định chức năng của từng module căn bản trong vi điều khiển. Đồng thời ngôn ngữ cũng hỗ trợ các hàm tính toán, cách khai báo, các cấu trúc lệnh của ngôn ngữ C căn bản. Điều này giúp người lập trình dễ dàng hơn rất nhiều so với việc sử dụng hợp ngữ mà vẫn đảm bảo hiểu rõ được cách thức làm việc của vi điều khiển ở mức thanh ghi.

Mạch nạp

Các loại mạch nạp bản chất cũng chỉ là tạo ra được mức điện áp phù hợp trên các chân VSS, VDD, MCLR, để đưa PIC vào chế độ nạp, và truyền dữ liệu trên chân PGD và PGC cho PIC. Các mạch nạp thiết kế khác nhau chủ yếu là do khả năng điều chỉnh, và ổn định điện áp, và cách thức truyền dữ liệu vào PIC. Vì vậy, sự khác biệt chủ yếu giữa các mạch nạp, nằm ở chỗ nó có thể hỗ trợ nạp cho nhiều dòng PIC khác nhau hay không, ở khả năng điều chỉnh điện áp của PIC.

Một số lại mạch nạp:
Mạch nạp Olimex: PG1D, PG2C, PG3B, ICD1, ICD2, MCP_COM, MCP_USB
Mạch nạp Microchip: PIC StartPlus, ICD2
Mạch nạp GTP: GTP_Lite, GTP_USB
Sản phẩm của PIC Việt Nam: PIC1 (cải tiến từ PG2C), PIC2 (cải tiến từ PG3B), PIC3 (cái tiến từ GTP_USB)...

Hình 5: Mạch nạp Pickit 2 và Socket

Lập trình cho PIC trên PIC CCS

Cấu trúc chương trình

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9)
#use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)
#int_xxx
xxx_isr()
{
// Code here
}
void Ten_chuong_trinh_con(Ten_Bien)
{
// Code here
}
void main()
{
// Enter code here!
}

Mô tả nội dung chương trình

#include 16f877a.h //Đi kèm chương trình dịch, chứa khai báo về các thanh ghi trong mỗi con PIC, dùng cho việc cấu hình cho PIC.
#include def_877a.h //Files do người lập trình tạo ra, chứa khai báo về các thanh ghi trong PIC giúp cho viêc lập trình được dễ dang hơn ví dụ ta co thể gán
PORTB = 0xAA (chi tiết files này sẽ trình bày trong phần dưới đây)
#device *=16 ADC = 10 //Khai báo dùng con trỏ 8 hay 16 bit, bộ ADC là 8 hay 10 bit
#FUSES NOWDT, HS // Khai báo về cấu hình cho PIC
#use delay(clock=20000000) //Tần số thạch anh sử dụng
#use rs232 (baud=9600,…) //Khai báo cho giao tiếp nối tiếp RS232
#use i2c(master, SDA=PIN_C4,…) // Khai báo dùng I2C, chế độ hoạt động
#include <tên_file.c> //Khai báo các files thư viện được sử dụng ví dụ LCD_lib_4bit.c
#INT_xxx // Khai báo địa chỉ chương trình phục vụ ngắt
Void tên_chương_trình (tên_biến) {} // Chương trình chính hay chương trình con

Ví dụ

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
void main()
{
    // Thiet lap che do cho PORTB
    TRISB = 0x00; // Tat ca PORTB deu la cong xuat du lieu
    PORTB = 0xFF;
    While(1)
    {
        PORTB = 0;
        delay_ms(250);
        PORTB = 0xFF;
        delay_ms(250);

    }
}

Quy trình phát triển ứng dụng

Quy trình phát triển ứng dụng trên vi điều khiển bao gồm các bước:
Bước 1: Viết chương trình cho vi điều khiển sử dụng ngôn ngữ Assembly hoặc C...
Bước 2: Biên dịch chương trình và tạo file Hex (dùng để nạp cho vi điều khiển).
Bước 3: Sử dụng mạch nạp để nạp file Hex xuống vi điều khiển.
Hình 6: Quy trình phát triển ứng dụng trên Vi điều khiển
Xem thêm:

Hướng Dẫn Cài Đặt & Crack PIC CCS5.025

Đinh Xuân Hậu

Đinh Xuân Hậu Trường: Đại học Sư phạm Kỹ thuật Hưng Yên Khoa: Công nghệ Thông tin Bộ môn: Hệ thống Thông tin

Đăng nhận xét

Mới hơn Cũ hơn