Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 142 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
142
Dung lượng
2,88 MB
Nội dung
ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 1.1 PIC LÀ GÌ ? PIC viết tắt “Programable Intelligent Computer”, tạm dòch “máy tính thông minh khả trình” hãng Genenral Instrument đặt tên cho vi điều khiển họ: PIC1650 thiết kế để dùng làm thiết bò ngoại vi cho vi điều khiển CP1600 Vi điều khiển sau nghiên cứu phát triển thêm từ hình thành nên dòng vi điều khiển PIC ngày 1.2 TẠI SAO LÀ PIC MÀ KHÔNG LÀ CÁC HỌ VI ĐIỀU KHIỂN KHÁC? Hiện thò trường có nhiều họ vi điều khiển 8051, Motorola 68HC, AVR, ARM, Ngoài họ 8051 hướng dẫn cách môi trường đại học, thân người viết chọn họ vi điều khiển PIC để mở rộng vốn kiến thức phát triển ứng dụng công cụ nguyên nhân sau: Họ vi điều khiển tìm mua dễ dàng thò trường Việt Nam Giá thành không đắt Có đầy đủ tính vi điều khiển hoạt động độc lập Là bổ sung tốt kiến thức ứng dụng cho họ vi điều khiển mang tính truyền thống: họ vi điều khiển 8051 Số lượng người sử dụng họ vi điều khiển PIC Hiện Việt Nam giới, họ vi điều khiển sử dụng rộng rãi Điều tạo nhiều thuận lợi trình tìm hiểu phát triển ứng dụng như: số lượng tài liệu, số lượng ứng dụng mở phát triển thành công, dễ dàng trao đổi, học tập, dễ dàng tìm dẫn gặp khó khăn,… Sự hỗ trợ nhà sản xuất trình biên dòch, công cụ lập trình, nạp chương trình từ đơn giản đến phức tạp,… Các tính đa dạng vi điều khiển PIC, tính không ngừng phát triển ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 1.3 KIẾN TRÚC PIC Cấu trúc phần cứng vi điều khiển thiết kế theo hai dạng kiến trúc: kiến trúc Von Neuman kiến trúc Havard Hình 1.1: Kiến trúc Havard kiến trúc Von-Neuman Tổ chức phần cứng PIC thiết kế theo kiến trúc Havard Điểm khác biệt kiến trúc Havard kiến trúc Von-Neuman cấu trúc nhớ liệu nhớ chương trình Đối với kiến trúc Von-Neuman, nhớ liệu nhớ chương trình nằm chung nhớ, ta tổ chức, cân đối cách linh hoạt nhớ chương trình nhớ liệu Tuy nhiên điều có ý nghóa tốc độ xử lí CPU phải cao, với cấu trúc đó, thời điểm CPU tương tác với nhớ liệu nhớ chương trình Như nói kiến trúc Von-Neuman không thích hợp với cấu trúc vi điều khiển Đối với kiến trúc Havard, nhớ liệu nhớ chương trình tách thành hai nhớ riêng biệt Do thời điểm CPU tương tác với hai nhớ, tốc độ xử lí vi điều khiển cải thiện đáng kể Một điểm cần ý tập lệnh kiến trúc Havard tối ưu tùy theo yêu cầu kiến trúc vi điều khiển mà không phụ thuộc vào cấu trúc liệu Ví dụ, vi điều khiển dòng 16F, độ dài lệnh 14 bit (trong liệu tổ chức thành byte), kiến trúc Von-Neuman, ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu độ dài lệnh bội số byte (do liệu tổ chức thành byte) Đặc điểm minh họa cụ thể hình 1.1 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 1.4 RISC CISC Như trình bày trên, kiến trúc Havard khái niệm so với kiến trúc Von-Neuman Khái niệm hình thành nhằm cải tiến tốc độthực thi vi điều khiển Qua việc tách rời nhớ chương trình nhớ liệu, bus chương trình bus liệu, CPU lúc truy xuất nhớ chương trình nhớ liệu, giúp tăng tốc độ xử lí vi điều khiển lên gấp đôi Đồng thời cấu trúc lệnh không phụ thuộc vào cấu trúc liệu mà linh động điều chỉnh tùy theo khả tốc độ vi điều khiển Và để tiếp tục cải tiến tốc độthực thi lệnh, tập lệnh họ vi điều khiển PIC thiết kế cho chiều dài mã lệnh cố đònh (ví dụ họ 16Fxxxx chiều dài mã lệnh 14 bit) cho phép thực thi lệnh chu kì xung clock ( ngoại trừ số trường hợp đặc biệt lệnh nhảy, lệnh gọi chương trình … cần hai chu kì xung đồng hồ) Điều có nghóa tập lệnh vi điều khiển thuộc cấu trúc Havard lệnh hơn, ngắn hơn, đơn giản để đáp ứng yêu cầu mã hóa lệnh số lượng bit đònh Vi điều khiển tổ chức theo kiến trúc Havard gọi vi điều khiển RISC (Reduced Instruction Set Computer) hay vi điều khiển có tập lệnh rút gọn Vi điều khiển thiết kế theo kiến trúc Von-Neuman gọi vi điều khiển CISC (Complex Instruction Set Computer) hay vi điều khiển có tập lệnh phức tạp mã lệnh số cố đònh mà bội số bit (1 byte) 1.5 PIPELINING Đây chế xử lí lệnh vi điều khiển PIC Một chu kì lệnh vi điều khiển bao gồm xung clock Ví dụ ta sử dụng oscillator có tần số MHZ, xung lệnh có tần số MHz (chu kì lệnh us) Giả sử ta có đoạn chương trình sau: MOVLW 55h MOVWF PORTB CALL SUB_1 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu BSF PORTA,BIT3 instruction @ address SUB_1 Ở ta bàn đến qui trình vi điều khiển xử lí đoạn chương trình thông qua chu kì lệnh Quá trình thực thi sau: Hình 1.2: Cơ chế pipelining(hinh) TCY0: đọc lệnh TCY1: thực thi lệnh 1, đọc lệnh TCY2: thực thi lệnh 2, đọc lệnh TCY3: thực thi lệnh 3, đọc lệnh TCY4: lệnh lệnh thực thi theo qui trình thực thi chương trình (lệnh thực thi phải lệnh label SUB_1) nên chu thi lệnh dùng để đọc lệnh label SUB_1 Như xem lênh cần chu kì xung clock để thực thi TCY5: thực thi lệnh SUB_1 đọc lệnh SUB_1 Quá trình thực tương tự cho lệnh chương trình Thông thường, để thực thi lệnh, ta cần chu kì lệnh để gọi lệnh đó, chu kì xung clock để giải mã thực thi lệnh Với chế pipelining trình bày trên, lệnh xem thực thi chu kì lệnh Đối với lệnh mà trình thực thi làm thay đổi giá trò ghi PC (Program Counter) cần hai chu kì lệnh để thực thi phải thực việc gọi lệnh đòa ghi PC tới Sau xác đònh vò trí lệnh ghi PC, lệnh cần chu kì lệnh để thực thi xong 1.6 CÁC DÒNG PIC VÀ CÁCH LỰA CHỌN VI ĐIỀU KHIỂN PIC Các kí hiệu vi điều khiển PIC: PIC12xxxx: độ dài lệnh 12 bit PIC16xxxx: độ dài lệnh 14 bit PIC18xxxx: độ dài lệnh 16 bit C: PIC có nhớ EPROM (chỉ có 16C84 EEPROM) F: PIC có nhớ flash LF: PIC có nhớ flash hoạt động điện áp thấp ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu LV: tương tự LF, kí hiệu cũ Bên cạnh số vi điệu khiển có kí hiệu xxFxxx EEPROM, có thêm chữ A cuối flash (ví dụ PIC16F877 EEPROM, PIC16F877A flash) Ngoài có thêm dòng vi điều khiển PIC dsPIC Ở Việt Nam phổ biến họ vi điều khiển PIC hãng Microchip sản xuất Cách lựa chọn vi điều khiển PIC phù hợp: Trước hết cần ý đến số chân vi điều khiển cần thiết cho ứng dụng Có nhiều vi điều khiển PIC với số lượng chân khác nhau, chí có vi điều khiển có chân, có vi điều khiển 28, 40, 44, … chân Cần chọn vi điều khiển PIC có nhớ flash để nạp xóa chương trình nhiều lần Tiếp theo cần ý đến khối chức tích hợp sẵn vi điều khiển, chuẩn giao tiếp bên Sau cần ý đến nhớ chương trình mà vi điều khiển cho phép Ngoài thông tin cách lựa chọn vi điều khiển PIC tìm thấy sách “Select PIC guide” nhà sản xuất Microchip cung cấp 1.7 NGÔN NGỮ LẬP TRÌNH CHO PIC Ngôn ngữ lập trình cho PICđa dạng Ngôn ngữ lập trình cấp thấp có MPLAB (được cung cấp miễn phí nhà sản xuất Microchip), ngôn ngữ lập trình cấp cao bao gồm C, Basic, Pascal, … Ngoài có số ngôn ngữ lập trình phát triển dành riêng cho PIC PICBasic, MikroBasic,… 1.8 MẠCH NẠP PIC Đây dòng sản phẩm đa dạng dành cho vi điều khiển PIC Có thể sử dụng mạch nạp cung cấp nhà sản xuất hãng Microchip như: PICSTART plus, MPLAB ICD 2, MPLAB PM 3, PRO MATE II Có thể dùng sản phẩm để nạp cho vi điều khiển khác thông qua chương trình MPLAB Dòng sản phẩm thống có ưu nạp cho tất vi ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu điều khiển PIC, nhiên giá thành cao thường gặp nhiều khó khăn trình mua sản phẩm Ngoài tính cho phép nhiều chế độ nạp khác nhau, có nhiều mạch nạp thiết kế dành cho vi điều khiển PIC Có thể sơ lược số mạch nạp cho PIC sau: JDM programmer: mạch nạp dùng chương trình nạp Icprog cho phép nạp vi điều khiển PIC có hỗ trợ tính nạp chương trình điện áp thấp ICSP (In Circuit Serial Programming) Hầu hết mạch nạp hỗ trợ tính nạp chương trình WARP-13A MCP-USB: hai mạch nạp giống với mạch nạp PICSTART PLUS nhà sản xuất Microchip cung cấp, tương thích với trình biên dòch MPLAB, nghóa ta trực tiếp dùng chương trình MPLAB để nạp cho vi điều khiển PIC mà không cần sử dụng chương trình nạp khác, chẳng hạn ICprog P16PRO40: mạch nạp Nigel thiết kế tiếng Ông thiết kế chương trình nạp, nhiên ta sử dụng chương trình nạp Icprog Mạch nạp Universal Williem: mạch nạp chuyên dụng dành cho PIC P16PRO40 Các mạch nạp kể có ưu điểm lớn đơn giản, rẻ tiền, hoàn toàn tự lắp ráp cách dễ dàng, thông tin sơ đồ mạch nạp, cách thiết kế, thi công, kiểm tra chương trình nạp dễ dàng tìm download miễn phí thông qua mạng Internet Tuy nhiên mạch nạp có nhược điểm hạn chế số vi điều khiển hỗ trợ, bên cạnh mạch nạp cần sử dụng với chương trình nạp thích hợp ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 2.1 SƠ ĐỒ CHÂN VI ĐIỀU KHIỂN PIC16F877A 10 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu int flaga,flagb,flagc,flagd; output_B(0x38); lenh(); output_B(0x0e); lenh(); output_B(0x80); lenh(); delay_ms(100); while(true) { //A,B,C,D output_D(0xff); output_low(pin_D0); a=input_state(pin_D7); b=input_state(pin_D6); c=input_state(pin_D5); d=input_state(pin_D4); if((a==0)&&(flaga==0)) {output_B('A');du_lieu();flaga=1;} if(a==1) flaga=0; if((b==0)&&(flagb==0)) {output_B('B');du_lieu();flagb=1;} if(b==1) flagb=0; if((c==0)&&(flagc==0)) {output_B('C');du_lieu();flagc=1;} if(c==1) flagc=0; if((d==0)&&(flagd==0)) {output_B('D');Du_lieu();flagd=1;} if(d==1) flagd=0; //9,6,3,# output_D(0xff); 128 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu output_low(pin_D1); a=input_state(pin_D7); b=input_state(pin_D6); c=input_state(pin_D5); d=input_state(pin_D4); if((a==0)&&(flaga==0)) {output_B('9');du_lieu();} if(a==1) flaga=0; if((b==0)&&(flagb==0)) {output_B('6');du_lieu();} if(b==1) flagb=0; if((c==0)&&(flagc==0)) {output_B('3');du_lieu();} if(c==1) flagc=0; if((d==0)&&(flagd==0)) { output_B('#');du_lieu();} if(d==1) flagd=0; //8,5,2,0 output_D(0xff); output_low(pin_D2); a=input_state(pin_D7); b=input_state(pin_D6); c=input_state(pin_D5); d=input_state(pin_D4); if((a==0)&&(flaga==0)) {output_B('8');du_lieu();flaga=1;} if(a==1) flaga=0; if((b==0)&&(flagb==0)) {output_B('5');du_lieu();flagb=1;} if((c==0)&&(flagc==0)) 129 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu {output_B('2');du_lieu();flagc=1;} if(c==1) flagc=0; if((d==0)&&(flagd==0)) {output_B('0');Du_lieu();flagd=1;} if(d==1) flagd=0; // 7,4,1,clear output_D(0xff); output_low(pin_D3); a=input_state(pin_D7); b=input_state(pin_D6); c=input_state(pin_D5); d=input_state(pin_D4); if((a==0)&&(flaga==0)) {output_B('7');du_lieu();} if(a==1) flaga=0; if((b==0)&&(flagb==0)) {output_B('4');du_lieu();} if(a==1) flaga=0; if((c==0)&&(flagc==0)) {output_B('1');du_lieu();} if(a==1) flaga=0; if((d==0)&&(flagd==0)) {output_B(0x01);lenh();} if(a==1) flaga=0; }} 5.5 CHẠY CHỮ TRÊN LED MA TRẬN 5.5.1 Lưu đồ giải thuật 130 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 5.5.2 Chương trình #include #device *=16 #fuses xt,nowdt #use delay(clock = 4000000) #use fast_io(C) #use fast_io(b) #use fast_io(d) int16 i,a=0,b=0,c=1,d=0,e=1,f=0; int8 const kytu[]={ 0XFF,0XFF,0XFF,0XFF,0XFF 0XFF,0XFF,0XFF,0XFF,0XFF 0X81,0XBD,0XBD,0XC3,0XFF //CHU D 0XC3,0XBD,0XBD,0XC3,0XFF //CHU O 0XFF,0XFF 131 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 0XC1,0XB7,0XB7,0XC1,0XFF //CHU A 0X81,0XEF,0XF7,0X81,0XFF //CHU N 0XFF,0XFF,0XFF 0XBF,0XBF,0X81,0XBF,0XBF //CHU T 0XC3,0XBD,0XBD,0XC3,0XFF //CHU O 0XBF,0XBF,0X81,0XBF,0XBF //CHU T 0XFF,0XFF,0XFF 0X81,0XEF,0XF7,0X81,0XFF //CHU N 0x81,0xBD,0xB5,0x91,0xF7,0xff //CHU G 0X81,0XF7,0XF7,0X81,0XFF //CHU H 0XBD,0X81,0XBD,0XFF //CHU I 0X81,0XAD,0XAD,0XBD,0XFF //CHU E 0XFD,0X81,0XB5,0XB7,0XCF,0XFF //CHU P 0XFF,0XFF,0XFF 0X81,0XE7,0XDB,0XBD,0XFF //CHU K 0X81,0XF7,0XF7,0X81,0XFF //CHU H 0XC3,0XBD,0XBD,0XC3,0XFF //CHU O 0XC1,0XB7,0XB7,0XC1,0XFF //CHU A 0XFF,0XFF,0XFF 0XDD,0XB9,0XB5,0XCD,0XFF // 0XC3,0XBD,0XBD,0XC3,0XFF // 0XC3,0XBD,0XBD,0XC3,0XFF // 0XC3,0XAD,0XAD,0XB3,0XFF // 0XF7,0XF7,0XF7,0XFF // - 0XDD,0XB9,0XB5,0XCD,0XFF // 0XC3,0XBD,0XBD,0XC3,0XFF // 0XC3,0XBD,0XBD,0XC3,0XFF // 0XCD,0XB5,0XB5,0XC3,0XFF // 0XFF,0XFF,0XFF 0X81,0XE7,0XDB,0XBD,0XFF 0X81,0XF7,0XF7,0X81,0XFF 0XC3,0XBD,0XBD,0XC3,0XFF 0XC1,0XB7,0XB7,0XC1,0XFF //CHU K //CHU H //CHU O //CHU A 0XFF,0XFF,0XFF 0X81,0XBD,0XBD,0XC3,0XFF //CHU D 132 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 0XBF,0XBF,0X81,0XBF,0XBF 0XF7,0XF7,0XF7,0XFF //CHU T // 0XBF,0XBF,0X81,0XBF,0XBF 0X81,0XF7,0XF7,0X81,0XFF //CHU T //CHU H 0XFF,0XFF,0XFF,0XFF}; void hienthi(); void main() { set_tris_b(0); output_b(0); set_tris_d(0);output_d(0); set_tris_c(0);output_c(0); while (true) { for (i =0;i=1) d=0; if (c==256) {c=0; d=1;} if (d>=1) c=0; if (d==256) 133 // SO ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu {d=0; c=1; a=b;} if (a==205) {a=0; if (a=0 && d==256) {b=0,c=1,d=0,e=1,f=0;} } else a++; delay_US(1500); output_d(255); output_c(255); } 134 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 5.6 ĐO NHIỆT ĐỘ DÙNG LM 35 5.6.1 Lưu đồ giải thuật 135 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu 5.6.2 chương trình #include #fuses xt,nowdt #device *=16 adc =8 #use delay (clock=4000000) #use fast_io(e) #use fast_io(b) #bit rs = 0x09.2 #bit rw = 0x09.1 #bit e = 0x09.0 #BYTE LCD = 0X06 CONST char LINE_1[]="CHUONG TRINH DO NHIET DO SU DUNG LM35 #"; const char line_2[]="000102030405060708091011121314151617181920212223242526272829303132333435 363738394041424344454647484950"; const char line_3[]="NHIET DO:#"; const char line_4[]=" DO C#"; int i,b,a,adc; //********************************************** void command() { rs = 0; rw =0; e=1; e=0; DELAY_mS(1); } //********************************************** void write_data() { rs =1; RW = 0; e=1; e=0; DELAY_mS(1); 136 ĐỒÁN TỐT NGHIỆP GVHD: Lại Nguyễn Duy SV:Nguyễn Chiến Thắng: Lê Minh Hiếu } //********************************************** void main() { Setup_ADC ( ADC_clock_internal ) ; Setup_ADC_ports (AN0); Set_ADC_channel ( ) ; Delay_us (10 ); // delay 10 us set_tris_e(0);output_e(0); set_tris_b(0);output_b(0); set_tris_c(0);output_c(0); WHILE(TRUE) { lcd=0x38; command(); lcd =0x0c; command(); lcd=0X01; command(); delay_ms(1); LCD =0xc0; command(); a=0; while(line_3[a]!='#') { lcd = line_3[a]; write_data(); a++; } adc =4* read_adc ( ) ;//doc gia tri adc lcd=0xc9; command(); for (i=1;i