Giáo trình Vi điều khiển PIC
Chúng ta sẽ thấy rõ điều này hơn ở sau.
PIC16F877 có đặc điểm phần cứng và các chức năng:
- 368 bytes bộ nhớ dữ liệu RAM. 8K Words bộ nhớ chương trình
FLASH (trong đó mỗi word của dòng mid-range là 14bit), 256 bytes
EEPROM
- Có 3 bộ định thời Timer0, Timer1, Timer2
- Có khả năng xử lý ngắt từ nhiều nguồn ngắt khác nhau như ngắt
ngoài, ngắt tràn Timer, ngắt ngoại vi như ngắt ADC .
- Chức năng CCP gồm Comparator (Bộ so sánh), Capture và PWM
(ðiều biến độ rộng xung)
- Chức năng giao tiếp đồng bộ nối tiếp SSP (Synchnorous Serial Port)
bao gồm 2 giao tiếp SPI và giao tiếp I2C
- Chức năng bộ truyền/phát không đồng bộ đa năng nối tiếp USART
(Universal Serial Asynchnorous Receiver/Transmitter) ở dạng mô đun
phần cứng phục vụ cho giao tiếp theo chuẩn RS- 232, do đó ta không
cần quan tâm đến các thao tác cấp thấp khi sử dụng RS-232. ðây là
chức năng hữu ích trong việc giao tiếp với PC của MC
Tóm tắt nội dung tài liệu: Giáo trình Vi điều khiển PIC
Microcontroller Training Center DKS GROUP 1 Microcontroller Training Center DKS GROUP 2 MỤC LỤC Bài 1.Giới thiệu vi ñiều khiển PIC 4 1.Giới thiệu các loại chip PIC 4 2. Giới thiệu vi ñiều khiển PIC16F877 5 3.Tổ chức bộ nhớ PIC16F877 8 3.1.Tổ chức bộ nhớ chương trình 8 3.2.Bộ nhớ dữ liệu 8 3.2.Một số thanh ghi quan trọng 8 4.Lập trình cho PIC 9 4.1.Giới thiệu 18 4.2.Phần mềm lập trình cho PIC 18 4.3.Giới thiệu phần mềm CCS 18 Bài 2.Giao tiếp vào ra IO 27 1.Giao tiếp IO 27 1.1.Giới thiệu 27 1.2.Các cổng vào ra 23 2.Sơ ñồ mạch 29 3.Lập trình 30 4.Nạp chương trình cho chip 35 Bài 3.Giao tiếp với led 7 thanh 39 1.Nguyên lý 39 2.Nguyên lý hoạt ñộng 39 Bài 4.Giao tiếp với bàn phím 42 Microcontroller Training Center DKS GROUP 3 1.Sơ ñồ nguyên lý 42 2.Nguyên lý hoạt ñộng 42 3.Mã nguồn 43 4.Kỹ thuật chống rung 44 Bài 5.Bộ chuyển ñổi ADC 46 1.Sử dụng ADC với CCS 46 2.Hàm hỗ trợ 46 Bài 6.ðiều chế ñộ rộng xung (PWM) 50 1.ðôi nét về PWM 50 2.Sơ ñồ khối PWM 52 3.Hàm trong CCS 54 Bài 7.Giao tiếp máy tính 58 1.Giao tiếp RS-232 58 2.Hàm hỗ trợ 58 Bài 8.Giao tiếp I2C 64 1.Giới thiệu chung 64 2.ñặc ñiểm giao tiếp I2C 64 3.Start ,stop 66 4.ðịnh dạng dữ liệu truyền 67 5.ðịnh dạng ñịa chỉ cho thiết bị 62 6.Truyền dữ liệu trên bus I2C ,master-slave 69 7.Chế ñộ Multi-master 72 8.Modul I2C trong vi ñiều khiển PIC 72 9.ñặc ñiểm phần cứng 72 10.Cách sử dụng I2C trong CCS 73 Bài 9.Giao tiếp LCD 74 Microcontroller Training Center DKS GROUP 4 1.Giới thiệu LCD 16x2 74 2.LCD với CCS (4 bit) 80 3.Ví dụ 82 Khái niệm vi ñiều khiển (microcontroller – MC) ñã khá quen thuộc với các sinh viên CNTT, ñiện tử, ñiều khiển tự ñộng cũng như Cơ ñiện tử Nó là một trong những IC thích hợp nhất ñể thay thế các IC số trong việc thiết kế mạch logic. Ngày nay ñã có những MC tích hợp ñủ tất cả các chức năng của mạch logic. Nói như vậy không có nghĩa là các IC số cũng như các IC mạch số lập trình ñược khác như PLD không cần dùng nữa. MC cũng có những hạn chế mà rõ ràng nhất là tốc ñộ chậm hơn các mạch logic MC cũng là một máy tính – máy tính nhúng vì nó có ñầy ñủ chức năng của một máy tính. Có CPU, bộ nhớ chương trình, bộ nhớ dữ liệu, có I/O và các bus trao ñổi dữ liệu. Cần phân biệt khái niệm MC với khái niệm vi xử lý (microprocessor – MP) như 8088 chẳng hạn. MP chỉ là CPU mà không có các thành phần khác như bộ nhớ I/O, bộ nhớ. Muốn sử dụng MP cần thêm các chức năng này, lúc này người ta gọi nó là hệ vi xử lý (microprocessor system). Do ñặc ñiểm này nên nếu ñể lựa chọn giữa MC và MP trong một mạch ñiện tử nào ñó thì tất nhiên người ta sẽ chọn MC vì nó sẽ rẻ tiền hơn nhiều do ñã tích hợp các chức năng khác vào trong chip. Trong phạm vi môn học kiến trúc máy tính, chúng em xin chọn một loại MC ñể tìm hiểu với mục ñích cuối cùng là hiểu hết các chức năng của MC này và thiết kế, lắp ráp một mạch ño nhiệt ñộ dùng MC. Có rất nhiều loại MC ñể lựa chọn như họ 8051 của Atmel, Philips AVR của Atmel, dòng 68000 (32bit) của Motorola Ở ñây xin chọn PIC của hãng microchip (www.microchip.com) vì sự phổ biến của nó. Có một ñiều khá thú vị là trong sản phẩm trò chơi ñiện tử PlayStation của Sony cũng có PIC.Theo ñánh giá thì PIC là dòng MC 8 bit sử dụng nhiều nhất trên thế giới tại thời ñiểm năm 2006 này. Việt Nam có lẽ cũng không phải là một ngoại lệ. 1.Giới thiệu các loại chip PIC Như ñã nói ở phần trước, ở ñây ta sẽ chọn vi ñiều khiển PIC ñể tìm hiểu, tuy nhiên việc chọn loại nào trong họ này cũng là một ñiều cần quan tâm. PIC có rất nhiều dòng từ PIC12xx, PIC16xx, PIC18xx ñến dsPIC theo thứ tự ñộ phức tạp của từng dòng chip tăng lên, việc tìm hiểu chức năng của Microcontroller Training Center DKS GROUP 5 từng dòng này nằm ngoài phạm vi kiến thức của chúng em do ñó ở ñây xin chọn loại cao nhất trong dòng 16 ñó là PIC16F877 (mid-range). Nó là loại vi ñiều khiển loại trung với kích cỡ 1 lệnh là 14 bit (dòng 12 kích cỡ lệnh là 12bit, 18 có kích cỡ 16bit) Chữ F trong tên gọi thể hiện bộ nhớ chương trình ở ñây là bộ nhớ FLASH (có thể xoá và nạp lại xxxx lần) 2. Giới thiệu về PIC16F877 Hình 1.2.PIC16F877 a.PIC16F877 mang tất cả các ñặc ñiểm chung của các dòng PIC. - Nó là máy tính có tập lệnh rút gọn (RISC). ðiều ñó có nghĩa là số lệnh của nó hạn chế ñến mức tối thiểu ( 35 lệnh). Tại sao là RISC lại có lợi và phát triển sau này? Như ta ñã biết ñể có thể thực hiện một chức năng nào ñó thì vi ñiều khiển cần phải thực hiện các lệnh trong bộ nhớ chương trình (code memory) ñược lưu dưới dạng các số nhị phân của nó bằng các bộ giải mã (decoder). ðiều ñó cũng có nghĩa là nếu MC càng có nhiều tập lệnh càng cần nhiều bộ decoder ñể giải mã. Như vậy số mạch giải mã tích hợp trong chip sẽ cần nhiều lên. ðiều này làm cho chip cần tiêu thụ nhiều năng lượng hơn cũng như chip sẽ dễ bị nóng hơn. Như vậy nếu như ứng dụng cần tiêu thụ ít năng lượng thì người ta sẽ chọn RISC. Và có lẽ một phần nguyên nhân là do mạch của nó ñơn giản hơn nên RISC như PIC chẳng hạn ñược mọi người ñánh giá là loại MC chống nhiễu tốt nhất trong dòng 8 bit. Tất nhiên Microcontroller Training Center DKS GROUP 6 RISC cũng có ñiều không tốt, như ñể thực hiện một phép tính toán có thể phức tạp hơn một chút như lệnh nhân 2 số 8 bit hay chia số 16 bit cho 8 bit chẳng hạn thì cần viết các hàm cần một chút thủ thuật tính toán (ðó là nếu viết trực tiếp bằng ngôn ngữ Assembly còn nếu viết bằng các ngôn ngữ cấp cao như C thì sẽ không cần). Khi ñã xây dựng một trình dịch bằng ngôn ngữ C chẳng hạn thì những việc khó khăn về thuật toán hoàn toàn do trình biên dịch (compiler) xử lý nghĩa là nếu xét về mặt tốn công sức lập trình về các thuật toán thì RISC cũng xem không tốn công hơn so với CISC. Có thể hình dung chuyển từ CISC sang RISC là quá trình chuyển sự phức tạp từ phần cứng sang sự phức tạp về phần mềm. Trái lại CISC lại có số lượng các thanh ghi cũng như bộ nhớ ít hơn cần có ít hơn RISC vì: ðể thao tác một chức năng nào ñó CISC cần thao tác với số thanh ghi nhỏ hơn RISC. Ngoài ra bộ nhớ chương trình cũng giảm hơn rất nhiều. Tưởng tượng nếu RISC cần thực hiện 1 phép toán nào ñó mà cần 5 lệnh chẳng hạn. Thay vì ñó trong máy tính CISC người ta thiết kế một bộ giải mã lệnh ñể giải mã lệnh thay cho cả 5 lệnh này, như vậy rõ ràng trong máy tính CISC cần có thêm 1 bộ giải mã lệnh nhưng mã nguồn lưu trữ trong chương trình lại giảm ñi ñược 1/5. Gần ñây lại xuất hiện xu hướng ngược lại là chuyển từ phần mềm về phần cứng và có lẽ sự lựa chọn tốt nhất trong tương lai sẽ là trung gian giữa hai loại ñể trung hoà các ñặc tính của cả RISC lẫn CISC. Chính vì là RISC nên các lệnh của PIC ñã ñược tối giản hoá, tất cả các lệnh trừ các lệnh thay ñổi con trỏ chương trình(Program Counter - PC) ñều tốn 1 chu kỳ máy ( các lệnh thay ñổi PC tốn 2 chu kỳ máy). ðiều này là khác với CISC có thể có những lệnh tốn nhiều chu kỳ máy vì thực ra bản thân lệnh của CISC ñó cũng có thể coi là bao gồm nhiều lệnh của RISC vậy. PIC là MC mang cấu trúc Havard là cấu trúc có các ñường bus dữ liệu và bus chương trình riêng lẻ. ðiều này làm cho chương trình có thể ñược thực hiện ñồng thời các thao tác giải mã thực hiện lệnh với các thao tác ñọc dữ liệu cùng lúc. ðiều này khác với cấu trúc Von Neumann có 2 ñường bus này chung do ñó cùng lúc chỉ thực hiện 1 công việc. (Vẽ sơ ñồ tìm nạp) . ðây là nguyên nhân làm cho cấu trúc Von neumann thực hiện 1 lệnh lâu hơn máy mang cấu trúc Harvard. Tất nhiên người ta chỉ thấy ñược cái lợi của cấu trúc Harvard khi mà công nghệ sản xuất chip ñã ñược phát triển lên. Cũng cần phải nhớ là MC ñã ñược phát triển từ những dòng ñời trước rồi và sau này nó có thêm các chức năng khác vào vậy một câu hỏi ñược ñặt ra là nếu không có các chức năng phần cứng này thì trước ñây người ta sẽ làm Microcontroller Training Center DKS GROUP 7 thế nào ñể thực hiện các chức năng cần thiết? Thực tế người ta vẫn làm ñược các công việc ñó nhưng là bằng phần mềm. Người viết mã sẽ phải thực hiện các chức năng ñó bằng một số phương pháp nào ñấy. Còn khi tích hợp sẵn vào trong phần cứng rồi thì việc thực hiện sẽ ñơn giản hơn trước ñây. ðiều này có vẻ như lại ñi ngược với khuynh hướng ñã nêu ở trên ñối với các bộ giải mã lệnh. Quá trình giải mã lệnh chuyển từ phức tạp phần cứng sang phức tạp phần mềm. Còn quá trình thực hiện các chức năng khác lại chuyển từ phức tạp phần mềm sang phần cứng. Hai quá trình này không có gì mâu thuẫn với nhau mà ngược lại nó là một sự bổ sung cho nhau. Có thể sau này ta sẽ thấy rõ hơn ñiều này nhưng ở ñây xin ñược nói sơ qua nguyên nhân. Quá trình giải mã lệnh nếu như dùng trong RISC thì sự phức tạp phần mềm ở ñây ngoài các giải thuật (là ñiều không ñáng ngại vì qua thời gian các giải thuật này sẽ ñược tích luỹ dần dần cũng như xây dựng ñược các compiler ngôn ngữ cấp trung và cấp cao như C, Pascal) là khó khăn ra thì các phép tính cần những thứ trung gian thực hiện lúc này là bộ nhớ chính xác hơn là các thanh ghi (càng ngày càng rẻ và dễ chế tạo). Còn ở quá trình thực hiện các chức năng khác thì nếu không có phần cứng thêm vào thì các phần cứng hiện thời ñược sử dụng sẽ mất công vào việc này mà sẽ không thực hiện ñược việc khác. Chúng ta sẽ thấy rõ ñiều này hơn ở sau. PIC16F877 có ñặc ñiểm phần cứng và các chức năng: - 368 bytes bộ nhớ dữ liệu RAM. 8K Words bộ nhớ chương trình FLASH (trong ñó mỗi word của dòng mid-range là 14bit), 256 bytes EEPROM - Có 3 bộ ñịnh thời Timer0, Timer1, Timer2 - Có khả năng xử lý ngắt từ nhiều nguồn ngắt khác nhau như ngắt ngoài, ngắt tràn Timer, ngắt ngoại vi như ngắt ADC. - Chức năng CCP gồm Comparator (Bộ so sánh), Capture và PWM (ðiều biến ñộ rộng xung) - Chức năng giao tiếp ñồng bộ nối tiếp SSP (Synchnorous Serial Port) bao gồm 2 giao tiếp SPI và giao tiếp I2C - Chức năng bộ truyền/phát không ñồng bộ ña năng nối tiếp USART (Universal Serial Asynchnorous Receiver/Transmitter) ở dạng mô ñun phần cứng phục vụ cho giao tiếp theo chuẩn RS- 232, do ñó ta không cần quan tâm ñến các thao tác cấp thấp khi sử dụng RS-232. ðây là chức năng hữu ích trong việc giao tiếp với PC của MC Microcontroller Training Center DKS GROUP 8 - Bộ chuyển ñổi ADC 10 bit chuyển ñổi tín hiệu tương tự thành tín hiệu số 10 bit. Nguồn ñiện áp tham chiếu có thể chọn từ nguồn ngoài hoặc từ nguồn Vdd và Vss cấp cho PIC - Chức năng giao tiếp song song PSP (Parralel Slave Port) - Chức năng Watchdog Timer 1. Tổ chức bộ nhớ 2. Giao tiếp vào ra I/O 3. Sử dụng Timer 4. Ngắt 5. Sử dụng EEPROM và FLASH ñể lưu tham số 6. Môñun CCP (Capture/Compare/PWM) 7. Bộ biến ñổi tương tự - số ADC 10bit, 8bit 8. Giao tiếp không ñồng bộ với máy tính qua chuẩn RS-232 bằng USART 9. Các giao tiếp nối tiếp ñồng bộ SPI và I2C 10. Tóm gọn về tập lệnh ðể có thể có cách ñọc dễ hiểu, trong quá trình giới thiệu chi tiết các chức năng tích hợp trong chip, ta sẽ giới thiệu luôn các lệnh cần thiết tương ứng cần dùng. 3.Tổ chức bộ nhớ của PIC 16F877 3.1.Tổ chức bộ nhớ chương trình Nhìn vào sơ ñồ bên ta có thể hình dung về bộ nhớ chương trình của PIC:Bộ nhớ chương trình có 8KWords (1 word = 14 bits) ñược phân thành 4 trang có ñịa chỉ như bên. Cần nhớ với con trỏ chương trình PC là 13 bit thì kích cỡ ñịa chỉ tối ña ñánh ñược là 213 = 8K do ñó ta có thể thấy với dòng mid-range thì kích thước bộ nhớ chương trình PIC16F877 ñã là tối ña có thể ñạt ñược ñến, với những loại kém hơn trong mid-range thì bộ nhớ ít hơn do ñó khi PC tăng vượt quá giá trị bộ nhớ của nó sẽ xảy ra hiện tượng quay vòng trở lại phần ñầu của bộ nhớ chương trình Có 8 stack. Stack là nơi ta lưu PC lúc cần phục vụ cho các thao tác ngắt cũng như chương trình con. Chỉ có 8 mức stack ñiều ñó có nghĩa là nếu có 9 lần ñẩy vào stack thì lần ñầu tiên sẽ bị mất ñịa chỉ trở về và chương trình sẽ bị chạy sai. PIC không có cờ ngắt báo xảy ra tràn stack. 3.2.Bộ nhớ dữ liệu PIC là loại chip có bộ xử lý chỉ quản lý một không gian ñịa chỉ duy nhất, gọi là không gian ñịa chỉ bộ nhớ. Microcontroller Training Center DKS GROUP 9 Bộ nhớ dữ liệu phân thành 4 banks như hình bên phân thành hai vùng là vùng các thanh ghi trạng thái và ñiều khiển, vùng 2 là vùng các thanh ghi ña mục ñích. Nếu muốn thực hiện một chức năng nào ñó thông thường ta cần thao tác với các thanh ghi ñiều khiển ñể thiết lập một số cài ñặt cần thiết, còn vùng các thanh ghi ña mục ñích GPR (General Purpose Register) thường ñể lưu các biến trung gian phục vụ cho các thao tác tính toán. Microchip xem vùng không gian nhớ RAM như là các thanh ghi mặc dù chức năng của nó thực sự không phải như các thanh ghi, nó chỉ dùng ñể chứ dữ liệu. Nếu muốn thao tác với thanh ghi nào trước tiên ta phải xem nó thuộc bank nào trong 4 bank sau ñó ta phải chuyển ñến bank ñó bằng cách thao tác với 2 bít RP1 và RP0 của thanh ghi trạng thái STATUS như bảng dưới với các lệnh BCF STATUS, RP1 BSF STATUS, RP0 sẽ chuyển về bank 1. Các tên STATUS, RP1, RP0 khi dịch ra không có ý nghĩa gì với PIC mà nó chỉ là các tên ñịnh danh ñã ñược khai báo trong tệp tiêu ñề (mà ta sẽ phải include ở ñầu chương trình) của MPASM (Trình biên dịch assembler) tương ứng với giá trị ñịa chỉ của thanh ghi ñó, cũng có thể chuyển các bank bằng cách sử dụng macro ñã ñược trình biên dịch hợp ngữ BANKSEL. Nếu ta viết BCF 0x03, 6 BSF 0x03, 5 Thì cũng hoàn toàn tương ñương với lệnh trên (lúc này không cần thiết include nữa) 3.3.Một số thanh ghi quan trọng a) Thanh ghi trạng thái Cũng giống như tất cả các bộ vi xử lý khác, ở ñây ta có thanh ghi trạng thái STATUS tại các ñịa chỉ 03h, 83h,103h, 183h nằm ở cả 4 bank. Thanh ghi trạng thái có ñịa chỉ tại 4 bank ñể ta có thể tiện trong quá trình thao tác, hơn nữa ngay bản thân các bit xác ñịnh vị trí bank cũng nằm trong thanh ghi trạng thái IRP: Bit lựa chọn bank ñược dùng trong chế ñộ truy nhập ñịa chỉ gián tiếp Microcontroller Training Center DKS GROUP 10 RP1:RP0 Bit lựa chọn bank ñược dùng trong chế ñộ truy nhập ñịa chỉ trực tiếp TO : Bit Time-out 1 = Sau khi bật nguồn hoặc lệnh CLRWDT, hoặc lệnh SLEEP 0 = 1 time-out của WDT xảy ra (WDT = watch dog timer) PD : Bit Power-down 1 = Sau khi bật nguồn hoặc lệnh CLRWDT 0 = Sự thực hiện lệnh SLEEP Z : Cờ trạng thái zero 1 = Thao tác logic hoặc số học bằng 0 0 = khác 0 DC : Bit carry/borrow chữ số 1 = carry từ 4 bit thấp 0 = không carry từ 4 bit thấp C : Carry/borrow 1 = carry từ bit MSb 0 = không carry từ bit MSb b)Thanh ghi trạng thái OPTION Nó chức các bit ñiều khiển ñể cấu hình RBPU : Bit enable ñiện trở kéo lên ở PORTB INTEDG : Bit xác ñịnh cạnh lên của ngắt ngoài tại chân RB0/INT T0CS : Bit lựa chọn nguồn clock của timer0 T0SE : ............ PSA: Bit gán tỷ lệ Prescaler 1 = Gán cho WDT 0 = Gán cho môñun Timer0 PS2:PS0 Bit lựa chọn tỷ lệ gán c)Thanh ghi INTCON(Thanh ghi ñiều khiển ngắt chung) GIE : Bit enable tất cả các nguồn ngắt, nếu muốn disable tất cả các nguồn ngắt chỉ cần disable nguồn ngắt này, còn nếu enable 1 nguồn ngắt nào ñó thì enable bit này sẽ là lệnh cuối cùng PEIE: Bit enable các ngắt ngoại vi TMR0IE: Bi ... ining Center DKS GROUP 21 4.3.3. Tab Other Tab này cho phép ta thiết lập các thông số cho các bộ Capture/Comparator/PWM. Capture - Bắt giữ - Chọn bắt giữ xung theo sườn dương (rising edge) hay sườn âm (falling 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 xảy 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: o Thực hiện ngắt và thiết lập mức 0 o Thực hiện ngắt và thiết lập mức 1 Microcontroller Training Center DKS GROUP 22 o Thực hiện ngắt nhưng không thay ñổi trạng thái của chân PIC. o ðưa Timer1 về 0 nhưng không thay ñổi trạng thái chân. 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ộ so sánh. 4.3.4.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. ðâ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, Microcontroller Training Center DKS GROUP 23 9346, 9356Ngoà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: \...\PICC\Drivers Hình 2.7: Tab Interrupts Microcontroller Training Center DKS GROUP 24 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 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. #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); Microcontroller Training Center DKS GROUP 25 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 #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) 4.3.5. 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à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ằ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 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. Microcontroller Training Center DKS GROUP 26 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 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: Files do người lập trình tạo ra, chứa khai báo về các thanh ghi 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 trong phần dưới ñây) - #device *=16 ADC = 10: Khai báo dùng con trỏ 8 hay 16 bit, bộ ADC là 8 hay 10 bit - #FUSES NOWDT, HS: Khai báo về cấu hình cho PIC - #use delay(clock=20000000): Tần số thạch anh sử dụng - #use rs232 (baud=9600,): Khai báo cho giao tiếp nối tiếp RS232 - #use i2c(master, SDA=PIN_C4,): Khai báo dùng I2C, chế ñộ hoạt ñộng - #include :Khai báo các files thư viện ñược sử dụng ví dụ LCD_lib_4bit.c - #INT_xxx : 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) {}: Chương trình chính hay chương trình con Chương trình mẫu cho PIC16F877A //================================================= ======= // Ten chuong trinh : Mach test den LED_1 // Nguoi thuc hien : Falleaf // Ngay thuc hien : 23/05/2005 // Phien ban : 1.0 // 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 hoan thanh : 23/05/2005 // Ngay kiem tra : 23/05/2005 // Nguoi kiem tra : Doan Hiep //---------------------------------------------------------------- // 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 //================================================= ======= Microcontroller Training Center DKS GROUP 27 #include #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) #int_xxx // Khai bao chuong trinh ngat xxx_isr() { // Code here } void Ten_chuong_trinh_con(Ten_Bien) { // Code here } void main() { // Enter code here! } Người báo cáo: Nguyễn Chí Linh Tài liệu: TUT01.01.PVN Ngày: 4/2/2006 Trang: 12/32 Chương trình mẫu cho PIC16F876A //================================================= ======= // Ten chuong trinh : Mach test den LED_1 // Nguoi thuc hien : Falleaf // Ngay thuc hien : 23/05/2005 // Phien ban : 1.0 // 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 hoan thanh : 23/05/2005 // Ngay kiem tra : 23/05/2005 // Nguoi kiem tra : Doan Hiep //---------------------------------------------------------------- // 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 //================================================= ======= Microcontroller Training Center DKS GROUP 28 #include #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) #int_xxx // Khai bao chuong trinh ngat xxx_isr() { // Code here } void Ten_chuong_trinh_con(Ten_Bien) { // Code here } void main() { // Enter code here! } Chương trình mẫu cho PIC16F88 //================================================= =======A // Ten chuong trinh : Mach test den LED_1 // Nguoi thuc hien : Falleaf // Ngay thuc hien : 23/05/2005 // Phien ban : 1.0 // 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 hoan thanh : 23/05/2005 // Ngay kiem tra : 23/05/2005 // Nguoi kiem tra : Doan Hiep //---------------------------------------------------------------- // 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 Microcontroller Training Center DKS GROUP 29 #include #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) #int_xxx // Khai bao chuong trinh ngat xxx_isr() { // Code here } void Ten_chuong_trinh_con(Bien) { // Code here } void main() { // Enter code here! } 1. Giao tiếp vào ra I/O 1.1.Giới thiệu Thông thường, trong một hệ vi xử lý, người ta lại phải ghép nối chip vi xử lý với các mô ñun vào ra, tuy nhiên với tất cả các loại vi ñiều khiển ñều tích hợp mô ñun vào ra vào trong chip. Bởi vì có thể nói, thao tác vào ra là thao tác quan trọng nhất mà bất cứ vi ñiều khiển nào cần có 1.2.Các cổng vào ra trong PIC16F877 ðể giảm bớt số chân ra, một số chân của PIC là các chân ña chức năng, nó phục vụ cho các thiết bị ngoại vi. Ở ñây khái niệm thiết bị ngoại vi không có nghĩa là 1 chip khác mua rời bên ngoài mà là các mô ñun ñược tích hợp sẵn trong chip như các mô ñun ADC.... Khi các thiết bị ngoại vi này ñược enable thì các chân này không ñược sử dụng như các chân của các cổng I/O thông thường nữa. PIC16F877 có 5 cổng vào ra là PORTA, PORTB, PORTC, PORTD, PORTE, tương ứng với nó là các thanh ghi cấu hình TRISA, TRISB, TRISC, TRISD, TRISE. Trong PIC, các ngăn nhớ trong RAM ñược gọi là các thanh ghi, tất nhiên thực tế thì không ñúng bởi vì các thanh ghi ñược xem là các thành phần của CPU, còn các ngăn nhớ lại thuộc bộ nhớ. 1.3.Thanh ghi PORTA(bank0) và TRISA(bank1) Microcontroller Training Center DKS GROUP 30 PORTA có 6 bit, 2 hướng (vào và ra). Các bit cấu hình hướng nằm trong thanh ghi TRISA, nếu bit tương ứng bằng 0 thì bit ñó là output và ngược lại sẽ là input. Việc ñọc nội dung của thanh ghi PORTA sẽ ñọc các trạng thái của các chân, trong khi ghi lên PORTA thì sẽ ghi lên chốt cổng. Mặt khác, tất cả các hoạt ñộng ghi ñều là hoạt ñộng ñọc-sửa-ghi (read-modify-write). Do ñó ghi ñến 1 cổng nghĩa là các chân của cổng ñược ñọc, giá trị ñược sửa và sau ñó ghi lại lên chốt dữ liệu của cổng. Chân RA4 ñược dồn kênh với ñầu vao clock của mô ñun Timer0 gọi là chân RA4/T0CKI. Chân này là 1 ñầu vào Trigger-Schmitt và ñầu ra hở máng. Tất cả các chân PORTA khác có mức ñiện áp ñầu vào theo mức TTL, còn ñiện áp ddaauf ra theo mức CMOS. Các chân PORTA khác ñược dồn kênh với các ñầu vào analog và ñầu vào ñiện áp tham chiếu analog Vref cho cả mô ñun ADC và Bộ so sánh bộ biến ñổi tương tự số ADC 10 bit, 8bit. Hoạt ñộng của các chân này ñược lựa chọn bằng cách set/clear các bit ñiều khiển thích hợp trong ADCON1 và CMCON.Thanh ghi TRISA ñiều khiển hướng của các chân của cổng ngay cả khi các chân này ñược sử dụng như ñầu vào analog. ðể nó là ñầu vào analog thì bit tương ứng của TRISA cũng phải set ðoạn mã sau khởi tạo PORTA BCF STATUS, RP0 BCF STATUS, RP1 ; Chuyển về bank0 chứa PORTA CLRF PORTA BSF STATUS, RP1 ; Về bank 1 MOVLW 0X06 MOVWF ADCON1 ; Cấu hình tất cả các chân là digital MOVLW 0XCF MOVWF TRISA ; RA là output, RA input 1.2.Thanh ghi PORTB và TRISB PORTB là thanh ghi 8 bit, 2 hướng. Quan hệ với TRISB cũng tương tự PORTA. Các chân của PORTB ñược dồn kênh với 1 số chức năng ñặc biệt khác và các chức năng debug ngay trong mạch (không phải gỡ chip ra khỏi mạch), và chức năng lập trình ở chế ñộ ñiện áp thấp: RB3/PGM, RB6/PGC, RB7/PGD. ðây là những chức năng ñặc biệt của CPU. Microcontroller Training Center DKS GROUP 31 Mỗi chân của PORTB có 1 ñiện trở kéo lên nhỏ bên trong. Một bit ñiều khiển dùng ñể “bật” (enable) tất cả các ñiện trở này lên, ñây chính là chức năng của bit RBPU trong thanh ghi OPTION. ðiện trở này ñược tự ñộng disable khi cổng này ñược cấu hình làm output. RB0/INT là chân dồn kênh với ngắt ngoài mà ta sẽ miêu tả trong phần ngắt 1.3 Thanh ghi PORTC và TRISC PORTC là thanh ghi 8 bit, 2 hướng. Có bộ ñệm ñầu vào Trigger Schmitt. Nó cũng ñược dồn kênh với vài chức năng ñặc biệt khác. 1.4 Thanh ghi PORTD và TRISD Là cổng 8 bit, 2 hướng. có bộ ñệm ñầu vào Trigger Schmitt Nó dồn kênh thêm với chức năng giao tiếp cổng song song Slave (parallel Slave Port) bằng cách thiết lập bit ñiều khiển PSPMODE (TRISE) 1.5 Thanh ghi PORTE và TRISE Có 3 chân, có bộ ñệm ñầu vào kiểu Trigger Schmitt. Dồn kênh với các ñầu vào analog mà ta sẽ xem xét trong phần ADC. TRISE do còn thừa 5 bit không sử dụng trong cấu hình PORTE do ñó các bit thừa này ñược dùng ñể cấu hình các chức năng khác như chức năng cổng song song PSP. 2.Sơ ñồ mạch ðây là sơ ñồ mạch giao tiếp với Led ñơn dùng cho PIC 16F877A Microcontroller Training Center DKS GROUP 32 3. Lập trình Bài học này sẽ hướng dẫn các bạn cách lập trình ñiều khiển các con led nhấp nháy. Các bạn thực hành theo các bước sau: -Khởi ñộng phần mềm CCS , click vào project /wizard,,rồi gõ tên project cần tạo. Màn hình sẽ hiển thị bảng thông số cho phép bạn lựa chọn Bạn có thể lựa chọn các thông số tuỳ ý , như chọn device (chọn loại chip ñược sử dụng) 16F877A ,tần số thạch anh 20MHZ .Ngoài ra còn các thông số khác như driver , I/O pin ,timer .communication. Microcontroller Training Center DKS GROUP 33 Sau khi thiết lập các thông số ,bạn click ok ,ñể bước vào màn hình soạn thảo chương trình. Microcontroller Training Center DKS GROUP 34 Soạn thảo mã nguồn như sau #include "E:\nguyencan\DKS\led.h" #fuses NOWDT,NOPROTECT,HS #use delay(clock=20000000) void main() { set_tris_b(0x00); while(1) { output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0); delay_ms(1000); } Microcontroller Training Center DKS GROUP 35 } ñoạn mã trên có tác dụng lập trình ñể con led nối với chân RB0 bật tắt liên tục. Giải thích các lệnh trong chương trình #fuses NOWDT,NOPROTECT,HS Lệnh này cho phép chọn các chế ñộ lập trình NOWDT là không chọn chế ñộ watchdog ,NOPROTECT là không có chế ñộ bảo vệ mã nguồn.HS là dao ñộng thạch anh. #use delay(clock=20000000) Hàm này chọn chế ñộ delay theo tần số thạch anh là 20MHZ void main() { set_tris_b(0x00); while(1) {
File đính kèm:
- giao_trinh_vi_dieu_khien_pic.pdf