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

hnp211

Học sinh phổ thông
#71
Em đang làm cái đồ án liên quan tới pic này. Cụ thể là nghịch lưu áp 1 pha dùng phương pháp PWM các bác hướng dẫn em về phần code với, em xin HẬU TẠ thõa đáng.
Mail của em: pvdanh211@gmail.com
Em xin cám ơn!
 

mta_cdt

Super Moderator
Thành viên BQT
#72
Em đang làm cái đồ án liên quan tới pic này. Cụ thể là nghịch lưu áp 1 pha dùng phương pháp PWM các bác hướng dẫn em về phần code với, em xin HẬU TẠ thõa đáng.
Mail của em: pvdanh211@gmail.com
Em xin cám ơn!
Cái này hình như là băm xung dùng mạch cầu H xong rùi đưa qua biến áp thì nó ra đầu kia là AC.
 

hnp211

Học sinh phổ thông
#73
Cái này hình như là băm xung dùng mạch cầu H xong rùi đưa qua biến áp thì nó ra đầu kia là AC.
Dạ, em làm mạch nâng nguồn lên tầm 200v-300v trước. Nên không sử dụng biến áp. Còn hơi lấn cấn phần code nạp cho PIC để tạo được sóng đầu ra gần Sin nhất có thể. em có cái code copy được trên mạng. nhưng chưa hiểu câu lệnh của nó. Bác có thể giúp được em xin hậu tạ ạ!
 

shazam

Học sinh phổ thông
#74
Mình mới học viết CSC cho PIC16F877A. Mình muốn xuất PWM ra chân 17, duty cycle tính dựa trên số lần nhấn nút nhưng không biết sai chỗ nào lại không ra được PWM. Bạn nào biết chỉ mình với

Code:
#include <main.h>

#include <stdio.h>
#include <stdlib.h>

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT


#use delay(clock=20000000)

void main()
{
int up=input(pin_A0);
int down=input(pin_A1);
int stop=input(pin_A2);
int congsuat=0;
int8 duty_cycle;

setup_timer_2(T2_DIV_BY_1,249,1); // tần số pwm là 20kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(0);
while(TRUE)
{
if (up==1) //nhap cong suat bang cach dem so lan bam nut tang/giam
{
if (congsuat>=100) congsuat=100;
else congsuat=congsuat+10;
}
else
{
if (down==1)
{
if (congsuat<=0) congsuat=0;
else congsuat=congsuat-10;
}
}
if (stop==1)
{
congsuat=0;
}

duty_cycle=congsuat*250/100;
set_pwm1_duty(duty_cycle);

}
}
 

vũ văn

Học sinh phổ thông
#75
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:
em muốn viết code cho pic để chạy motor có mật khẩu thì làm như nào ạ
 

Quảng cáo Google