Tải bản đầy đủ (.pdf) (7 trang)

Nhp mon VDK PIC vi 16f877a

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (379.85 KB, 7 trang )

30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics

Đăng nhập hoặc Đăng ký

Trang chủ

Diễn đàn

Tìm kiếm

Download

Video

Thành viên

Bài viết mới nhất

Trang chủ

Diễn đàn

Kỹ thuật Điện| Điện tử

Vi điều khiển

Họ PIC ­> dsPIC

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


Thảo luận trong 'Họ PIC ­> dsPIC'

Đang xem chủ đề này ( Thành viên: 0, Khách: 1)
1

2

3

4

5

6

7

Next >
Moderators: THUONGDTQB

Đăng 3/9/12

#1
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 q 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ề

chivu

Kỹ sư

Số bài viết: 57
Đã được thích: 192

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 ngun 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 khun 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

/>
1/23


30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics


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 q nhiều vào vấn đề này).

[ IMG]

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

2/23


30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics

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 Xn 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_

Set_tris_

) Input_



)

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() và #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 ):

3/23


30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics

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 ) 
/>
4/23


30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics

#use Fast_IO( B ) 
#byte portB = 0x6 // 16F877 port b ở địa chỉ 6h (portB ở đây là biến chỉ thanh ghi
#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:

Chủ đề cùng chun mục:
Help ! Giao tiếp serial , truyền dữ...
Điều khiển LED từ chân VĐK mà khơng...
[PIC 16f877A] Lập Trình Led 7 Thanh...
Cần giúp đỡ về Led Matrix , khi thêm...
[PIC16F873A] Thạch anh 20Mhz
Vấn đề đọc dữ liệu giao tiếp HID
[Pic16f877a] Mọi người giúp lỗi này với
HỎI VỀ CODE PIC VỚI MPU6050
Mọi người dúp mình code asm cho led 7...
Báo cáo thực tập Vi Điều Khiển với...
An Hồng Văn, maiyeu512, trungnam2809 và 24 others thích bài này.
#1

Đăng 6/9/12

#2

5. Các hàm phục vụ ngắt
­ ENABLE_INTERRUPTS( level) // khai báo ngắt
Level: //các dạng ngắt
+GLOBAL : cho phép ngắt tồn cục
+INT_TIMER0 : ngắt do tràn TIMER0
+INT_TIMER1 : ngắt do tràn Timer1

chivu

Kỹ sư

+INT_TIMER2 : ngắt do tràn Timer2
+INT_RB : có thay đổi 1 trong các chân RB4 _ RB7

Số bài viết: 57

+INT_EXT : ngắt ngồi trên chân RB0

Đã được thích: 192

Chú ý : sau khi khai báo trên thì để vào chương trình ngắt cần khai báo
#INT_.....
ví dụ:
Mã:

#INT_TIMER1 
Void ngat_Timer1( ) 

//chương trình ngắt viết ở đây 
/>
5/23


30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics

//chương trình ngắt viết ở đây 
}


6. Điều chế độ rộng xung PWM
Để giải quyết vấn đề việc điều xung PWM bằng phần mềm chiếm phần lớn thời gian
hoạt động của vi điều khiển, PIC16F877A có hỗ trợ 2 kênh điều xung bằng phần
cứng ở 2 chân C1(CCP2) và C2(CCP1) sử dụng TIMER2. Nghĩa là, khi ta khai báo
điều xung PWM ở một tần số và duty cycle nào đó thì vi điều khiển sẽ thực hiện
cơng việc xuất xung một cách liên tục và tự động cho đến khi ta thay đổi các giá trị
đã khai báo. Khi đó, ta có thể làm các cơng việc khác một cách dễ dàng mà khơng
phải mất thời gian cho việc duy trì xung PWM.
Các hàm hỗ trợ việc điều xung bằng phần cứng của CCS:
Ghi chú: Chỉ đề cập đến các đối số của các hàm được phục vụ cho việc điều xung
PWM.
+ setup_timer_2 (mode, period, postscale)
mode: T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
period: 0­255
postscale: 1
Tần số điều xung PWM:
f = fosc / [ 4*mode*(period+1) ]

+ setup_ccp1(mode) và setup_ccp2(mode)
mode:
CCP_PWM: chọn chế độ PWM.
CCP_OFF: tắt chế độ PWM.

+ set_pwm1_duty(value) và set_pwm2_duty(value)
Nếu value là giá trị kiểu int 8bit:
duty_cycle = value / ( period+1 )

Nếu value là giá trị long int 16bit:
duty_cycle = value&1023 / [4*( period+1 )] 


Nếu khơng cần điều xung q “mịn” thì nên điều xung ở giá trị value 8bit cho đơn
giản.
Ví dụ: Ta muốn điều xung PWM với tần số 10kHz với tần số thạch anh (fosc) sử
dụng là 20MHz (value 8bit).
f=fosc/[4*mode*(period+1)] 

<=> 10000 =20000000/[ 4*mode*(period+1) ] <=> mode(period+1) = 500
/>
6/23


30/11/2016

Nhập mơn VĐK PIC với 16F877A | Cộng đồng cơ điện tử Việt Nam | Mechatronics

Với mode = [1,4,16] và period = 0­255 ta có thể chọn:
mode = 4; period = 124
mode = 16; period = 32
Để cho việc điều xung được “mịn” (chọn được nhiều giá trị duty cycle) ta chọn mode
= 4 và period = 124.
Như vậy, để duty_cycle từ 0% đến 100% ta cho value từ 0 đến 125.
value = 30 => duty_cycle = 30 / ( 124+1 ) = 0.32 = 32%
value = 63 => duty_cycle = 63 / ( 124+1 ) = 0.504 = 50.4%
value = 113 => duty_cycle = 113 / ( 124+1 ) = 0.904 = 90.4%

ví dụ: 
Code:
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp1(CCP_PWM);

set_pwm1_duty(30);

PHẦN 4: CÁC VÍ DỤ KÈM MƠ PHỎNG PROTEUS
1.Xuất tín hiệu 0/1 ra các chân
[ IMG]

Mã:

/>
#INCLUDE<16F877A.h> //KHAI BAO DEVICE CHO PIC 
#FUSES XT,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP 
/* 
XT: SU DUNG THACH ANH TAN SO THAP (=4MHZ) 
NOWDT:KHONG SU DUNG CHE DO WATCH DOG TIMER 
PUT(POWER UP TIMER): CHON CHE DO LAM VIEC CHO PIC KHI DIEN AP DA ON DINH 

7/23



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×