Nhập môn VĐK PIC với 16F877A

maiyeu512

Học sinh trung cấp
#51
Trong luồng này mình sẽ hướng dẫn những kiến thức cơ bản nhất về pic thông qua dòng pic 16f877a. Đây là những kiến thức rất sơ khai nên hy vọng sẽ giúp ích phần nào cho những bạn mới nhập môn cũng như khuyến cáo với những bạn đã có kiến thức về pic không nên tìm hiểu! Trong quá trình hướng dẫn không tránh được thiếu sót, rất mong được sự đóng góp của các pro để đây là luồng thông tin hữu ích khi các bạn tìm hiểu về pic đến với codientu.org.
Bài viết sẽ trình bày khá nhiều nên sẽ được chia làm một số phần cũng như được update liên tục vào #1
Bạn tải tài liệu đi kèm tại đây
pass: codientu.org (nếu có)


PHẦN 1: TỔNG QUAN VỀ PIC VÀ CÁC TÀI LIỆU ĐI KÈM
PIC là họ vi điều khiển mạnh, giàu tài nguyên về phần cứng và được microchip hỗ trợ nhiều tài liệu.
Chúng ta có thể dùng ngôn ngữ C hoặc ASM để lập trình cho vi điều khiển PIC. Tuy nhiên mình khuyên bạn nên lập trình PIC bằng ngôn ngữ C. Ngôn ngữ C sẽ hỗ trợ bạn tiếp cận vi điều khiển PIC nhanh nhất, không cần tốn nhiều thời gian nghiên cứu cấu trúc PIC mà bạn vẫn lập trình cho PIC một cách dễ dàng và sẵn sàng chia sẽ code với mọi người trên mạng vì đa số họ cũng lập trình cho PIC bằng ngôn ngữ C.
Và tất nhiên phần mềm biên dịch CCS lập trình cho họ vi điều khiển PIC bằng ngôn ngữ C. Nó là một trình biên dịch hỗ trợ ngôn ngữ C cho hầu hết các dòng vi điều khiển PIC. Bạn có thể tìm bản hướng dẫn sử dụng tại đây hoặc tài liệu đi kèm trong luồng này.
Phần mềm mô phỏng proteus 7.10 tại đây


PHẦN 2: CẤU TRÚC PHẦN CỨNG CỦA PIC
Bộ nhớ chương trình (ROM) và bộ nhớ dữ liệu (RAM) của PIC khá thoải mái (các bạn nhập môn không cần quan tâm quá nhiều vào vấn đề này).



Trong tài liệu đính kèm ở trên cấu trúc phần cứng đã được nêu khá cụ thể và chi tiết, các bạn có thể tự đọc. Trong luồng này mình sẽ nói nhiều hơn về các tập lệnh CCS sử dụng cho PIC 16f877a thông qua các ví dụ.

PHẦN 3: TẬP LÊNH CCS C CHO PIC 16F877A
1. Chỉ thị tiền xử lý


1. #INCLUDE
Cú pháp: #include<filename>
Khai báo chỉ định đường dẫn cho trình biên dịch

Ví dụ: #include<16f877a.h>
hoặc #include < C:\INCLUDES\CCSC\VIDU.C >

2.#BIT
Cú pháp: #bit name=x.y
Tạo biến 1bit có tên là name đặt ở byte x vị trí y. Thường dung để kiểm tra hoặc gán giá trị cho thanh ghi. Điểm khác so với dùng biến 1 bit từ khai báo int1 là: int1 tốn 1 bit bộ nhớ, còn #BIT thì không tốn thêm bộ nhớ do name chỉ danh định đại diện chi bit chỉ định ở biến x, thay đổi name (0/1) sẽ thay đổi giá trị tương ứng y -> thay đổi giá trị x.
Ví dụ: #bit TMR1IF=0x0B.2; => tạo biến 1bit tên TMR1IF đặt ở byte có địa chỉ 0x0B ở vị trí thứ 2.


3.#BYTE
Cú pháp: #byte name=x
Gán tên biến name cho địa chỉ x. name thường trùng với tên thanh ghi có địa chỉ x

Ví dụ: #byte portB=0x06;

4.#DEFINE
Cú pháp: #define name text
Dùng để khai báo một chuỗi hoặc số có tên là name
Ví dụ: #define constan 123456;


5.#USE:
Cú pháp: #use delay(clock=speed)
Dùng để khai báo tốc độ dao động của thạch anh và có chỉ thị này thì bạn mới sử dụng được các hàm trễ thời gian delay_ms hay delay_us

Cú pháp: #use fast_io(port)
Port là các cổng vào ra của PIC (từ A -> G)
Có chỉ thị này thì chúng ta có thể điều chỉnh các port chỉ với 1 lệnh như output_low(), input_high()...Chú ý: trong hàm main () bạn phải dùng hàm set_tris_x() để chỉ rõ chân vào ra thì chỉ thị trên mới có hiệu lực, nếu không chương trình sẽ chạy sai!

Ví dụ: #USE FAST_IO (A);
Bạn có thể tìm đọc thêm một số chỉ thị #USE I2C, #USE RS232 cũng như một số tiền xử lý khác trong tài liệu CCS C bản tiếng việt của Nguyễn Xuân Trường đi kèm ở trên.

2. Các hàm delay
Để sử dụng các hàm delay phải khai báo tiền xử lý như đã nói ở trên
ví dụ: #use delay (clock=20000000);
Hàm delay không sử dụng bất kỳ một timer nào. Có 3 hàm phục vụ:

1. Delay_cycles (count)
count: hằng số từ 0 - 255, là số chu kỳ lệnh. 1 chu kỳ lệnh bằng 4 chu kỳ máy nhé!
ví dụ: delay_cycles (25); với tần số dao động thạch anh OSC=20MHZ thì hàm delay này 5us=5*10^-6s

2. Delay_us (time)
Time là biến số thì giá trị từ 0-255, nếu là hằng số thì 0-65535.
ví dụ:
int time=100;
delay_us (time); //delay 100us
delay_us (1000); //delay 1000us


3. Delay_ms (time)
Tương tự với delay_us nhưng với đơn vị là ms=10^-3s.
3. Các hàm vào ra trong CCS C
Bao gồm các hàm sau:
Output_low() Output_high()
Output_bit() Input()
Ouput_X() Input_X()

Set_tris_X()

1 / Output_low ( pin ) , Output_high (pin ) :
Dùng để thiết lập ngõ ra mức 0 (low, 0v) hoặc mức 1 (high, 5v) cho chân PIC, pin chỉ vị trí của chân.
Có thể xuất xung dùng set_tris_x()#use fast_io

Ví dụ: output_high (pin_b0); //ngõ ra chân b0 là 0v
Delay_ms (1000); //tạo trễ 1000ms=1s

Output_low(pin_b0); //ngõ ra chân b0 là 5v

2. Output_bit ( pin , value ):
Pin: tên chân
Value: giá trị 0 hoặc 1
Hàm này cũng xuất ra chân giá trị 0 hoặc 1. Tương tự như hàm trên. Thường dùng khi giá trị ra tùy thuộc giá trị của 1 biến nào đó, hoặc muốn đảo lại giá trị ngõ ra trước đó.

Ví dụ:
Mã:
while (1 )
{
output_bit( pin_B0 , !x ) ;
Delay_ms(250 );
}
3. Input ( pin ):
Hàm cho giá trị đang có của chân pin là 0 hoặc 1. Giá trị 1bit
Ví dụ: m=input(pin_B1); //giá trị m bằng 0 hoặc 1


4. Output_X ( value ) :
Hàm xuất giá trị 1 byte (8bit) ra port x, tất cả các chân của port đều là ngõ ra
Ví dụ:
Mã:
Output_B ( 212 ) ; // xuất giá trị 11010100 ra port B
Output_A ( 10101010b ) ; // xuất giá trị 10101010 ra port A

5. Input_X ( ) :
Hàm trả về giá trị 8bit (1byte) là giá trị đang có của port tên X (A -> G).
Ví dụ: m=input_A

6. Set_tris_X ( value ) :
Hàm này dùng để định nghĩa chân IO (vào/ra) cho 1 port là ngõ vào hay ngõ ra. Chỉ dùng được khi đã khai báo tiền xử lý #use_fast_io.
Sử dụng #byte để tạo 1 biến chỉ đến port và thao tác trên biến này chính là thao tác trên port đó.
Value là giá trị 8 bit. Mỗi bit đại diện cho 1 chân, bit=0 thì chân đó là ngõ ra còn bit=1 chân đó là ngõ vào

ví dụ : Đoạn mã sau cho phép thao tác trên port b 1 cách dễ dàng:
Mã:
#include < 16F877.h >
#use delay(clock=20000000)
#use Fast_IO( B )
#byte portB = 0x6 // 16F877 port b ở địa chỉ 6h (portB ở đây là biến chỉ thanh ghi ở địa chỉ //0x6 chứ CCS C không có từ khóa portB ở địa chỉ 0x6, ta có thể đổi portA = 0x6 vẫn ok //nhưng sẽ gây nhầm lẫn lung tung và không thống nhất với các ký hiệu của nhà sản xuất và //người sử dụng!).
#bit B0 = portB. 0 // bit ở chân B0 có tên biến là B0
Main()
{
Set_tris_b (0); // portb = 00000000b => tất cả các chân port b là ngõ ra.
……..
}
4. Hàm sử dụng trong các TIMER
Có 3 TIMER là TIMER0, TIMER1, TIMER2. Các hàm sử dụng cho các TIMER các bạn có thể tham khỏa trong tài liệu đính kèm. Trong các ví dụ cụ thể mình sẽ cố gắng giải thích các hàm này cho các bạn dễ hình dung hơn.
to be continued #2 :49.jpg::49.jpg::49.jpg:
Quá ư là hay luôn, cảm ơn nhé :D
 

maiyeu512

Học sinh trung cấp
#53
Tiếc thế? Mất 1 người chỉ giáo :(. Mình thấy PIC hay mà sao chuyển qua AVR vậy bạn? Ưu điểm nó thế nào vậy?
 

co_dien_tu

Học sinh trung cấp
#54
Nếu các bạn đã từng học qua họ 89c51 thì về sau nên học AVR vì cấu trúc và tập lệnh nó khá giống nhau, Các board mạch phát triển từ AVR cũng nhiều
 

co_dien_tu

Học sinh trung cấp
#55
Cái đó là tuỳ vào bạn nữa, nếu bạn có kiến thức cơ bản về PIC mình khuyên hãy tiếp tục đi nhé, vì các họ VĐK nó cơ bản như nhau về chức năng, mạch phát triển..và cả giá cả nữa
 

co_dien_tu

Học sinh trung cấp
#56
Hơn nữa bấy giờ dùng C/C++ để phát triển sẽ hỗ trợ cho bạn khá nhiều, điều quan trọng vẫn là ở bạn đã có kiến thức về PIC , các cổng inout, Timer, ADC, spi,I2C.. đó mới là điều cần có bạn ak !! Chúc bạn thành công với PIC
 

maiyeu512

Học sinh trung cấp
#57
Hơn nữa bấy giờ dùng C/C++ để phát triển sẽ hỗ trợ cho bạn khá nhiều, điều quan trọng vẫn là ở bạn đã có kiến thức về PIC , các cổng inout, Timer, ADC, spi,I2C.. đó mới là điều cần có bạn ak !! Chúc bạn thành công với PIC
Cảm ơn sự góp ý của bạn nhé, mình k chuyên nên cứ học PIC tiếp thồi :D
 

QUOCGIABAO

Học sinh trung cấp
#59
Các bác cho em hỏi phần lập trình bằng ngôn ngữ C này có mô phỏng được trên Eagle được không mấy Bác. Xin cảm ơn mấy bác!
 

PhamDaoViet

Học sinh phổ thông
#60
Mấy anh cho em hỏi trước kia em muốn dùng hàm strcat() mà không biết dùng thư viện nào làm sao mình có thể biết dùng một lệnh thì cần dùng thư viện nào vậy ạ?
 

Quảng cáo Google