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) 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 http://codientu.org/threads/421/ 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 Khai báo chỉ định đường dẫn cho trình biên dịch Ví dụ: #include hoặc #include 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ư http://codientu.org/threads/421/ 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 ở 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ừ 0255, nếu là hằng số thì 065535. 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 http://codientu.org/threads/421/ 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 #use delay(clock=20000000) #use Fast_IO( B ) http://codientu.org/threads/421/ 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 http://codientu.org/threads/421/ 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: 0255 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 http://codientu.org/threads/421/ 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 = 0255 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ã: http://codientu.org/threads/421/ #INCLUDE //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 ... [PIC? ?16f877A] Lập Trình Led 7 Thanh Cần giúp đỡ về Led Matrix , khi thêm [PIC1 6F873A] Thạch anh 20Mhz Vấn đề đọc dữ liệu giao tiếp HID [Pic1 6f877a] Mọi người giúp lỗi này với HỎI VỀ CODE? ?PIC? ?VỚI MPU6050...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... //chương trình ngắt? ?vi? ??t ở đây http://codientu.org/threads/421/ 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