Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
1/32
TUT01.01.PVN Gửi đế n: n:
www.picvietnam.com
Nội dung:
Lập trình cho PIC b PIC bằng CCS ver3.242
MICROSOFT WORD
ắt: Tóm t ắ t : Tài liệ u hướng dẫ n sử dụng trình biên dịch CCS cho lậ p trình PIC. Tìm hiể u tông quan về CCS và cách tạo mộ t Project trong CCS. Chương trình mẫ u cho PIC16F877 Các ví d ví dụ lậ p trình đơn giản: quét LED, ADC, LED, ADC, RS232…
1.
Tổng quan về CCS 1.1.
Vì sao ta sử dung CCS ?
Sự ra đời của một loại vi điề u khiể n đi kèm với việc phát triể n phầ n mề m ứng dụng cho việc lập trình cho con vi điề u khiể n đó. Vi điề u khiể n chỉ hiể u và làm việc với hai con số 0 và 1. Ban đầ u để việc lập trình cho VĐK là làm việc với dãy các con số 0 và 1. Sau này khi kiế n trúc của Vi điề u khiể n ngày càng phức tạp, số luợng thanh ghi lệnh nhiề u lên, việc lập trình với dãy các số 0 và 1 không còn phù hợp nữa, đòi hỏi ra đời một ngôn ngữ mới thay thế . Và ngôn ngữ lập trình Assembly. Ở đây ta không nói nhiề u đế n Assmebly. Sau này khi ngôn ngữ C ra đời, nhu cầ u dùng ngôn ngữ C đề thay cho ASM trong việc mô tả các lệnh lập trình cho Vi điề u khiể n một cách ngắn gọn và dễ hiể u hơn đã dẫn đế n sự ra đời của nhiề u chương trình soạn thảo và biên dịch C cho Vi điề u khiể n : Keil C, HT‐PIC, MikroC, CCS… Tôi chọn CCS cho bài giới thiệu này vì CCS là một công cụ lập trình C mạnh cho Vi điề u khiể n PIC. Những ưu và nhược điể m của CCS sẽ được đề cập đế n trong các phầ n dưới đây.
1.2.
Giới thiệu về CCS ?
CCS là trình biên trình biên dịch lập trình ngôn ngữ C cho Vi điề u khiể n PIC của hãng Microchip. Chương trình là sự tích hợp của 3 trình biên trình biên dich riêng biế t cho 3 dòng PIC khác nhau đó là: ‐ PCB cho dòng PIC 12‐ bit opcodes ‐ PCM cho dòng PIC 14‐ bit opcodes ‐ PCH cho dòng PIC 16 và 18‐ bit Tấ t cả 3 trình biên dich này đuợc tích hợp lại vào trong một chương trình bao gồm cả trình soạn thảo và biên và biên dịch là CCS, phiên b phiên bản mới nhấ t là PCWH Compiler Ver 3.227
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
2/32
Giố ng ng như nhiề u trình biên trình biên dich C khác cho PIC, CCS giúp cho người sử dụng nắm bắt nhanh được vi điề u khiể n PIC và sử dụng PIC trong các dự án. Các chương trình diề u khiể n sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng ngôn ngữ lạp trình cấ p cao – Ngôn ngữ C Tài liệu hướng dẫn sử dụng có rấ t nhiề u, u, nhưng chi tiế t nhấ t chính là b là bản Help đi kèm theo phầ n mề m (tài liệu Tiế ng ng Anh). Trong b Trong bản trợ giúp nhà sản xuấ t đã mô tả rấ t nhiề u về hằng, bi ng, biế n, n, chỉ thị tiề n xủa lý, cấ u trúc các câu lệnh trong chương trình, các hàm tạo sẵn cho người sử dụng… Ngoài ra về Tiế ng ng Việt cũng có bản dịch của tác giả Trần Xuân Trường , SV K2001 DH BK HCM. HCM. Tài liệu này dịch trên cơ sở bản Help của CCS, tuy rằng chưa đầ y đủ nhưng đây là một tài liệu hay, nế u bạn tìm hiể u về PIC và CCS thì nên tìm tài liệu này về đọc. Địa chỉ Download tài liệu: www.picvietnam.com ‐> Mục nói về CCS.
2.
Tạo PROJECT đầu tiên trong CCS
Để tạo một Project trong CCS có nhiề u cách, có thể dùng Project Wizard, Manual Creat, hay đơn giản là tạo một Files mới và thêm vào đó các khai báo ban đầ u cầ n thiế t và “bắt buộc”. Dưới đây sẽ trình bày cách tạo một project hợp lệ theo cả 3 phương pháp. Một điề u ta cầ n chú ý khi tạo một Project đó là: khi tạo bắt cứ một Project nào mới thì ta nên tạo một thư mục mới với tên liên quan đế n Project ta định làm, rồi lưu các files vào đó. Khi lập trình và biên và biên dịch, CCS sẽ tạo ra rấ t nhiề u files khác nhau, do đó nế u để chung các Project trogn một thư mục sẽ rấ t mấ t thời gian trong việc tìm kiế m sau này. Đây cũng là quy tắc chung khi ta làm việc với bấ t kỳ phầ n mề m nào, thiế t kế mạch hay lập trình. Việc đầ u tiên b tiên bạn cầ n làm là khởi động máy tính và b và bật chương trình PIC C Compiler.
2.1.
Tạo một PROJECT sử dụng PIC Wizard
Trước hế t bạn khởi động chương trình làm việc PIC C Compiler. Từ giao diện chương trình b trình bạn di chuột chọn Project ‐> New ‐> PIC Wizard nhấ n nút trái chuột chọn.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
3/32
Sau khi nhấ n chuột, một cửa sổ hiện ra yêu cầ u ban nhập tên Files cầ n tạo. Bạn tạo một thư mục mới, vào thư mục đó và lưu tên files cầ n tạo tại đây.
Hình2.0: Cử a sổ Save As Save As Như vậy là xong b xong bước đầ u tiên. Sau khi nhấ n nút Save, một cửa sổ New Project hiện ra. Trong của sổ này bao này bao gồm rấ t nhiề u Tab, mỗi Tab mô tả về một vài tính năng của con PIC. Ta sẽ chọn tính năng sử dụng tại các Tab tương ứng. Dưới đây sẽ trình bày trình bày ý ngh ĩ a từng mục chọn trong mỗi Tab. Các mục chọn này chính là đề cập đế n các tính năng của một con PIC, tùy theo từng loại mà sẽ có các Tab tương ứng. Đố i với từng dự án khác nhau, khi ta cầ n sử dụng tính năng nào của con PIC thì ta sẽ chọn mục đó. Tổ ng ng cộng có 13 Tab đẻ ta lưa chọn. Tôi giới thiệu những Tab chính thường hay được sử dụng.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
4/32
2.1.1.
Tab General
Tab General cho phép ta lựa chọn loại PIC mà ta sử dụng và một số lựa chọn khác như chọn tầ n số thạch anh dao động, thiế t lập các bit các bit CONFIG nhằm thiế t lập chế độ hoạt động cho PIC.
Hình 2.1: Tab General Device: Liệt kê danh sách các loại PIC 12F, 16F, 18F… Ta sẽ chọn tên Vi điề u khiể n ‐ Device: PIC mà ta sử dụng trong dự án. Lấ y ví dụ chọn PIC16F877A ‐ Oscilator Frequency: Tầ n số thạch anh ta sử dụng, chọn 20 MHz (tùy từng loại) các bit Config như: Chế độ dao động (HS, RC, Internal ), chế độ bảo ‐ Fuses: Thiế t lập các bit vệ Code, Brownout detected… ‐ Chọn kiể u con trỏ RAM là 16‐ bit hay 8‐ bit
2.1.2.
Tab Communications
Tab Communications liệt kê các giao tiế p nố i tiế p mà một con PIC hỗ trợ , thường là RS232 và I2C, cùng với các lựa chọn để thiế t lập chế độ hoạt động cho từng loại giao tiế p. p. Giao tiế p RS232
Mỗi một Vi điề u khiể n PIC hỗ trợ một cổ ng ng truyề n thông RS232 chuẩ n. n. Tab này cho phép ta lựa chọn chân Rx, Tx, tố c độ Baud, Data bit, Data bit, Bit Parity… Giao tiế p I2C
Để sử dụng I2C ta tích vào nút chọn Use I2C, khi đó ta có các lựa chọn: Chân SDA, SCL, Tố c độ truyề n (Fast ‐ Slow), chế độ Master hay Slave, địa chỉ cho Salve.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
5/32
Hình 2.2: Tab Communications
2.1.3.
Tab SPI and LCD
Tab này liệt kê cho người dùng các lựa chọn đố i với giao tiế p nố i tiế p SPI, chuẩ n giao tiế p tố c độ cao mà PIC hỗ trợ về phầ n cứng. Chú ý khi ta dùng I2C thì không thể dùng SPI và ngược lại. Để có thể sử dụng cả hai giao tiế p này cùng một lúc thì buộc một trong 2 giao tiế p phải lập trình b trình bằng phầ n mề m (giồng như khi dùng I2C cho các chip AT8051, không có hỗ trợ phầ n cứng SSP). Phầ n cấ u hình cho LCD dành cho các chíp dòng 18F và 30F.
Hình 2.3: Tab SPI and SPI and LCD
2.1.4.
Tab Timer
định thờ i mà các con PIC dòng Mid‐range có: Timer0, timer1, Liệt kê các b các bộ đế m/ đị timer2, WDT…
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
6/32
Trong các lựa chọn cấ u hình cho các bộ đế m /định thời có: chọn nguồn xung đồng hồ (trong/ngoài), khoảng thời gian xảy ra tràn…
Hình 2.4: Tab Timer
2.1.5. Tab Analog Liệt kê các lựa chọn cho bộ chuyể n đổ i tương tự/số (ADC) của PIC. Tùy vào từng IC cụ thể mà có các lựa chọn khác nhau, bao nhau, bao gồm: ‐ Lựa chọn cổ ng ng vào tương tự ‐ Chọn chân điện áp lấ y mẫu (Vref) ‐ Chọn độ phân giải: 8‐ bit = 0 ~ 255 hay 10‐ bit = 0~1023 ‐ Nguồn xung đồng hồ cho b cho bộ ADC (trong hay ngoài), từ đ ó mà ta có được tố c độ lấ y mẫu, thường ta chọn là internal 2‐6 us. ‐ Khi không sử dụng b ng bộ ADC ta chọn none
Hình 2.5: Tab Analog Tab Analog
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
7/32
2.1.6.
Tab Other
Tab này cho phép ta thiế t lập các thông số cho các b các bộ Capture/Comparator/PWM. Capture ‐ Bắt giữ
‐ Chọn bắt giữ xung theo sườn dương (rising edge) edge) hay sườn âm (falling edge) edge) của ‐
xung vào Chọn bắt giữ sau 1, 4 hay 16 xung (copy giá trị của TimerX vào thanh ghi lưu trữ CCCPx sau 1, 4 hay 16 xung).
Compare ‐ So sánh
‐ Ta có các lựa chọn thực hiện lệnh khi xayư ra b ra bằng nhau giữa 2 đố i tượng so sánh là giá trị của Timer1 với giá trị lưu trong thanh ghi để so sánh. Bao gồm: Thực hiện ngắt và thiế t lập mức 0 Thực hiện ngắt và thiế t lập mức 1 Thực hiện ngắt nhưng không thay đổ i trạng thái của chân PIC. Đưa Timer1 về 0 nhưng không thay đổ i trạng thái chân. o o o o
PWM ‐ Điều chế độ rộng xung
‐ Lựa chọn về tầ n số xung ra và duty cycle. Ta có thể lựa chọn sẵn hay tự chọn tầ n số , tấ t nhiên tầ n số ra phải nằm trong một khoảng nhấ t định. Comparator ‐ So sánh điện áp
‐ Lựa chọn mức điện áp so sánh Vref. Có rấ t nhiề u mức điện áp để ta lựa chọn. Ngoài ra ta còn có thể lựa chọn cho đầ u vào của các b các bộ so sánh.
Hình 2.6: Tab Other
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
8/32
2.1.7.
Tab Interrupts và Tab Driver
Tab Interrupts cho phép ta lựa chọn nguồn ngắt mà ta muố n sử dụng. Tùy vào từng loại PIC mà số lượng nguồn ngắt khác nhau, bao gồm: ngắt ngoài 0(INT0), ngắt RS232, ngắt Timer, ngắt I2C‐SPI, ngắt onchange PORTB.v.v… Tab Drivers được dùng để lựa chọn những ngoại vi mà trình dịch đã hỗ trợ các hàm giao tiế p. p. Đây là nhưng ngoại vi mà ta sẽ kế t nố i với PIC, trong các IC mà CCS hỗ trợ , đáng chú ý là các loại EEPROM như 2404, 2416, 2432, 9346, 9356…Ngoài ra còn có IC RAM PCF8570, IC thời gian thực DS1302, Keypad 3x4, LCD, ADC… Chi tiế t ta có thể xem trong thư mục Driver của chương trình: trình: \...\PICC\Drivers
Hình 2.7: Tab Interrupts
Hình 2.8: Tab Driver Sau các bước chọn trên, ta nhấ n OK để kế t thúc quả trình tạo một Project trong CCS, một Files ten_project.c được tạo ra, chứa những khai báo khai báo cầ n thiế t cho PIC trong một Files ten_project.h. Dưới đây là nội dung một files chương trình mẫu.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
9/32
Chuong_trinh_mau.c #include ʺD:\1‐PIC project\chuong trinh test.HEX.hʺ #int_EXT EXT_isr() { // Code here } Void Chuong_trinh_con() { // Code here } void main() { setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_EXT); enable_interrupts(INT_TBE); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); // Enter your code here }
Chuong_trinh_mau.h #include <16F877A.h> #device adc=8 #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG, #use delay(clock=20000000) #define SRAM_SCL PIN_C3 #define SRAM_SDA PIN_C4 #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
10/32
2.2.
Mẫu chương trình chuẩ n cho lập trình CCS
Phầ n trên ta đã tìm hiể u cách tạo một Project trong CCS, tuy nhiên theo cách đó mấ t khá nhiề u thời gian, mặt khác mỗi người lập trình sẽ tạo ra nhưng form tài liệu theo cách riêng khác nhau, không đồng nhấ t. t. Tài liệu không được chuẩ n hóa sẽ gây một số khó khăn cho người đọc, người đọc có thể không hiể u hế t những gì mà người lập trình muố n diễn đạt. Với mục đích đưa ra một form tài liệu chuẩ n cho việc lập trình bằng CCS, qua tham khảo bản mẫu cho lập trình bằng ASM của anh Falleaf trên diễn đàn WWW.PICVIETNAM.COM tôi đưa ra đây một form tài liệu cho việc viế t lập trình b trình bằng CCS. Đi kèm văn bản này còn có các files nguồn cho văn bản mẫu, bao u, bao gồm files cho PIC16F877A, 16F876A, 16F88. Về sau khi lập trình bạn chỉ việc copy tài liệu này vào thư mục chứa Project của bạn, sửa đổ i tên files. Khi cầ n thay đổ i nội dung cấ u hình cho PIC bạn chi việc tham khảo qua PIC Wizard , xem code và copy đưa vào Project. 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 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: khai báo về các thanh ghi def_877a.h : Files do người lập trình tạo ra, chứa khai báo 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 trình bày trong phầ n dưới đây) Khai báo dùng con trỏ 8 hay 16 bit, 16 bit, b bộ ADC là 8 hay 10 bit 10 bit ‐ #device *=16 ADC = 10: 10: Khai báo ‐ #FUSES NOWDT, HS: Khai báo Khai báo về cấ u hình cho PIC ‐ #use delay(clock=20000000): Tầ n số thạch anh sử dụng Khai báo cho giao tiế p nố i tiế p RS232 ‐ #use rs232 (baud=9600,…): Khai báo ‐ #use i2c(master, SDA=PIN_C4,…): Khai báo Khai báo dùng I2C, chế độ hoạt động báo các files thư viện được sử dụng ví dụ LCD_lib_4bit.c :Khai báo ‐ #include :Khai ‐ #INT_xxx : Khai báo 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) n) {}: Chương trình chính hay chương trình con
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
11/32
Chương trình mẫu cho PIC16F877A //================================================= ======= // Ten // Ten chuong trinh : Mach test den LED_1 // Nguoi // Nguoi thuc hien : Falleaf // Ngay // Ngay thuc hien : 23/05/2005 // Phien // Phien ban : 1.0 // Mo // Mo ta phan cung : Dung PIC16F877A ‐ thach anh 20MHz // : LED giao tiep voi PORTB // : Cuc am cua LED noi voi GND // : RB0 ‐ RB7 la cac chan output ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Ngay // Ngay hoan thanh : 23/05/2005 // Ngay // Ngay kiem tra : 23/05/2005 // Nguoi // Nguoi kiem tra : Doan Hiep ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Chu // Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau // : hoac cac chu thich khac // : vd, dung che do Power On Reset, PORTB = 00000000 // : hoac, chuong trinh viet cho PIC Tutorial // : hoac, chuong trinh nay hoan toan mien phi va co the dung cho // : moi muc dich khac nhau //================================================= ======= #include <16f877a.h> #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=20000000) #use rs232(baud=9600,parity rs232(baud=9600,parity=N,xmit=PIN_B =N,xmit=PIN_B5,rcv=PIN_B2,bi 5,rcv=PIN_B2,bits=9) ts=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) #int_xxx // Khai // Khai bao chuong trinh ngat xxx_isr() { // Code // Code here } void Ten_chuong_trinh_con(Ten_Bien) { // Code // Code here } void main() { // Enter // Enter code here! }
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
12/32
Chương trình mẫu cho PIC16F876A //================================================= ======= // Ten // Ten chuong trinh : Mach test den LED_1 // Nguoi // Nguoi thuc hien : Falleaf // Ngay // Ngay thuc hien : 23/05/2005 // Phien // Phien ban : 1.0 // Mo // Mo ta phan cung : Dung PIC16F876A ‐ thach anh 20MHz // : LED giao tiep voi PORTB // : Cuc am cua LED noi voi GND // : RB0 ‐ RB7 la cac chan output ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Ngay // Ngay hoan thanh : 23/05/2005 // Ngay // Ngay kiem tra : 23/05/2005 // Nguoi // Nguoi kiem tra : Doan Hiep ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Chu // Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau // : hoac cac chu thich khac // : vd, dung che do Power On Reset, PORTB = 00000000 // : hoac, chuong trinh viet cho PIC Tutorial // : hoac, chuong trinh nay hoan toan mien phi va co the dung cho // : moi muc dich khac nhau //================================================= ======= #include <16f876a.h> #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000) #use rs232(baud=9600,parity rs232(baud=9600,parity=N,xmit=PIN_B =N,xmit=PIN_B5,rcv=PIN_B2,bi 5,rcv=PIN_B2,bits=9) ts=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) #int_xxx // Khai // Khai bao chuong trinh ngat xxx_isr() { // Code // Code here } void Ten_chuong_trinh_con(Ten_Bien) { // Code // Code here } void main() { // Enter // Enter code here! }
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
13/32
Chương trình mẫu cho PIC16F88 //================================================= =======A // Ten // Ten chuong trinh : Mach test den LED_1 // Nguoi // Nguoi thuc hien : Falleaf // Ngay // Ngay thuc hien : 23/05/2005 // Phien // Phien ban : 1.0 // Mo // Mo ta phan cung : Dung PIC16F88 ‐ thach anh 20MHz // : LED giao tiep voi PORTB // : Cuc am cua LED noi voi GND // : RB0 ‐ RB7 la cac chan output ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Ngay // Ngay hoan thanh : 23/05/2005 // Ngay // Ngay kiem tra : 23/05/2005 // Nguoi // Nguoi kiem tra : Doan Hiep ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Chu // Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau // : hoac cac chu thich khac // : vd, dung che do Power On Reset, PORTB = 00000000 // : hoac, chuong trinh viet cho PIC Tutorial // : hoac, chuong trinh nay hoan toan mien phi va co the dung cho // : moi muc dich khac nhau //================================================= ======= #include <16f88.h> #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=20000000) #use rs232(baud=9600,parity rs232(baud=9600,parity=N,xmit=PIN_B =N,xmit=PIN_B5,rcv=PIN_B2,bi 5,rcv=PIN_B2,bits=9) ts=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) #int_xxx // Khai // Khai bao chuong trinh ngat xxx_isr() { // Code // Code here } void Ten_chuong_trinh_con(Bien) { // Code // Code here } void main() { // Enter // Enter code here! }
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
14/32
3.
Một số ví dụ cho lập trình CCS Với mục tiêu giúp người đọc nhanh chóng lắm bắt được cách lập trình C cho PIC thông qua chương trình dịch CCS. Dưới đây tôi giới thiệu một vài bài vài bài lập trình đơn giản cho PIC, các bài các bài mẫu này dựa theo tài liệu tutorial của Nigel như quét LED, LED 7 thanh, LCD, bàn LCD, bàn phím…, cách dùng các giao tiế p của PIC để giao tiế p với thiế t bị ngoại vi như Real Time IC, ADC, EEPROM… •
‐ ‐ ‐ ‐ ‐
Yêu cầu về phần cứng tố i thiể u cần có để thực hành: PIC16F877A ( hoặc 16F876A hay 16F88) = 50K (Tố t nhấ t là PIC16F877A) 1 Board cắm linh kiện (tố i thiể u ) = 40K Thạch anh 20MHz, tụ 22pF, 10uF, trở 10K, 4K7, 330Ω , nút b nút bấ m = 10K 10 LED đơn xanh hay đỏ , 4 LED 7 thanh (loại 4 LED liề n một đế ) = 15K MAX232 để giao tiế p máy tính () = 10K Tổ ng ng cộng là: 125K
•
Phần cứng mở rộng
‐ ‐ ‐ ‐ ‐ ‐
LCD 1602A loại 2 dòng 16 ký tự (Nế u có LCD 2002 càng tố t) t) = 65K (Minh Hà có bán) có bán) Real Time IC DS1307 hay DS1337 = 25K (có thể xin sample của Maxim‐IC) EEPROM AT24Cxx ADC/DAC IC loại 12‐ bit trở nên (ADC 10‐ bit thì PIC cũng có) Sensor nhiêt LM335 hay LM35 = 13K Động cơ bước, động cơ một chiề u
Mục đích chính của tôi trong việc giới thiệu các ví dụ dưới đây là nhằm giúp mọi người nhanh chóng nắm được kỹ thuật lập trình b trình bằng CCS, thông qua các ví dụ mọi người sẽ hiể u các hàm của CCS, cách sử dụng trong từng ứng dụng cụ thể . Về chi tiế t của mỗi hàm tôi sẽ không trình bày trình bày kỹ tại đây, để bi biế t rõ ta có thể xem trong phầ n Trợ giúp của CCS hay tài liệu của tác giả Trầ n Xuân Trường, trong đó đã nói khá đầ y đủ. Tôi nhấ n mạnh một điề u khi mọi người tìm hiể u về PIC và CCS đó là hãy tự mình tìm hiể u là chính, từ việc nghiên cứu tài liệu, tìm tài liệu cho đề n thiế t kế mạch và viế t chương trình. Những gì tại n, sử dụng hế t điể m mạnh của PIC và CCS là ở phía mọi đây chỉ là cơ bản, còn việc phát triể n, người. Chúc thành công!
ất cả các mạch đ iệ n và code tôi trình bày dướ i đ ây M ột đ iề u chú ý là t ấ ây tôi đề u đ ã lắ p ốt. mạch thậ t trên t trên bo cắ m và chạy t ố
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
15/32
Chương trình nhấ p nháy LED
3.1.
Nhấ p nháy LED có thể coi là một chương trình “Kinh điể n”. n”. Mỗi người khi b khi bắt tay vào học VĐK thì bài thì bài học đầ u tiên là làm nhấ p nháy một hay vài con LED trên chân VĐK. Trong tài liệu này tôi cũng chọn bài tập đó để b bắt đầ u. u. Bản thân tôi cũng vậy, bài y, bài học đầ u tiên là nháy LED và quét LED 7 thanh Mục đích của bài như trên đã nói: Làm nhấ p nháy 8 LED tại PORTB của PIC 16F877A, thời gian trễ do người lập trình định trước. Những điề u thu được qua bài qua bài học: ‐ Vẽ một mạch điện tử hoàn chỉnh dùng OrCad 9.2 ‐ Tạo một Dự án trong CCS (cái này đã nói trong phầ n 2) ‐ Tệp định ngh ĩ a các thanh ghi của PIC do người dùng tạo ra ‐ Thiế t lập chế độ vào ra cho một cổ ng ng của PIC ‐ Sử dụng hàm tạo trễ thời gian Dưới đây là sơ đồ phầ n cứng. Trong sơ đồ các LED được mắc chung lên dương nguồn thông qua điện trở. Gia trị điện trở thay đổ i trong khoảng 100Ω cho đế n 560Ω tùy theo độ sáng của LED mà ta muố n và cũng để đảm bảo dòng qua mỗi LED không quá 20mA khi nguồn cấ p là 5V. Như vậy để làm sáng LED ta chỉ việc đưa mức 0 ra các chân PIC và ngược lại để tắt ta đưa mức 1. VCC
R1
D1
R2
D2
R3 R
D3 LED
R4 R
D4 LED
R5 R
D5 LED
R6 R
D6 LED
R7 R
D7 LED
R8 R
D8 LED
R
LED
220
LED
RB0 RB1 RB2 RB3
RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7
RB4 RB5 RB6 RB7
2 3 4 5 6 7 OSC1 OSC2
R9 RESET
VCC
33 34 35 36 37 38 39 40
OSC1 Y1
OSC2
RESET
13 14 1
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS/C2OUT
Cong tac 20MHz C1 22p
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
OSC1/CLKI OSC2/CLKO MCLR/VPP
10K 12 31
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VSS VSS
C2 22p
Hình 3.1. Sơ đồ mạch nháy 8 LED t ại PORTB
VDD VDD
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 11 32
VCC
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
16/32
VCC
VDD LM7805C/TO220 U3 1
IN
C4 100uF/50V
OU T
3
C3 4.7uF/25V
R11 R
D9 LED
Hình 3.2. Sơ đồ mach nguồ n cho PIC Mã nguồn chương trình nạp vào PIC //================================================= ======= // Ten // Ten chuong trinh : Mach nhay den LED // Nguoi // Nguoi thuc hien : linhnc308 // Ngay // Ngay thuc hien : 13/03/2006 // Phien // Phien ban : 1.0 // Mo // Mo ta phan cung : Dung PIC16F877A ‐ thach anh 20MHz // : LED giao tiep voi PORTB // : Cuc am cua LED noi voi PORTB // : RB0 ‐ RB7 la cac chan output ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Ngay // Ngay hoan thanh : 13/06/2006 // Ngay // Ngay kiem tra : 13/06/2006 // Nguoi // Nguoi kiem tra : linhnc308 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Chu // Chu thich : dung che do Power On Reset, PORTB = 00000000 // : chuong trinh viet cho PIC Tutorial // : chuong trinh nay hoan toan mien phi va co the dung cho // : moi muc dich khac nhau //================================================= ======= #include <16f877a.h> #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) void main()
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
17/32
{ // Thiet // Thiet lap che do cho PORTB TRISB = 0x00; // Tat // Tat ca PORTB deu la cong xuat du lieu PORTB = 0xFF; // Tat // Tat het cac LED While(1) { PORTB = 0; // Cho // Cho các LED sáng delay_ms(250); // T // Tạo thời gian trễ 250ms PORTB = 0xFF; delay_ms(250); } } Qua ví dụ đơn giản trên b trên bạn hiể u cách xuấ t dữ liệu ra một cổ ng ng của PIC và dùng các hàm tạo trễ. Thủ tục thiế t lập vào ra cho một cổ ng ng hay một chân của PIC ‐ Ghi giá trị vào thanh ghi điề u khiể n chế độ của cổ ng ng tương ứng là TRISx o Bit 0 ứng với chân xuấ t dữ liệu o Bit 1 ứng với nhận dữ liệu o Thanh ghi TRISx có thể câu hình theo từng bit ng bit ‐ Khi muố n xuấ t dữ liệu, ví dụ ra PORTB, câu lệnh là: PORTB = gia_tri; ‐ Khi muôn nhận dữ liệu từ PORTB, câu lệnh là: data_in = PORTB; Về các hàm tạo trễ , trong CCS hỗ trọ sẵn 3 loại hàm tạo trễ là: ‐ delay_cycles(gia_tri) : gia_tri là thời gian trễ tính theo số chu kỳ máy ‐ delay_us(gia_tri): delay_us(gia_tri): Tạo trễ Micro giây ‐ delay_ms(gia_tr ị): Tạo trễ Mili giây Bản chấ t của các hàm tạo trễ là đưa Vi điề u khiể n vào một vòng lặp chẳng làm gì cả cho đủ số thời gian mà ta cầ n. n. Ngoài việc dùng hàm tạo trễ có sẵn ta có thể tự viế t hàm tạo trễ dùng b dùng bộ Timer
3.2.
Bộ ADC trong PIC và ứng dụng
Bộ chuyể n đổ i từ tương tự sang số là một khố i mạch điện tử quan trọng, có mặt trong rấ t nhiề u thiế t kế điện tử. Các b Các bộ ADC thực tế được đóng gói trong những IC chuyên dụng, do nhiề u hãng sản xuấ t. t. Điể m quan trong cầ n lưu ý ở các b các bộ ADC này là độ phân giải và tố c độ lấ y mẫu tìn hiệu. Độ phân giải của bộ ADC có thể là 8‐ bít, 10‐ bít, 12‐ bít, 16‐ bít, 24‐ bít… Tố c độ lấ y mẫu của ADC có thể nhanh hay chậm, tùy từng ứng dụng mà ta chọn tố c độ thích hợp. Vi điề u khiể n PIC là một trong những dòng Vi điề u khiể n có phầ n giao tiế p ngoại vi mạnh và đa dạng. Bên trong PIC đã được tích hợp sẵn một bộ ADC có độ phân giải tố i đa
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
18/32
là 10‐ bít (tùy chon là 8‐ bit hay 10‐ bit). Với bộ ADC trong PIC ta có thể làm được khá nhiề u công việc, dưới đây tôi trình bày trình bày một ứng dụng của bộ ADC trong việc thiế t kế mạch đo nhiệt độ sử dụng sensor nhiệt LM335. Dưới đây là phầ n code mạch đo nhiệt dộ , hiể n thị trên LCD.
//================================================= ======= // Ten // Ten chuong trinh : Mach do nhiet do // Nguoi // Nguoi thuc hien: hien: linhnc308 // Ngay // Ngay thuc hien : 28/03/2006 // Phien // Phien ban: ban : 1.0 // Mo // Mo ta phan cung : Dung PIC16F877A ‐ thach anh 20MHz // : LCD giao tiep voi PORTD // : Dau ra LM335 dua vao chan AN0 // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Ngay // Ngay hoan thanh : 28/03/2006 // Ngay // Ngay kiem tra : 28/03/2006 // Nguoi // Nguoi kiem tra : Linhnc308 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ // Chu // Chu thich : hoac cac chu thich khac // : dung che do Power On Reset // : chuong trinh viet cho PIC Tutorial //================================================= ======= #include <16F877A.h> #include #device *=16 adc=10 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9) #include // Thu // Thu vien ham cho LCD int8 low,high,key,mode,min,max,mode1,i; int1 do_F; void convert_bcd(int8 x); void bao_dong(); void test(); // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ void main() {
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
19/32
float value; on_off =1; min =15; //nhiet do min default max =35; //nhiet do max default do_F =0 ; =0 ; i = 50 ; 50 ; mode =0 ; =0 ; mode1 = 0 ; trisa = 0xFF; trisb = 0x01; trisd = 0x00; LCD_init(); Printf(LCD_putchar,ʺLop DT8 ‐ BKHNʺ); LCD_putcmd(0xC0); Printf(LCD_putchar,ʺKhoi tao...ʺ); // Khoi // Khoi tao cho ngat ngoai enable_interrupts (INT_EXT); ext_int_edge(H_TO_L); enable_interrupts (GLOBAL); // Khoi // Khoi tao che do cho bo ADC setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); delay_us(10); // Lay // Lay mau nhiet do lan dau tien value=(float)read_adc(); value = (value ‐ 558.5)/2.048; // For // For 5V supply // value = (value ‐ 754.8)/2.048; // For // For 3.7V Supply // value = (value ‐ 698.2)/2.048; // For // For 4V supply convert_bcd((int8)value); // Tach // Tach so tram, chuc, donvi de hien thi len LED 7 delay_ms(1000); LCD_putcmd(0xC0); Printf(LCD_putchar,ʺKhoi tao xongʺ); while(1) { if (i==50) { value = read_adc();
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
20/32
value=(value‐558.5)/2.048; if (do_F==1) value=1.8*value+32; convert_bcd((int8)value); printf(ʺ \n\rNhiet do phong: %uʺ,value);// Gui ,value);// Gui gia tri len may tinh LCD_putcmd(0xC0); printf(LCD_putchar,ʺ Temp = ʺ); LCD_putchar(high); LCD_putchar(low); if (do_F==0) printf(LCD_putchar,ʺ Cʺ); else printf(LCD_putchar,ʺ Fʺ); i=0; } i++; if(((int8)value > 40) || ((int8)value < 15)) on_off=1; else { on_off = 0; LCD_Putcmd(0xCF); LCD_putchar(ʺ ʺ); blink=0; } if (on_off==1) { if (blink==0) { LCD_Putcmd(0xCF);LCD_putchar(ʺ!ʺ);blink=1;delay_ms(250);} else {LCD_Putcmd(0xCF);LCD_putchar(ʺ ʺ);blink=0;delay_ms(250);} } } }//end main‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ #INT_EXT void test() { if (do_F == 1) do_F=0; else do_F=1; } void convert_bcd(int8 x) { low=x%10; //chia lay phan du, so hang don vi
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
21/32
high=x/10; //tach hang tram va hang chuc low = low + 0x30; high = high + 0x30; } void bao_dong(){ int8 i; if (blink == 0) blink = 1; else blink=0; for(i=0;i<50;i++) { LCD_Putcmd(0xCF); if (blink==0) LCD_putchar(ʺ!ʺ); else LCD_putchar(ʺ ʺ); } } Dưới đây là một sơ đồ dùng PIC và LM335 để đo nhiệt độ , hiể n thị trên LCD và trên LED 7. Trong chương trình b trình bạn thấ y có hàm chuyể n đổ i nhiệt độ từ ía trị độ K về độ C. Nguyên nhân có hàm đó là do con LM335 thay đổ i 10mV/K, ta cầ n hiể n thị là độ C. Nhận thấ y 0oC = 273K, như vậy tại 0oC con LM335 sẽ xuấ t ra một điện áp là 2.73V và với điện áp này, ADC trong PIC sẽ cho giá trị số là
2.73 *1023 5
=
558.558
. Như vậy khi tính toán giá trị
nhiệt độ ta cầ n trừ đi giá trị 558.558 này. Công thức đầ y đủ là: Do _ C =
adc _ value − 558.558
2.048
Giá trị 2.048 có là do ta dùng ADC 10‐ bit, điện áp lấ y mẫu là 5V, như vậy mỗi mức lượng tử sẽ tương ứng với
5V 1024
=
4.883mV . LM335 thay dổ i
10mV/K do đó ứng với sụ thay
đổ i 1 độ C sẽ thay đổ i 2.048 mức lượng tử (10mV/4.883mV = 2.048). Công thức trên là cho ADC 10‐ bit, với các b các bộ ADC 8‐ bit hay 12‐ bit việc tính toán chuyể n đổ i giá trị cũng tương tự.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
22/32
U13
LCD - 16x2 - DM1602A
K A 6 5 1 1
VCC
E C S W / S E C S E R R V V V
7 6 5 4 3 2 1 0 D D D D D D D D
LCD_1602A 4 3 2 1 0 1 1 1 1 1 9 8 7 6 5 4 3 2 1
21 22 23 24 25 26 27 28 29 30 33pF
13 14 15 16 17 18 19 20
Crystal
33pF
RD2/PSP2 RB7/PGD RD3/PSP3 RB6/PGC RC4/SDI/SDA RB5 RC5/SDO RB4 RC6/TX/CK RB3/PGM RC7/RX/DT RB2 RD4/PSP4 RB1 RD5/PSP5 RB0/INT RD6/PSP6 RD7/PSP7 RA2/AN2 RA3/AN3 RA4 RA5/AN4 OSC1/CLKI RE0/AN5 OSC2/CLKO RE1/AN6 RC0/T1CKI RE2/AN7 RC1/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 VDD1 VSS1
40 39 38 37 36 35 34 33 4 5 6 7 8 9 10
Q3 4K7
SPEAKER H I
32 31
2 H I
11 12
I H
VDD VSS
RA1/AN1 RA0/AN0 VPP
3 2 1
3 VR10K
LM335Z 10K 1K
I H
I H
Hình 3.3. M 3.3. M ạch đ o nhiệ t t độ LM335 hiể n thị trên LCD1602
1
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
23/32
2 g f
1
a
C C V
c c e d V 0 1 9
4 3 5 2
c
f g b
Q1
4 35 a
C C V
T c O c D e d V 0 1 8 9
7
1
6
c 7
b
T O D 8
6
21 22 23 24 25 26 27 28 29 30
Q2
HI
33pF
Crystal
33pF
4K7
13 14 15 16 17 18 19 20
4K7
RD2/PSP2 RB7/PGD RD3/PSP3 RB6/PGC RC4/SDI/SDA RB5 RC5/SDO RB4 RC6/TX/CK RB3/PGM RC7/RX/DT RB2 RD4/PSP4 RB1 RD5/PSP5 RB0/INT RD6/PSP6 RD7/PSP7 RA2/AN2 RA3/AN3 RA4 RA5/AN4 OSC1/CLKI RE0/AN5 OSC2/CLKO RE1/AN6 RC0/T1CKI RE2/AN7 RC1/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 VDD1 VSS1
40 39 38 37 36 35 34 33 4 5 6 7 8 9 10
Q3 4K7
SPEAKER H I
32 31
2 H I
11 12
I H
VDD VSS
RA1/AN1 RA0/AN0 VPP
3 2 1
3 VR10K
LM335Z 10K 1K
I H
1
I H
Hình 3.4. M 3.4. M ạch đ o nhiệ t t độ hiể n thi trên LED 7 thanh 7 thanh Trong mạch trên ta dùng chính con PIC cho việc giải mã LED 7 thanh. Nguyên tắc quét cho từng LED 7 thanh là gửi giá trị cầ n hiể n thị ‐> bật LED ‐> Tạo thời gian trễ ‐> tắt LED. Quá trình cứ lặp lại như vậy cho đế n khi quét hế t LED. Ta tính toán thời gian trễ sao cho đảm bảo các số hiể n thị liên tục.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
24/32
Giao tiế p máy tính RS232
3.3.
Việc giao tiế p giữa Vi điề u khiể n và máy tính là bài là bài lập trình khá quan trọng khi ta làm việc với các dòng Vi điề u khiể n khác nhau. Với Vi điề u khiể n PIC cũng vậy, trong mỗi IC PIC đề u có tích hợp một khố i giao tiế p máy tính USART. Ta sử dụng khố i giao tiế p này để truyề n dữ liệu lên máy tính và xử lý dữ liệu đó tùy vào mục đích của người lập trình. Để nhận dữ liệu do Vi điề u khiể n truyề n lên máy tính ta có thể sử dụng các phầ n mề m giao tiế p COM có sẵn hay viế t một chương trình mới, sử dụng các ngôn ngữ lập trình như C++, VB hay Delphi… Trong chương trình ví dụ dưới đây tôi sử dụng công cụ sẵn có của CCS là Serial Port Monitor để truyề n và nhận dữ liệu từ PIC. Sơ đồ mạch điện ORCAD. Mạch sử dụng IC MAX232 để kế t nố i đế n cổ ng ng COM của máy tính. Mạch đơn giản chỉ nhằm mục đích giới thiệu khố i giao tiế p máy tính của PIC và cách lập trình cho nó trong CCS.
LCD - 16x2 - DM1602A
K A 6 5 1 1
E C S W / S E C S E R R V V V
7 6 5 4 3 2 1 0 D D D D D D D D
LCD_1602A 4 3 2 1 0 1 1 1 1 1 9 8 7 6 5 4 3 2 1 D4 D5 D6 D7
E
TX_PIC C9 1uF 1uF C8 VCC C10 C7
13 8 11 10 1 3 4 5 2 6
R1IN R2IN
R1OUT R2OUT
T1IN T2IN
T1OUT T2OUT
C1+ C1C2+ C2V+ V-
VCC RS E
RW
U14 TX_PC
RW RS
12 9
RX_PIC
14 7
RX_PC
TX_PIC RX_PIC D4 D5 D6 D7 33pF
20MHz
13 14 15 16 17 18 19 20
1uF MAX232
21 22 23 24 25 26 27 28 29 30
33pF
1uF
RD2/PSP2 RB7/PGD RD3/PSP3 RB6/PGC RC4/SDI/SDA RB5 RC5/SDO RB4 RC6/TX/CK RB3/PGM RC7/RX/DT RB2 RD4/PSP4 RB1 RD5/PSP5 RB0/INT RD6/PSP6 RD7/PSP7 RA2/AN2 RA3/AN3 RA4 RA5/AN4 OSC1/CLKI RE0/AN5 OSC2/CLKO RE1/AN6 RC0/T1CKI RE2/AN7 RC1/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 VDD1 VSS1
40 39 38 37 36 35 34 33 4 5 6 7 8 9 10
32 31 H I
11 I H
12
VDD
RA1/AN1 RA0/AN0 VPP
VSS
Hình 3.5. M 3.5. M ạch giao ch giao tiế p máy tính, hiể n thị LCD
3 2 1 10K I H
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
25/32
Mã nguồn chương trình: #include <16f877a.h> #include #use delay(clock=20000000) #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT // Khai // Khai báo sử dụng giao tiế p nố i tiế p RS232 #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9) #include int8 count=0; char string_in[16]; #INT_RDA // Hàm // Hàm xử lý ngắt nố i tiế p Receive_isr() { char c; int8 i; count++; c = getc(); putc(c); if (c==ʹcʹ | c==ʹCʹ) { LCD_putcmd(0x01); //Clear Screen c=ʹcʹ ; ; count=0; } if ((count<=16) && (c!=ʹcʹ)) LCD_putchar(c); if (count > 16) { count=0; LCD_putcmd(0xC0); } } void main() {
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
26/32
enable_interrupts(int_rda); enable_interrupts(GLOBAL); lcd_init(); // lcd_init(); // Kh Khởi tạo cho LCD lcd_putcmd(0x01); lcd_putcmd(line_1); printf(ʺEnter a String.ʺ); printf(ʺOr anything you want!ʺ); while (1) {} }
Mô tả chương trình: Trên đây là chương trình giao tiế p với máy tính, ta thấ y trong CCS để sử dụng giao tiế p nố i tiế p ta chỉ cầ n khai báo khai báo #use rs232(). Các hàm giao tiế p với máy tính mà CCS hỗ trợ là:
‐ putc(char ky_tu) : Gửi một ký tự ASCII lên máy tính ‐ getc() : Hàm trả về một ký tự nhận được từ máy tính ‐ printf(string): hàm gửi một chuỗi ký tự lên máy tính Trong chương trình ta có sử dụng hàm xử lý ngắt nố i tiế p để xử lý ký tự nhân được từ máy tính. Khi có ngắt xảy ra, ta gọi hàm getc() sẽ trả về ký tự vừa nhận được. Trên màn hình LCD sẽ hiể n thị ký tự mà ta gõ từ bàn phím máy tính.
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
27/32
3.4.
Ngắt của PIC và cách sử dụng
Trong Vi điề u khiể n PIC có nhiề u nguồn ngắt. Để bi biế t cụ thể ta có thể vào mục View >> Valid Interrupts . Khi đó một của sổ sẽ hiện ra liệt kê đầ y đủ các nguồn ngắt của từng con PIC.
Hình 3.6 Các nguồ n ng ắ t trong PIC PIC ắt trong
Để viế t một hàm phục vụ ngắt ta chỉ việc thêm khai báo khai báo #INT_tên_ngắt vào trước hàm phục vụ cho ngắt đó. Khi đó trình dich sẽ hiể u đó là địa chỉ hàm cho ngắt, khi có ngắt tương ứng xảy ra thì nó sẽ nhảy đế n vị trí đó Lấ y ví dụ khi ta muố n xử lý ngắt ngoài, hàm sẽ được viế t như sau: #INT_EXT Ext_isr() { // Nhập mã tại đây }
Dưới đây là chương trình nháy led theo nhiề u kiể u khác nhau, sử dụng 1 phím bấ m nố i với chân ngắt ngoài RB0 để chọn kiể u nháy. Có 8 kiể u nháy LED khác nhau, Khi đế n kiể u nháy thứ 8, nế u ta nhấ n thì sẽ trở về chế độ ban đẩ u. u. Ban đầ u biế n mode = 0
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
28/32
và tấ t cả các LED đề u tắt Mỗi khi nhấ n phím b phím bấ m, bi m, biế n mode sẽ tăng lên 1 đơn vị. Giá trị biế n mode tương ứng với chương trình nháy được thực hiện. Khi mode = 9 thì sẽ được gán về mode = 0. Các kiể u nháy khác nhau là do ta b ta bật tắt các LED trên cổ ng ng D theo các cách khác nhau. Lấ y ví dụ khi ta muôn các LED nháy xen kẽ nhau ta chỉ việc gửi ra cổ ng ng D giá trị AAh (10101010) và 55h (01010101).
Sơ đồ mạch đ iệ n: n: VCC
R10 R SW1 Phim chon 33 34 35 36 37 38 39 40
R9 RESET
VCC 10K Cong tac
2 3 4 5 6 7 OSC1 OSC2
OSC1 Y1
OSC2
RESET
13 14 1 12 31
20MHz C1 22p
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT
RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS/C2OUT OSC1/CLKI OSC2/CLKO MCLR/VPP VSS VSS
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 VDD VDD
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30
LED1 LED2 LED3 LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8
LED4 LED5 LED6 LED7
D8
R8
D7
R7
D6 LED
R6 220
D5 LED
R5 R
D4 LED
R4 R
D3 LED
R3 R
D2 LED
R2 R
D1 LED
R1 R
LED
R
LED
R
LED8 8 9 10 11 32
VCC
C2 22p
Hình 3.7. Nháy LED nhiề u chế độ Phầ n mã nguồn chương trình: #include <16F877A.h> #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) int8 mode,i; byte temp;
VCC
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
29/32
#INT_EXT EXT_ISR() { mode++; if (mode==9) mode = 0; } // End // End of INT void program1(); void program2(); void program3(); void program4(); void program5(); void program6(); void program7(); void program8(); void main() { trisd = 0x00; trisb = 0xFF; portd=0xff; enable_interrupts(int_EXT); ext_int_edge(H_TO_L); // Ch // Chọn ngắt theo sườn âm enable_interrupts(GLOBAL); mode = 0; while (1) { switch(mode) { case 1: program1(); break; case 2: program2(); break; case 3: program3(); break; case 4: program4(); break; case 5: program5(); break; case 6: program6(); break; case 7: program7(); break; case 8: program8(); break; } } } void program1() {
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
30/32
PortD = 0x00; delay_ms(250); Portd = 0xFF; delay_ms(250); } void program2() { // LED // LED sáng chạy từ trái qua phải temp = 0xFF; for (i=0;i<=8;i++) { portd = temp; delay_ms(250); temp >>= 1; } } void program3() { // LED // LED sáng chạy từ phải qua trái temp = 0xFF; for (i=0;i<=8;i++) { portd = temp; delay_ms(250); temp <<= 1; } } void program4() { portd = 0xAA; delay_ms(500); portd = 0x55; delay_ms(500); } void program5() { Portd = 0x7E; delay_ms(150); Portd = 0xBD; delay_ms(250); Portd = 0xDB; delay_ms(150); Portd = 0xE7; delay_ms(150); Portd = 0xDB; delay_ms(150); Portd = 0xBD; delay_ms(150); Portd = 0x7E; delay_ms(150); } void program6() { temp = 0xFF; for (i=0;i<=8;i++) { portd = temp; delay_ms(250);
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
31/32
temp = temp >> 1; } } void program7() { Portd = 0xFE; delay_ms(150); Portd = 0xFD; delay_ms(150); Portd = 0xFB; delay_ms(150); Portd = 0xF7; delay_ms(150); Portd = 0xEF; delay_ms(150); PortD = 0xDF; delay_ms(150); Portd = 0xBF; delay_ms(150); Portd = 0x7F; delay_ms(150); } void program8() { Portd = 0x7F; delay_ms(150); Portd = 0xBF; delay_ms(150); PortD = 0xDF; delay_ms(150); Portd = 0xEF; delay_ms(150); Portd = 0xF7; delay_ms(150); Portd = 0xFB; delay_ms(150); Portd = 0xFD; delay_ms(150); Portd = 0xFE; delay_ms(150); }
Người báo cáo:
Nguyễn Chí Linh
Tài liệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
32/32
3.5.
Bộ Đế m/ m/ Đị Định thời (Timer)
3.6.
Giao tiế p I2C, SPI
3.7.
PWM, Capture, Comparator