( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

49

Click here to load reader

Transcript of ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Page 1: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#1 (permalink)

#2 (permalink)

BKIT Hardwareclub > Document - Study > PIC

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PICTên tài khoản Ghi nhớ?

Mật khẩu

Trang chủ Đăng ký Hỏi/Ðáp Danh sách thành viên Lịch Bài gửi hôm nay Tìm Kiếm

Trang 1/2 1 2 >

LinkBack Ðiều Chỉnh Xếp Bài

08-01-2013, 08:23 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC

MỤC LỤC

Phần 1 : Cài đặt và cấu hình software

Bài 1 : Cài đặt MPLAB IDE 8.36Bài 2 : Cài đặt compiler MPLAB C18Bài 3 : Tạo project trên MPLAB 8.36 và C18 3.01

Phần 2 : Lập trình C với PIC 18F4520

Bài 4 : Khảo sát các chế độ dao độngBài 5 : Interrupt và ngắt TimerBài 6 : Ma trận phímBài 7 : Chống rung cho ma trận phímBài 8 : LCD 16x2 và bàn phím điện thoạiBài 9 : Quét led 7 đoạn và led ma trậnBài 10 : Giao tiếp nối tiếp SPIBài 11 : Điều khiển led 7 đoạn và mâ trặn bằng SPIBài 12 : Quét 2 led ma trận bằng SPIBài 13 : Giao tiếp nối tiếp I2C và DS1307Bài 14 : Analog to Digital Converter ADCBài 15 : Điều chế xung PWMBài 16 : Giao tiếp UART RS232Bài 17 : Giao tiếp với bàn phím PS2Bài 18 : Graphics LCD 128x64Bài 19 : Giao tiếp SD Card bằng SPI

__________________BS

thay đổi nội dung bởi: bs135, 15-02-2013 lúc 07:29 PM

The Following 4 Users Say Thank You to bs135 For This Useful Post:

InterMilan (12-01-2013), matxac_vtv (04-05-2013), thanh_nhan93 (28-01-2013), vipboy (01-02-2013)

08-01-2013, 08:37 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 1 : Cài đặt MPLAB IDE 8.36

Bài 1 : Cài đặt MPLAB IDE 8.36

1.1 Giới thiệu

MPLAB IDE là phần mềm được hỗ trợ bởi Microchip, dùng để soạn thảo code cho các ứng dụng của PIC. Hiện tại, tháng 8/2010MPLAB IDE đã có phiên bản 8.51. Trong tài liệu này tôi chọn phiên bản 8.36 vì nó có khá nhiều lỗi về cấu hình . Các phiênbản khác như 8.43, bạn có thể không chọn cấu hình ban đầu nhưng bản thân nó có thể tự động tìm kiếm các thư viện cần

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

1 trong 49 5/26/2013 4:18 PM

Page 2: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

thiết trong quá trình biên dịch. Với phiên bản 8.36 chúng ta phải cấu hình toàn bộ cho IDE.

1.2 Cài đặt MPLAB IDE 8.36

Bước 1 : Double Click vào file setup trong thư mục MPLAB IDE 8.36. Màn hình Welcome sẽ hiện ra như sau. Bạn chọn Nextđể tiếp tục.

Hình 1.1 : Welcome to MPLAB IDE 8.36

Bước 2 : Chọn I accept the term of the license agreement và chọn Next.

Hình 1.2 : License Agreement

Bước 3 : Để chế độ mặc định là cài đặt Complete và chọn Next để tiếp tục.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

2 trong 49 5/26/2013 4:18 PM

Page 3: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 1.3 : Chọn cài đặt complete

Bước 4 : Chọn đường dẫn cài đặt, ta nên để mặc định là C:\Program Files\Microchip\

Hình 1.4 : Chọn đường dẫn cài đặt

Bước 5 : Tiếp tục chọn I accept cho Maestro License và C32 License.

Hình 1.5 : Maestro License

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

3 trong 49 5/26/2013 4:18 PM

Page 4: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 1.6 : C32 License

Bước 6 : Giao diện sau tổng kết lại các lựa chọn của bạn, nhấn Next để tiến hành cài đặt. Nếu muốn hiệu chỉnh bạn nhấnBack.

Hình 1.7 : Bắt đầu cài đặt

Hình 1.8 : Chờ cài đặt xong

Bước 7 : Khi cài đặt xong MPLAB IDE sẽ hỏi bạn có cần cài Hi Tech không. Đây là compiler C hỗ trợ cho MPLAB IDE, tuynhiên ta sẽ không dùng compiler này mà sẽ dùng MPLAB C18. Bạn chọn No nhấn Finish để hoàn tất việc cài đặt MPLAB IDE.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

4 trong 49 5/26/2013 4:18 PM

Page 5: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#3 (permalink)

Hình 1.9 : Cài đặt hoàn tất

Thông báo dưới đâu xuất hiện, thống kê các tài liệu hướng dẫn đi kèm. Các tài liệu này đều nằm trong thư mục cài đặtC:\Program Files\Microchip\

Hình 1.10 : Các tài liệu hướng dẫn

__________________BS

thay đổi nội dung bởi: bs135, 10-01-2013 lúc 05:42 AM

The Following 2 Users Say Thank You to bs135 For This Useful Post:

InterMilan (12-01-2013), xuanbach05 (11-01-2013)

08-01-2013, 10:50 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 2 : Cài đặt compiler MPLAB C18

Bài 2 : Cài đặt compiler MPLAB C18

2.1 Giới thiệu

Khi cài đặt xong MPLAB IDE, compiler mặc định cho nó là MPASM, dùng để dịch project viết bằng ASM sang file HEX. Muốnviết chương trình bằng C, ta cần phải cài đặt thêm 1 compiler khác có hỗ trợ cho chip PIC đang dùng. Trong phần này, tôi thínghiệm trên vi điều khiển PIC18F4520 và chọn compiler C18 để hỗ trợ cho lập trình C chuẩn.

2.2 Các bước cài đặt

Bước 1 : Double Click vào file MPLAB C18 V1.0.exe để tiến hành cài đặt, màn hình welcome của MPLAB C18 sẽ hiện ra nhưsau :

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

5 trong 49 5/26/2013 4:18 PM

Page 6: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 2.1 : Welcome MPLAB C18

Bước 2 : Chọn nơi lưu trữ cho các file biên dịch của MPLAB C18, ta có thể để mặc định là C:\mcc18 .

Hình 2.2 : Chọn đường dẫn lưu trữ

Bước 3 : Chọn lựa các thành phần của gói MCC18, thông thường ta sẽ chọn hết tất cả các gói trong compier C18.

Hình 2.3 : Chọn các gói cài đặt

Bước 4 : Nhấn Next để tiến hành cài đặt

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

6 trong 49 5/26/2013 4:18 PM

Page 7: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 2.4 : Cài đặt C18

Chờ cho đến khi cài đặt xong.

Hình 2.5 : Chờ cài đặt C18

Bước 5 : Nhấn Finish để kết thúc cài đặt MPLAB C18.

Hình 2.6 : Kết thúc cài đặt C18

2.3 Cập nhật lên C18 version 3.01Phiên bản mà ta vừa cài đặt là C18 v1.0. Để cập nhật lên v3.01, ta sẽ double click và file MPLAB-C18-pgrade-doc-v3_01.exe.Màn hình welcome sẽ hiện ra như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

7 trong 49 5/26/2013 4:18 PM

Page 8: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 2.7 : Welcome C18 update

Chọn I Accept và nhấn Next để tiếp tục cài đặt.

Hình 2.8 : License Agreement

Các tài liệu hỗ trợ lập trình cho compiler C18 đi kèm.

Hình 2.9 : Các tài liệu hướng dẫn

Chọn thư mục mặc định cho việc update (giống với thư mục cài đặt C18)

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

8 trong 49 5/26/2013 4:18 PM

Page 9: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Để mặc định các thành phần sẽ được cài đặt, không cần phải check thêm.

Hình 2.10 : Các gói cài đặt C18 v3.01

Check chọn thêm các option dưới đây để MPLAB IDE tự động cấu hình các thông số tương thích với phiên bản C18 v3.01

Hình 2.11 : Chọn cấu hình update cho MPLAB IDE

Chọn Next để tiến hành Update

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

9 trong 49 5/26/2013 4:18 PM

Page 10: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#4

Hình 2.12 : Tiến hành cài đặt

Chờ cho đến khi hoàn tất.

Hình 2.13 : Chờ cho đến khi hoàn tất

Nhấn Finish để kết thúc.

Hình 2.14 : Cài đặt hoàn tất

__________________BS

thay đổi nội dung bởi: bs135, 10-01-2013 lúc 05:42 AM

The Following User Says Thank You to bs135 For This Useful Post:

InterMilan (12-01-2013)

09-01-2013, 12:29 AM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 3 : Tạo project trên MPLAB 8.36 và C18 3.01

Bài 3 : Tạo project trên MPLAB 8.36 và C18 3.01

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

10 trong 49 5/26/2013 4:18 PM

Page 11: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Tạo 1 project lần đầu trên MPLAB khá phức tạp. Người sử dụng cần phải cấu hình cho MPLAB khá nhiều. Tuy nhiên hầu hết các thông số cấuhình này sẽ được lưu lại cho lần sau, chúng ta chỉ cần phải thiết lập 1 lần. Phần này hướng dẫn cách tạo 1 project đơn giản trên MPLAB cho chip18F4520 và mạch nạp PICKit2 trên board BKIT PIC.

3.1 Tạo mới project

Kích hoạt chương trình MPLAB IDE 8.36 từ biểu tượng Microchip trên màn hình Desktop, cửa sổ sau đây sẽ hiện ra.

Hình 3.1 : Màn hình khởi động của MPLAB IDE 8.36

Chọn menu Project và chọn New

Hình 3.2 : Tạo mới project

Cửa sổ sau đây hiện ra, bạn đặt tên cho project ở khung Project Name và chọn đường dẫn cho nó ở khung Project Directory.

Hình 3.3 : Đặt tên và chọn thư mục lưu trữ

Cửa sổ làm việc của project sẽ hiện ra ở bên trái như hình dưới đây. Nếu cửa sổ project không hiện ra bạn sẽ chọn menu View và chọn Project.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

11 trong 49 5/26/2013 4:18 PM

Page 12: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.4 : Cửa sổ project

Chọn compile C18 cho project này bằng cách chọn vào menu Project và chọn Select Language Toolsuite.

Hình 3.5 : Chọn Language ToolSuite (Compiler)

Chọn Active Toolsuite là Microchip C18 Toolsuite. Các đường dẫn của các chương trình trong gói compiler cho C18 đã được cấu hình trong lúc càiđặt C18 upgrade, bạn không cần phải chỉnh lại. Các gói này đều nằm trong thư mục C:\mcc18.

Hình 3.6 : Chọn compiler C18

3.2 Cấu hình cho chip

Phần này có ảnh hưởng đối với quá trình dịch và nạp cho chip. Chọn menu Configure và chọn Select Device… để chọn chip.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

12 trong 49 5/26/2013 4:18 PM

Page 13: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.7 : Select Device

Giao diện dưới đây hiện ra và bạn chọn cho đúng chip mà mình đang dùng. Ở đây tôi chọn chip PIC18F4520.

Nhấn OK để đóng cửa sổ này lại. Tiếp theo đó là việc lựa chọn cấu hình thạch anh và 1 số cấu hình khác. Bạn vào lại menu Configure và chọnConfiguration Bits…

Hình 3.8 : Configuration Bits

Màn hình để bạn cấu hình cho chế độ hoạt động của chip dưới đây hiện ra. Check bỏ dấu chọn ở Configuration Bits set in code để bạn có thểthay đổi các thông số.Thông số đầu tiên là chế độ thạch anh, tùy vào mỗi loại chip và thạch anh mà chọn lựa khác nhau. Ở đây tôi sử dụng thạch anh ngoài 12MHznên sẽ chọn chế độ thạch anh là HS (High Speed). Các chế độ thạch anh của PIC18F4520 sẽ được đề cập ở các bài sau.PORTB bit 4-0 ở chế độ mặt định là các chân analog. Khi không sử dụng analog bạn cần phải chỉnh sang chế độ Digital khi reset.Disable chức năng Low Voltage Programming (LVP - Nạp điện áp thấp), mạch PICKit2 không hỗ trợ chức năng này.Sau khi hoàn thành bạn check lại Configuration Bits set in code và đóng cửa sổ này lại.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

13 trong 49 5/26/2013 4:18 PM

Page 14: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.9 : Thiết lập thạch anh, PortB, LVP

3.3 Tạo mới file và add thư viện cho project

Bước tiếp theo là tạo file source để viết code. Từ toolbar bạn có thể chọn New File hoặc và menu File và chọn New.

Hình 3.10 : Tạo mới source file

Một file mới được tạo ra với tên mặc định là Untitled như hình dưới đây.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

14 trong 49 5/26/2013 4:18 PM

Page 15: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.11 : File mới được tạo ra

Bạn nhấn và menu File và chọn Save As… để lưu lại file này. Cửa số dưới đây hiện ra và bạn chọn đường dẫn để lưu cho chính xác. Thôngthường ta sẽ lưu trong thư mục chứa project hiện tại cho dễ quản lý.

Hình 3.12 : Lưu file trong thư mục chứa project

Nhấn Save để lưu file với tên mới là main.c và đóng cửa sổ trên lại. Bước tiếp theo là add file vừa mới lưu (main.c) và thư mục Source File củaproject. Click chuột phải vào Source File và chọn Add Files…

Hình 3.13 : Add file vào Source Files

Chọn đường dẫn đến file main.c và nhấn Open.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

15 trong 49 5/26/2013 4:18 PM

Page 16: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.14 : Browse đường dẫn đến main.c

File main.c sẽ được add vào mục Source File của project như hình bên dưới.

Hình 3.15 : Add xong main.c cho Source Files

Tiếp theo ta sẽ add các thư viện cho project. Đầu tiên là Header Files. Cũng tương tự như khi add file vào Source File, click chuột phải và chọnAdd Files. Browse đường dẫn đến C:\mcc18\h và chọn file p18f4520.h hoặc gõ tên file này vào mục File name rồi nhấn Open.

Hình 3.16 : Add Header File

Add file vào mục Linker Script, browse đường dẫn đến C:\mcc18\lkr và chọn file 18f4520.lkr.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

16 trong 49 5/26/2013 4:18 PM

Page 17: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.17 : Add file Linker Script

Add file lib vào mục Library Files, 18f4520.lib tại thư mục C:\mcc18\lib

Hình 3.18 : Add Library File

3.4 Cấu hình cho quá trình dịch project

Khi dịch project, compiler cần 1 số file object của nó (chẳng hạn như c018i.o), ta cần phải chỉ đường dẫn tìm kiếm các file object này chocompiler. Đối với 1 số phiên bản MPLAB, nó tự động tìm đúng các file này. Tuy nhiên đối với phiên bản 8.36 ta cần phải chỉ định đường dẫn tìmkiếm. Từ menu Project, chọn Build Option và chọn Project.

Giao diện Build Option hiện ra, tại mục Show Directories for bạn chọn Include Search Path, chọn New và Browse đường dẫn đến C:\mcc18\h.Sau đó chỉnh sang Library Search Path và tạo mới 1 đường dẫn C:\mcc18\lib

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

17 trong 49 5/26/2013 4:18 PM

Page 18: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.19 : Tạo đường dẫn cho include file

Hình 3.20 : Tạo đường dẫn cho Library File

Nhấn OK để hoàn tất việc cấu hình của quá trình dịch.

3.5 Viết code cho project

Double Click vào file main.c và bắt đầu viết code cho project. Ta viết 1 đoạn code nhỏ để làm cho các led nối với PORTB của vi điều khiến sángxen kẽ (PORTB = 0xAA)

Code:

#include <p18f4520.h>void main(){

TRISB = 0x00;PORTB = 0xAA;while(1);

}

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

18 trong 49 5/26/2013 4:18 PM

Page 19: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.21 : Double Click và main.c và viết code

Để kiểm tra code viết có lỗi hay không bạn vào menu Project và chọn Build All hoặc nhấn tổ hợp phím nóng Ctrl F10. Nếu không có lỗi thôngbáo BUILD SUCCEEDED sẽ xuất hiện.

Hình 3.22 : Biên dịch thành công

3.6 Kết nối với board

Sau khi biên dịch thành công, bạn kết nối máy tính với board để nạp và chạy thử chương trình. Với mạch BKIT PIC bạn cắm dây USB vào chânmạch nạp, bật công tắt nguồn và gạt tất cả các switch của SW2 lên ON để kết nối mạch nạp PICKit2.

Hình 3.23 : Kết nối với PICKit2 trên BKIT PIC

Gạt tất cả các switch của SW1 lên ON để enable nút Reset, Led ở PortB và chân thạch anh ngoài.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

19 trong 49 5/26/2013 4:18 PM

Page 20: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.24 : Enable Reset, Led và XTAL ngoài

3.7 Cấu hình mạch nạp

Từ menu Programmer chọn Select Programmer và chọn mạch nạp tương ứng là PICKit2. Muốn chọn mạch nạp khác hoặc kết nối với mạch nạplỗi bạn phải chọn lại None rồi sau đó mới chọn lại mạch nạp.

Hình 3.25 : Chọn mạch nạp

Để thuận tiện cho quá trình lập trình, ta nên thiết lập thêm 1 số thông số cho mạch nạp để có thể tự động nạp và chạy chương trình khi biêndịch không có lỗi. Để làm được điều này ta sẽ chọn Programmer và chọn Settings.

Hình 3.26 : Setting cho mạch nạp

Giao diện sau hiện ra và bạn check chọn Program after successful build (Nạp chương trình khi biên dịch thành công) và Run after a successfulprogram (Chạy chương trình khi nạp thành công). Nhấn OK để kết thúc.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

20 trong 49 5/26/2013 4:18 PM

Page 21: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.27 : Cấu hình nạp và chạy chương trình

Bây giờ bạn nhấn lại tổ hợp phím Ctrl F10 (Build All), MPLAB sẽ làm 1 loạt các thao tác nếu không có lỗi : Dịch chương trình – Nạp chương trình– Kéo chân VDD lên mức cao để thả chân Reset và chương trình bắt đầu chạy trên board.

Hình 3.28 : Dịch - Nạp - Chạy chương trình

Hình ảnh chương trình chạy trên board BKIT PIC như sau :

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

21 trong 49 5/26/2013 4:18 PM

Page 22: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#5 (permalink)

Hình 3.29 : Chương trình chạy trên BKIT PIC

__________________BS

thay đổi nội dung bởi: bs135, 10-01-2013 lúc 05:37 AM

The Following 3 Users Say Thank You to bs135 For This Useful Post:

InterMilan (12-01-2013), ninzaij (18-01-2013), xuanbach05 (11-01-2013)

10-01-2013, 04:38 AM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 4 : Khảo sát các chế độ dao động

Bài 4 : Khảo sát các chế độ dao động

1.1 Giới thiệu

Dòng PIC18F có 10 chế độ dao động khác nhau, kí hiệu và tên gọi của chúng như sau:

LP : Low Power Crystal , thạch anh có tần số dao động thấp (khoảng vài chục kHz).1.XT : Crystal/ Resonator, thạch anh/resonator có tần số trung bình (dưới 4MHz).2.HS : High Speed Crystal/Resonator, thạch anh/resonator có tần số cao (trên 4Mhz).3.HSPLL : High Speed Crystal/Resonator with Phase Locked Loop enabled, thạch anh tần số cao với bộ khuyết đại PLL.4.RC : External Resistor/Capacitor with Fosc/4 output on RA6, dao động RC ngoài,output với tần số chia 4 ở chân RA6.5.RCIO : External Resistor/Capacitor with I/O on RA6, chân RA6 là I/O.6.INTIO1 : Internal Oscillator with Fosc/4 output on RA6 and I/O on RA7, dao động nội, output ở chân RA6, input/outputở chân RA7 với tần số Fosc/4 .

7.

INTIO2 : Internal Oscillator with I/O on RA6 and RA7, dao động nội với RA6, RA7 là I/O.8.EC : External Clock with Fosc/4 output, clock ngoài, RA6 là output tần số Fosc/4.9.ECIO : External Clock with I/O on RA6, clock ngoài, RA6 là chân I/O.10.

1.2 Crystal và Resonator

Đây là loại dao động đơn giản nhất. Resonator còn có tên gọi khác là Ceramic Resonator. Hình ảnh của Crystal và Resonatornhư hình bên dưới. Các loại dao động LP, XT, HS, HSPLL sẽ dùng Crystal hoặc Resonator.

Ở chế độ hoạt động này, Crystal/Resonator sẽ được kết nối với 2 chân OSC1 và OSC2 của vi điều khiển như hình dưới đây.Khi dùng Crystal, giá trị của tụ điện phụ thuộc vào tần số của Crystal như bảng dưới đây

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

22 trong 49 5/26/2013 4:18 PM

Page 23: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Bảng 2 1 : Giá trị Capacitor cho Crystal

Giá trị của tụ điện càng cao thì dao động càng ổn định, nhưng bù lại thời giai khởi động sẽ lâu hơn.Khi dùng Resonator, giá trị của tụ điện như sau:

Bảng 2 2 : Giá trị Capacitor cho Resonator

Khi tần số resonator lớn hơn 3.5 MHz ta nên cấu hình là HS thay vì XT.

1.3 External Clock

Nguồn dao động clock ngoài được nối vào chân OSC1. Đặc điểm của loại dao động này là vi điều khiển hoạt động ngay khi cónguồn cấp (hoặc thức dậy từ chế độ sleep) mà không cần tốn thời gian khởi động (start-up time). Đối với chip PIC18F thì daođộng này có 2 loại :

EC : chân RA6 output với tần số Fosc/4 (Fosc là tần số clock đưa vào chân OSC1). Chân output này có thể dùng đểkiểm tra hoặc làm chân clock cho 1 số ứng dụng (như 1 tín hiệu đồng bộ). Trong cửa số Configuration Bits, tên gọi củachế độ này là EC-CLKOUT on RA6.

ECIO : chân RA6 truy xuất như 1 I/O bình thường. Trong cửa sổ Configuration Bits, tên gọi của chế độ này là EC-Porton RA6.

1.4 Dao động RC

Đối với 1 vài ứng dụng không đòi hỏi độ chính xác về định thời cao thì dao động RC là 1 lựa chọn tiết kiệm. Do tần số daođộng tại chân OSC1 phụ thuộc vào điện áp cấp, điện trở, tụ điện, nhiệt độ và thậm chí là hãng sản xuất chip, nên tần số daođộng RC không được chính xác. Chế độ này cũng có 2 loại là RC (RC-CLKOUT on RA6, Port on RA7) : Clock out với tần số chia4 ở chân RA6 và RCIO (RC-Port on RA6, Port on RA7) : RA6, RA7 sử dụng như I/O.

1.5 Bộ khuếch đại tần số PLL

PLL là 1 mạch tích hợp bên trong chip, có tác dụng nâng tần số input lên nhiều lần, nâng cao tốc độ thực thi chương trình củavi điều khiển. Bộ PLL có thể được dùng kết hợp với nhiều chế độ hoạt động thạch anh của vi điều khiển PIC.

HSPLL : PLL khi dùng với chế độ HS có thể nhân gấp 4 lần tần số input. Khi đó tần số input tối đa là 10Mhz, tần sốkhuếch đại đạt 40MHz. Trong cửa sổ Configuration Bits tên gọi của chế độ này là HS-PLL enabled freq = 4xFosc1. Trong

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

23 trong 49 5/26/2013 4:18 PM

Page 24: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

chế độ này bit PLLEN không có tác dụng.PLL và INTOSC : PLL cũng có thể được dùng kết hợp với bộ dao động nội, khi đó tần số khuếch đại có thể đạt 32Mhz.Chế độ này phải được thiết lập bằng phần mềm, không có option chọn lựa trong cửa số Configuration Bits. PLLEN bitdùng để kích hoạt chế độ này.

1.6 Bộ dao động nội

Gần tương tự với bộ dao động External Clock, bộ dao động nội (Internal Oscillator Block) cũng có 2 chế độ, output tần sốFosc/4 ở chân RA6 và chế độ I/O ở chân này. Tần số của bộ dao động nội được lập trình software. Các thanh ghi ảnh hưởngđến tần số này là OSCCON và OSCTUNE.Ở bộ dao động nội có 2 nguồn clock, nguồn clock 8MHz và nguồn clock RC 31kHz. Bộ nguồn clock 8MHz sẽ đi qua 1 bộ chia(Prescaller) và cấp clock cho thiết bị hoạt động. Giá trị của bộ chia này được xác định bởi 3 bit IRCF2:IRCF0 trong thanh ghiOSCCON.Khi giá trị các bit đều là 0 thì việc chọn clock source dựa vào bit INTRC trong thanh ghi OSCTUN. Nếu INTRC = 0 thì tần sốlấy từ clock source thứ 2, 31kHz. Ngược lại tần số sẽ là 8MHz/256 = 31.5kHz (bộ chia là 256 cho clock 8MHz).Khi tần số của bộ dao động nội là 4MHz hoặc 8MHz (OSCCON<6:4> = 110 hoặc 111) thì nó có thể được sử dụng kết hợp vớibộ PLL. Để kích hoạt bộ PLL ta phải set bit PLLEN ở thanh ghi OSCTUNE lên 1.

1.7 Demo

Kit BKIT PIC được thiết kế dùng switch gạt để kết nối với thạch anh (crystal) 20MHz, nên ta có thể sử dụng chế độ thạch anhngoài không PLL (PLL chỉ dùng được với thạch anh nhỏ hơn 10MHz) hoặc dùng thạch anh nội kết hợp với PLL.Để demo tần số cung cấp cho chip, ta sẽ viết chương trình cứ 1s tăng giá trị của PORTB lên 1 đơn vị.Một câu lệnh trong PIC chiếm 4 chu kì dao động.

1.7.1 Thạch anh ngoài 20MHzTa sẽ dùng 2 vòng lặp for để tạo hiệu ứng delay. Với chu kì 20MHz ta phải đếm 5 000 000 chu kì lệnh (do 1 chu kì lệnh chiếm4 chu kì dao động).Khi muốn tính toán chính xác thời gian, ta phải dùng các câu lệnh ASM. Khi viết bằng ngôn ngữ C, ta chỉ có thể ước lượnggần đúng. Câu lệnh (for i=0 ; I < MAX_I ; i++) tốn khoảng 4 chu kì lệnh : i++ tốn 2 chu kì lệnh, i< MAX_I tốn 2 chu kì lệnh,lệnh gán i =0 chỉ thực hiện 1 lần nên ta có thể bỏ qua.Vậy hàm tạo hiệu ứng trì hoãn 1s với tần số 20MHz ta sẽ viết như sau:

Code:

void delay1s_20MHz(){

int i,j;for(i=0;i<250;i++){

for(j=0;j<1250;j++){}

}}

Như đã đề cập ở trên, 1 vòng for thực hiện khoảng 4 chu kì lệnh nên tổng số chu kì lệnh của 2 vòng for ở trên là (250 * 4) *(1250 *4) = 5 000 000.Hàm main ta có thể viết như sau:

Code:

void main(){TRISB = 0x00; //setup PORTB is outputPORTB = 0x00; //init valuewhile(1){

PORTB++; //increase PORTBDelay1s_20MHz(); //call delay 1s

}}

Chỉnh chế độ thạch anh trong cửa sổ Configuration Bits là HS, PORTB là Digital (mặc định là analog), Disable chức năng nạpđiện áp thấp (LVP), dịch và nạp chương trình ta sẽ thấy giá trị PORTB tăng dần sau 1s.Chỉnh chế độ thạch anh sang chế độ LP hoặc XT, dịch và nạp lại chương trình bạn sẽ thấy chương trình không chạy hoặc chạysai. Do với thạch anh 20MHz ta phải chọn là HS như datasheet của PIC18F4520.

1.7.2 Thạch anh nội 8MHzCũng tương tự như trên, ở chế độ thạch anh nội 8MHz ta phải thực hiện 2 000 000 chu kì lệnh.Hàm tạo hiệu ứng trì hoãn 1s với tần số 20MHz ta sẽ viết như sau:

Code:

void delay1s_8MHz(){

int i,j;for(i=0;i<250;i++){

for(j=0;j<1250;j++){}

}

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

24 trong 49 5/26/2013 4:18 PM

Page 25: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#6 (permalink)

}

Để sử dụng được thạch anh nội 8MHz, trước tiên ta phải cấu hình là dùng thạch anh nội trong cửa sổ Configuration Bits (chọnINT RC – Port on RA6, Port on RA7), sau đó viết code trong hàm main để lựa chọn bộ Prescaller cho nguồn clock 8MHz. Ta sẽset 3 bit <6:4> của thanh ghi OSCCON lên 1. Hàm main sẽ viết như sau:

Code:

void main(){TRISB = 0x00; //setup PORTB is outputPORTB = 0x00; //init valueOSCCON |= 0x70 //set bit <6:4> -> freq = 8MHzwhile(1){

PORTB++; //increase PORTBDelay1s_8MHz(); //call delay 1s

}}

1.7.3 Thạch anh nội 8MHz và PLLKhi sử dụng thạch anh nội 8MHz và bộ PLL nhân 4, tần số dao động cấp cho chip sẽ là 32MHz, vậy ta phải đếm 8 000 000 chukì lệnh. Hàm tạo hiệu ứng delay sẽ như sau:

Code:

void delay1s_8MHzPLL(){

int i,j;for(i=0;i<500;i++){

for(j=0;j<1000;j++){}

}}

Hàm main ngoài việc chọn Prescaller cho clock nội ta phải set thêm bit PLLEN (bit 6) trong thanh ghi OSCTUNE:

Code:

void main(){

TRISB = 0x00; //setup PORTB is outputPORTB = 0x00; //init valueOSCCON |= 0x70 //set bit <6:4> -> freq = 8MHzOSCTUNE |= 0x40 //enable PLLwhile(1){

PORTB++; //increase PORTBDelay1s_8MHzPLL(); //call delay 1s

}}

__________________BS

The Following 2 Users Say Thank You to bs135 For This Useful Post:

InterMilan (12-01-2013), xuanbach05 (11-01-2013)

14-01-2013, 07:56 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 5 : Interrupt và ngắt Timer

Bài 5 : Interrupt và ngắt Timer

2.1 Interrupt trong PIC

Dòng PIC18F4520 (2420, 2520, 4420) có nhiều nguồn ngắt (interrupt source) và 2 mức ưu tiên ngắt (high priority interruptvà low priority interrupt). Vector ngắt có mức ưu tiên cao có địa chỉ 0x08 còn ngắt có mức ưu tiên thấp có địa chỉ 0x18. Khihàm phục vụ ngắt quãng cho ngắt ưu tiên thấp đang xảy ra, ngắt ưu tiên cao xảy ra sẽ tạm dừng ngắt ưu tiên thấp và phụcvụ cho ngắt ưu tiên cao.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

25 trong 49 5/26/2013 4:18 PM

Page 26: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Đối với 1 ngắt, thông thường có 3 bit để điều khiển nó:

Flag bit : Cờ báo hiệu interrupt, khi flag bit được set, ngắt sẽ xảy ra.Enable bit : Cho phép ngắt đối với các ngắt có mặt nạ (maskabled interrupt)Priority bit : Thiết lập ưu tiên ngắt, khi được set ngắt sẽ có mức ưu tiên cao.

Để có thể thiết lập mức độ ưu tiên cho các nguồn ngắt, ta phải enable chức năng ưu tiên ngắt bằng cách set IPEN bit(Interrupt Priority Enable bit : RCON<7>).

Khi IPEN = 1 : GIEH bit (INTCON<7>) sẽ enable các ngắt có mức ưu tiên cao, GIEL bit (INTCON<6>) sẽ enable các ngắt cómức ưu tiên thấp. Khi ngắt toàn cục, Flag bit, Enable bit được set, ngắt sẽ được kích hoạt, con trỏ chương trình sẽ nhảy tới địachỉ 0x08 hoặc 0x18 tùy theo ngắt đó được thiếp lập là ưu tiên cao (Priority bit là 1) hay ưu tiên thấp (Priority bit là 0).

Khi IPEN = 0 : Đây là trường hợp mặc định, disable chức năng ưu tiên ngắt (gọi là chế độ compatibility mode). INTCON<6>lúc này là PEIE bit, enable hay disable các ngắt ngoại vi (peripheral interrupt). INTCON<7> lúc này là GIE bit, enable haydisable tất cả các nguồn ngắt. Ở chế độ compatibility này, tất cả các ngắt sẽ nhảy đến địa chỉ 0x08.

Khi các nguồn ngắt có cùng độ ưu tiên, chúng sẽ cùng nhảy đến 1 địa chỉ ngắt. Hàm phục vụ ngắt quãng cần phải kiểm tratất cả các cờ để xác định nguồn ngắt nào đang gây ra ngắt. Cờ ngắt cần được xóa để tránh hiện tượng ngắt đệ quy (recursiveinterrupt), vi điều khiển sẽ lặp vô tận trong hàm ngắt cho đến khi tràn stack.

Điểm chú ý quan trọng trong thanh ghi INTCON là khi IPEN = 1 : INTCON<7> = 1 sẽ enable tất cả các ngắt có ưu tiên caonhưng khi INTCON<7> = 0 nó lại disable tất cả các ngắt, bao gồm cả ngắt ưu tiên thấp. Một ngắt ưu tiên thấp ngoài việcthiết lập GIEL (INTCON<6>) còn phải set luôn cả bit GIEH (INTCON<7>).

2.2 Giới thiệu Timer0

Timer0 có 2 chế độ 16 bit hoặc 8 bit. Clock cấp cho timer 0 có thể là clock nội hoặc clock ngoại (lấy từ chân T0CKI). Ngoài raTimer0 còn có bộ Prescaller để chia tần số clock.

Hình 2.1 : Thanh ghi điều khiển T0CON

Timer0 được điều khiển bởi thanh ghi T0CON. Ý nghĩa các bit trong thanh ghi này như sau:

Bit 7 TMR0ON : Bật tắt Timer 0.

1 : Bật Timer 0 .0 : Tắt Timer 0.

Bit 6 T08BIT : Chọn cấu hình cho Timer 0.

1 : Timer 16 bit.0 : Timer 8 bit.

Khi hoạt động ở chế độ 16 bit, giá trị của bộ định thời (counter)/ bộ đếm Timer 0 được ghi vào 2 thanh ghi TMR0H và TMR0L.Ngược lại, ở chế độ 8 bit, giá trị đếm được lưu trong thanh ghi TMR0L.

Bit 5 T0CS : Chọn nguồn clock cho Timer 0.

1 : Clock ngoài từ chân T0CKI.0 : Clock nội (Fosc/4).

Bit 4 T0SE : Chọn chế độ kích Timer 0 khi dùng nguồn ngoài.

1 : Timer 0 đếm lên khi có tín hiệu từ High sang Low ở chân T0CKI.0 : Timer 0 đếm lên khi có tín hiệu từ Low sang High ở chân T0CKI.

Bit 3 PSA : Bật/ Tắt chế độ Prescaller cho Timer 0.

1 : Tắt Prescaller.0 : Cho phép Prescaller.

Bit 2 : 0 T0PS2 :T0PS0 : Chọn giá trị Prescaller.

111 : 1:256 011 : 1:16110 : 1:128 010 : 1:8101 : 1:64 001 : 1:4100 : 1:32 000 : 1:2

Khi chọn bộ Prescaller, tần số của Timer 0 sẽ bị chia xuống. Ví dụ thạch anh dùng cho mạch là 20MHz, thì tần số của clock nộilà Fosc/4 = 5MHz. Nếu ta chọn Prescaller là 1:2 thì tần số đếm của timer 0 là 2.5MHz.

Khi Timer 0 đếm tràn từ FF :FF (chế độ 16 bit) hoặc FF (chế độ 8 bit) lên 0, cờ TMR0IF sẽ được bật lên 1 và gây ra ngắt nếucác bit cho phép ngắt (ngắt toàn cục, ngắt timer0) được set lên 1.

2.3 Lập trình module Timer0

2.3.1 Hàm init_timer0

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

26 trong 49 5/26/2013 4:18 PM

Page 27: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Trong phần này, chúng ta sẽ khởi tạo timer0 ở chế độ 16 bit, sử dụng clock nội và prescaller 1:2, ngắt timer0 sẽđược cấu hình là ngắt ưu tiên thấp và sau mỗi 1ms sẽ xảy ra ngắt 1 lần.

Timer0 sẽ đếm lên sau mỗi lần tích cực của clock. Trong chế độ 16 bit, khi giá trị trong 2 thanh ghi TMR0H:TMR0Lchuyển từ FFFF sang 0000 sẽ xảy ra ngắt, cờ TMR0IF sẽ được bật lên 1.

Mạch BKIT PIC sử dụng thạch anh 20MHz, nên clock nội cho timer0 sẽ là 5MHz (timer0 sẽ đếm 5 000 000 đơn vịtrong 1 giây). Để có được ngắt 1ms ta sẽ nạp cho thanh ghi TMR0H:TMR0L giá trị thấp hơn FFFF 5000 đơn vị.

Vì Timer0 được cấu hình sử dụng prescaller 1:2, nên con số này sẽ thấp hơn FFFF 2500 đơn vị : 65535 – 2500 =63035 = F63B. Việc nạp giá trị này cho thanh ghi TMR0 sẽ được thực hiện trong hàm phục vụ ngắt quãngtimer0_isr.

Để enable ngắt timer 0, ta cần set bit ngắt toàn cục GIE, set bit ngắt thấp GIEL, set bit enable timer 0 TMR0IE vàcờ ngắt timer 0 TMR0IF trong thanh ghi INTCON. Cấu hình ưu tiên ngắt timer 0 là ngắt thấp bằng cách clear bitTMR0IP trong thanh ghi INTCON2.

Hàm ngắt timer0 sẽ được khởi tạo như sau:Code:

void init_timer0(){

counter0 = 0;//counter for virtual timertimer0_flag = 0;//flag for virtual timer

T0CON = 0x00;//timer0 16bit mode, internal clock, RCONbits.IPEN = 1;//enable interrupt priorityINTCON2bits.TMR0IP = 0;//low interrupt priority

INTCONbits.GIE = 1;//enable global interruptINTCONbits.GIEL =1;//enable low priority interruptINTCONbits.TMR0IE = 1;//enable timer0 interruptINTCONbits.TMR0IF = 1;//force timer0 interrupt

}

2.3.2 Hàm timer0_isr

Hàm này được gọi khi ngắt Timer0 xảy ra. Đối với tất cả các ngắt của PIC, ta cần phải xóa cờ ngắt trước tiên vì nókhông được tự động xóa bằng phần cứng. Trong hàm phục vụ ngắt quãng Timer0 này ta nên tắt nó đi bằng cáchxóa bit TMR0ON, nạp lại giá trị cho 2 thanh ghi đếm Timer0. Ở cuối hàm phục vụ ngắt quãng ta sẽ bật choTimer0 đếm lên (set bit TMR0ON). Giá trị trong 2 thanh ghi đếm Timer0 sẽ tăng dần theo mỗi xung nhịp củaclock, và khi đạt giá trị FFFF nó sẽ xảy ra ngắt lần tiếp theo.

Code:

void timer0_isr(){

INTCONbits.TMR0IF = 0; //clear interrupt flagT0CONbits.TMR0ON = 0; //stop timer 0

TMR0H = 0xF6; //reconfig timer 0TMR0L = 0x3B; //1ms interrupt

//CODE HEREvirtual_timer();//END CODE

T0CONbits.TMR0ON = 1; //start timer 0}

Để gọi được hàm này, ta phải dùng thêm chỉ thị pragma để dịch 1 hàm tại địa chỉ nhất định và chỉ thị pragmainterrupt để dịch hàm này là dạng hàm interrupt. Timer0 được cấu hình là ngắt ưu tiên mức thấp (low priorityinterrupt), nên khi ngắt xảy ra, con trỏ chương trình sẽ nhảy tới địa chỉ 0x18. Chương trình hiện thực lệnh gọihàm timer0_isr được hiện thực ở cuối file main.c

Code:

#pragma code#pragma interrupt low_interrupt_isrvoid low_interrupt_isr(){

if(INTCONbits.TMR0IF == 1)timer0_isr();

}

#pragma code _vector_low = 0x18void _vector_low(void){

low_interrupt_isr();

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

27 trong 49 5/26/2013 4:18 PM

Page 28: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

}

#pragma codevoid main(){

while(1){}

}

Với chỉ thị đầu tiên, hàm vecter_low sẽ được dịch tại địa chỉ 0x18, là địa chỉ vector ngắt thấp. Do 2 địa chỉ ngắtcủa PIC là 0x08 cho ngắt cao và 0x18 cho ngắt thấp cách gần nhau, nên ta sẽ chỉ đặt thật ít lệnh tại 2 địa chỉnày. Trên đây chỉ đặt 1 lệnh gọi hàm low_interrupt_isr tại địa chỉ 0x18. Trong hàm này ta sẽ kiểm tra ngắt đangxảy ra có phải là Timer0 hay không bằng cách xét bit thứ 2 của thanh ghi INTCON (bit TMR0IF) trước khi gọi hàmtimer0_isr. Hàm main() bây giờ phải thêm chỉ thị #pragma code để compiler dịch hàm này ở 1 vùng nhớ kháctrong vùng code memory.

Ngoài Timer0, PIC còn có thêm 3 Timer nữa. Về các chức năng cơ bản như Timer0, chúng còn có thêm 1 vài chứcnăng đặc biệt khác.

2.4 Giới thiệu Timer 1

Khác với Timer0 là 1 interrupt, Timer1 là 1 Peripheral Interrupt. Vì vậy để có thể enable cho ngắt Timer1, ta phải set bitPEIE.

Tương tự với Timer0, Timer1 cũng có chức năng counter từ clock ngoài (ở chân T13CKI) và tăng giá trị lên 1 mỗi khi có clockcạnh lên ở chân T13CKI.

Khi chọn clock ngoài, T1SYNC bit dùng để chọn chế độ cho counter, là Ansynchronous Counter hoặc Synchronous Counter. Hailoại counter này đều tăng giá trị đếm lên 1 sau mỗi lần tích cực của clock, điểm khác biệt của chúng nằm ở kết nối phầncứng. Synchronous Counter cấp clock cho tất cả các flip flop trong khi Ansynchronous Counter chỉ cấp clock cho flip flop đầutiên.

Hình 2.2: Synchronous Counter

Hình 2.3 : Ansynchronous Counter

Bên cạnh đó, Timer1 còn có thể đếm lên nhờ dao động ngoài ở 2 chân T1OSI và T1OSO. Người ta thường dùng thạch anh32,768kHz và biến Timer1 thành 1 bộ Real Time Clock (đồng hồ thời gian thực) . Sơ đồ kết nối như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

28 trong 49 5/26/2013 4:18 PM

Page 29: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 2.4 : Timer1 Osillator

Để sử dụng được chức năng này ta cần phải set bit T1OSCEN.

Chức năng đặc biệt cuối, Timer1 là ngồn clock cho module CCP. Chi tiết về module này sẽ được trình bày ở Bài 16. Hai timercòn lại thường được dùng tích hợp với các module khác, Timer2 (có thêm bộ Post Scaller) sẽ được dùng cho module PWM ở Bài14 và Timer3 sẽ được dùng cho module Capture ở Bài 16.

2.5. Ngắt Timer1 và Timer2

Timer 1:Khi không có interrupt priority : GIE enable all interrupts, PEIE/GIEL enable all peripheral interrupt.

Khi có interrupt priority : GIE enable all high interrupt, nhưng nếu bằng 0 sẽ disable all interrupts. Nên nếu set timer 1 làinterrupt mức thấp thì phải set GIEH lên để enable, sau đó set tiếp GIEL để enable interrupt ưu tiên thấp. Nếu timer1 mứccao thì phải set GIEH để enable high interrupt và set PEIE vì timer1 là peripheral interrupt.

Timer 2:Timer 8 bit, giá trị trong thanh ghi TMR2 khi bằng với PR2 sẽ set cờ TMR2IF và gây ra ngắt.Prescaller là bộ chia tần số input. (1,4,16)PostScaller là bộ chia tần số output. (1-16)Timer 2 là peripheral interrupt.

Code:

void init_timer2(){

T2CON = 0x00;//postscaller 1T2CONbits.T2OUTPS0 = 1;T2CONbits.T2OUTPS1 = 0;T2CONbits.T2OUTPS2 = 0;T2CONbits.T2OUTPS3 = 0;//prescaller 4T2CONbits.T2CKPS0 = 1;T2CONbits.T2CKPS1 = 0;

}void init_timer2_interrupt(){

//enable timer 2 interruptPIE1bits.TMR2IE = 1;//enable interrupt priorityRCONbits.IPEN = 1;//enable timer1 low priority interruptIPR1bits.TMR2IP = 0;

INTCONbits.GIEH = 1;INTCONbits.GIEL = 1;//force into interruptTMR2 = 0x00;PR2 = 200;PIR1bits.TMR2IF = 1;

}#pragma code vector_high = 0x08void _vector_high(void){

_asmgoto timer1_isr_high_endasm

2.6. Code mẫu

Download tại đây

__________________BS

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

29 trong 49 5/26/2013 4:18 PM

Page 30: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#7 (permalink) 15-01-2013, 08:13 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 6 : Ma trận phím

Bài 6 : Ma trận phím

3.1 Khái niệm

Ma trận phím là cách kết nối các phím theo hàng và cột. Cách kết nối như vậy sẽ tiết kiệm được tài nguyên của vi điều khiển.Ví dụ dưới đây là cách mắc ma trận phím 4x4 :

Hình 3.1 : Ma trận phím 4x4

Ta có 16 phím và 8 tín hiệu điều khiển. Nếu mắc 16 phím này như các phím đơn, ta phải cần đến 16 tín hiệu điều khiển.

3.2 Giải mã ma trận phím

Ta xét 1 ma trận phím 2x2 như hình dưới đây:

Hình 3.2 : Ma trận 2x2

Khi phím A được nhấn thì điện áp tại C1 sẽ bằng R1. Như vậy nếu ban đầu tại C1 và C2 là mức cao, R1 là mức thấp và R2 làmức cao, thì khi phím A được nhấn, điện áp tại C1 (ban đầu là mức cao) sẽ bị kéo xuống mức thấp.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

30 trong 49 5/26/2013 4:18 PM

Page 31: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 3.3 : Phím A được nhấn

Tương tự nếu phím B được nhấn thì C2 sẽ bị kéo xuống mức thấp.Để xác định 2 phím C và D có được nhấn hay không, ta sẽ nâng điện áp tại R1 lên mức cao, kéo điện áp tại R2 lên mức cao(chuyển hàng tích cực).

Hình 3.4 : Phím D được nhấn

Như vậy, để xác định vị trí của phím nào được nhấn, ta sẽ duyệt qua tất cả các hàng và xét các phím hàng đó. Quy ước tínhiện DEACTIVE là mức 1 và tín hiện ACTIVE là mức 0, từng bước giải mã ma trận phím như sau:

Cho tín hiệu các cột là DEACTIVECài đặt tín hiện tại các cột là INPUTCho tín hiện các hàng là DEACTIVECài đặt tín hiệu các hàng là OUTPUTLặp qua các hàng

Cho tín hiệu hàng đang xét là ACTIVE.Xét các cột trong hàng đang cho ACTIVE, cột nào có tín hiệu ACTIVE là phím tương ứng được nhấn.

Kết thúc vòng lặp

3.3 Viết chương trình

Chương trình dành cho giải mã ma trận gồm 2 phần : phần đầu dùng để khởi tạo các chân vi điều khiển, phần 2 là duyệt quacác hàng và cột để xác định phím nào được nhấn. File key_matrix.h định nghĩa các hằng số và 2 hàm dùng trong ma trậnphím:

Code:

#define TRIS_BUTTON TRISC#define PORT_BUTTON PORTC#define MAX_COL 4#define MAX_ROW 4extern char key_data[];extern char key_code[];void init_key_matrix();void scan_key_matrix();

key_code là 1 mảng 16 phần tử tương ứng với 16 phím, nếu phím được nhấn thì phần tử tương ứng có giá trị là 1.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

31 trong 49 5/26/2013 4:18 PM

Page 32: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

key_data cũng là 1 mảng 16 phần tử, ta có thể dùng để lưu thông tin cho phím vị trí thứ nhất, chẳng hạn như data để hiệnthị số 0 (0x3F) trên led 7 đoạn.

3.3.1 Khởi tạo ma trận phím

Theo như sơ đồ kết nối ma trận phím ở hình 4.1, ta sẽ khởi tạo các hàng là output và các cột là input. Quy địnhDEACTIVE là mức 1 nên ta sẽ gán giá trị ban đầu của PORTC là 0xFF.

Code:

void init_key_matrix(){

TRIS_BUTTON = 0x0F; //C3-C0:input C7-C4:outputPORT_BUTTON = 0xFF;

}

3.3.2 Quét ma trận phím

Như đã đề cập giải thuật ở trên, ta sẽ lần lượt duyệt qua tất cả các hàng bằng cách xuất tín hiệu của hàng đó làACTIVE (mức 0) rồi xét từng cột.

Code:

void scan_key_matrix(){

int i,j;//loop all rowsfor(i=0;i<MAX_ROW;i++){

//pull down row iPORT_BUTTON &= ~(1<<(7-i));//loop all colsfor(j=0;j<MAX_COL;j++){

//reset key codekey_code[i*MAX_ROW+j] = 0;

//when col j is activatedif((PORT_BUTTON & (1<<j)) == 0){

//set key code key_code[i*MAX_ROW+j] = 1;

}}//pull up row iPORT_BUTTON |= (1<<(7-i));

}}

3.3.3 Hàm main

Ờ file main.c, ta sẽ include file key_matrix.h để có thể gọi được các hàm của nó. Biến key_code được extern ở filekey_matrix.h nên ta cũng có thể truy xuất ở file main.c.

Code:

#include "KEY_MATRIX\\key_matrix.h"void main(){

int i;TRISB = 0x00; //init PORTB for outputPORTB = 0x00; //initial valueinit_key_matrix();while(1){

scan_key_matrix();for(i=0;i<16;i++){

if(key_code[i] != 0){

PORTB = i;break;

}}

}}

Code chi tiết của ma trận phím các bạn có thể tham khảo ở Bai7.

__________________BS

thay đổi nội dung bởi: bs135, 16-01-2013 lúc 06:08 PM

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

32 trong 49 5/26/2013 4:18 PM

Page 33: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#8 (permalink)

The Following User Says Thank You to bs135 For This Useful Post:

InterMilan (04-02-2013)

16-01-2013, 06:31 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 7 : Chống rung cho ma trận phím

Bài 7 : Chống rung cho ma trận phím

4.1 Nguyên lí chống rung

Hình 4.1 : Hiện tượng rung phím

Hình trên minh hoạ mức điện áp của 1 phím nhấn tích cực mức 0, ở trạng tháibình thường, điện áp vi điều khiển nhận vào là 5V còn khi nhấn là 0V. Tuy nhiên, do độ rung cơ học của phím, tại thời điểmvừa nhấn xuống, điện áp sẽ không ổn định trong 1 khoảng thời gian, trước khi ổn định ở mức 0V. Hiệu tượng này gọi là rungphím.

Mặc dù khoảng thời gian điện áp ở mức 0 trong giai đoạn rung phím là nhỏ nhưng cũng đủ để vi điều khiển nhận được. Vì vậykhi ta xét nếu điện áp là 0 thì gọi hàm func() thì hàm này sẽ được gọi rất nhiều lần, là điều mà ta không mong muốn. Đểkhắc phục hiện tượng rung phím, có 2 hướng giải quyết : dùng phần cứng và phần mềm.

Về giải pháp phần cứng : thay vì mắc đơn giản như kit thí nghiệm này (xem lại sơ đồ ), ta có thể dùng thêm tụ điện để hạnchế việc thay đổi điện áp đột ngột, sơ đồnguyên lý như sau:

Hình 4.2 : Chống rung bằng phần cứng

Ở sơ đồ trên, khi không nhấn là mức 1, khi nhấn là mức 0. Phím nhấn trên tích cực mức 0. Mạch ở trên còn gọi là mạch RC.

Nếu nút nhấn có 2 cực (3 chân), ta có thể chọn giải pháp dùng mạch RS flip flop, đây là mạch phần cứng chống rung tốt nhất,sơ đồ nguyên lý như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

33 trong 49 5/26/2013 4:18 PM

Page 34: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 4.3 : Chống rung bằng phần cứng (tt)

Về giải pháp phần mềm : Ta sẽ định kì đọc tín hiệu từ nút nhấn, cho đến khi nào chúng trùng nhau n lần thì mới xử lý. Hìnhdưới đây minh hoạ trong trường hợp 2 lần là 0 thì mới xác nhận là phím được nhấn và mới xử lý tác vụ mà ta mong muốn.

Hình 4.4 : Chống rung bằng phần mềm

Khoảng thời gian giữa 2 lần đọc là khoảng 10ms, ta sẽ hiện thực hàm đọc này và gọi nó trong timer. Giải thuật đơn giản đểxử lý chống rung có thể hiện thực như sau:

Code:

previous_key = current_key; current_key = Port_key; If(previous_key == current_key)

effective_key = current_key;

Trong đó :

previous_key : biến lưu giá trị phím trước đó.current_key : biến lưu giá trị phím hiện tại.Port_key : Port của vi điều khiển kết nối với phím. Ở đây chúng ta gọi hàm đọc ma trận phím để trả về giá trịcủa phím được nhấn.effective_key : giá trị phím hợp lệ (giá trị trong giai đoạn ổn định)

Để tăng tính chính xác, ta có thể dùng nhiều biến previous_key để lưu lại các giá trị và so sánh nhiều lần. Đoạn code trên chỉso sánh trùng nhau 2 lần.

4.2 Kết nối phần cứng

Sơ đồ nguyên lý của phím trong kit này như sau :

Hình 4.5 : Sơ đồ kết nối nút nhấn

Phím nhấn này tính cực mức 0, được kết nối khá đơn giản, nên ta sẽ dùng phần mềm để chống rung. Ta sẽ dùng 3 biến để sosánh 2 lần trùng nhau, 2 lần liên tiếp cách nhau 10ms.

Trong trường hợp nhấn đè 1 phím, ta sẽ dùng biến TimeOutForKeyPress để xác định thời gian tích cực tiếp theo. Biến này sẽquan trọng trong trường hợp ta viết 1 ứng dụng chẳng hạn như soạn thảo văn bản. Nếu không có biến này để quản lý, nếu tađè thì trong 1s có tới 100 lần tích cực.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

34 trong 49 5/26/2013 4:18 PM

Page 35: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#9 (permalink)

4.3 Viết chương trình

Module này có 2 hàm như sau :void initKey() : Khởi động các thông số ban đầuvoid getKey() : Hàm này được gọi trong timer0, dùng để quét phím.void SubKeyProcess() : Hàm này hiện thực tác vụ bạn cần thực hiện khi nhấn phím.Ở kit thí nghiệm này, các nút nhấn được nối thành dạng ma trận và được nối với PORTC nên ta định nghĩa ở thêm ở đầu fileKey.c :

Code:

#define KEY_PORT PORTC

4.3.1 Hàm initkey()

Code:

void initKey() { KeyReg0 = 0x00; KeyReg1 = 0x00; KeyReg2 = 0x00; KeyReg3 = 0x00; }

Trong đó KeyReg0, KeyReg1, KeyReg2 dùng để lưu 3 lần liên tiếp. Khi 3 biến này bằng nhau, biến KeyReg3 mớiđược cập nhật. Biến KeyReg3 là giá trị hợp lệ của phím nhấn.

4.3.2 Hàm getKey()

Hàm này được chia làm 2 phần, phần đầu là để chống rung phím dùng 2 lần so sánh trùng nhau. Phần thứ 2 xử líkhi 1 phím được đè, phải sau 1 khoảng thời gian TimeOutForKeyPress mới được tích cực.

Code:

void getKey(){ KeyReg2 = KeyReg1; KeyReg1 = KeyReg0; KeyReg0 = read_matrix_key();// Cho phep nut nhan na o duoc tich cuc. if ((KeyReg1 == KeyReg0) && (KeyReg1 == KeyReg2)) {

TimeOutForKeyPress --;if (TimeOutForKeyPress == 0) {

KeyReg3 = 0x00; }

if (KeyReg2 != KeyReg3) { KeyReg3 = KeyReg2; if (FlagFirstTimeKeyPress == 1)// Day la lan dau ph im duoc nhan. {

TimeOutForKeyPress = 100; SubKeyProcess(); FlagFirstTimeKeyPress = 0;

} else {

if (KeyReg2 == 0x00) FlagFirstTimeKeyPress = 1;

else {

TimeOutForKeyPress = 100; SubKeyProcess();

} }

} }

}

4.4. Code mẫu

Download code mẫu tại đây

__________________BS

The Following User Says Thank You to bs135 For This Useful Post:

InterMilan (04-02-2013)

18-01-2013, 07:31 PM

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

35 trong 49 5/26/2013 4:18 PM

Page 36: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 8 : LCD 16x2 và bàn phím điện thoại

Bài 8 : LCD 16x2 và bàn phím điện thoại

5.1 Chức năng các chân của LCD

Hình 5.1 : LCD 16x2

LCD thường sử dụng 14 chân, chế độ 16 chân khi cần điều khiển đèn nền. Chức năng của các chân như sau:

5.2 Kết nối màn hình LCD

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

36 trong 49 5/26/2013 4:18 PM

Page 37: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 5.2 : Kết nối màn hình LCD

Hình trên mô tả kết nối LCD với chế độ 16 chân, 2 chân K và A dùng để kết nối với đèn nền.

5.3 Các vùng nhớ của LCD

5.3.1 Display Data Ram (DDRAM)

Lưu trữ mã ký tự hiển thị ra màn hình. Mã này giống với mã ASCII. Có tất cả 80 ô nhớ DDRAM. Vùng hiển thịtương ứng với cửa sổ gồm 16 ô nhớ hàng đầu tiên và 16 ô nhớ hàng thứ hai. Chúng ta có thể tạo hiệu ứng dịchchữ bằng cách sử dụng lệnh dịch , khi đó cửa sổ hiển thị sẽ dịch đem lại hiệu ứng dịch chữ.

Hình 5.3 : Vùng nhớ DDRAM

5.3.2 Character Generator Ram (CGRAM)

Lưu trữ tám mẫu ký tự do người dùng định nghĩa. Tám mẫu ký tự này tương ứng với các mã ký tự D7-D0 =0000*D2D1D0 (* mang giá trị tùy định 0 hay 1).

Hình 5.4 : Vùng nhớ CGRAM

5.3.3 Bộ nhớ CGROM

Bộ nhớ dùng để lưu trữ các kí tự hiển thị trên LCD. Các giá trị lưu trong bộ nhớ này như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

37 trong 49 5/26/2013 4:18 PM

Page 38: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 5.5 : Vùng nhớ CGROMChúng ta muốn hiển thị chữ “CE” ở giữa hàng đầu tiên, giả sử cửa sổ hiển thị đang bắt đầu từ vị trí đầu tiên(hàng thứ nhất hiển thị dữ liệu của ô nhớ từ 0x00 đến 0x0f, hàng thứ hai hiển thị dữ liệu của ô nhớ từ 0x40 đến0x4f, đây là vị trí home). Giá trị của ô nhớ 0x07 là 0x43 (ký tự C), của ô nhớ 0x08 là 0x45 (ký tự E).

Chúng ta muốn hiển thị chữ “®” ở giữ hàng thứ hai, giả sử cử sổ hiển thị đang ở vị trí home. Trong bảng mẫu kýtự chúng ta thấy không có mẫu “®”. Lúc này chúng ta phải định nghĩa mẫu “®” 5x8 điểm, gồm có 8 byte, sau đólưu vào vị trí của mẫu ký tự CGRAM thứ nhất. Lúc này giá trị của ô nhớ 0x47 là 0x00 hoặc 0x08 (vị trí của mẫuký tự CGRAM thứ nhất “®”).

5.4 Các lệnh cơ bản của LCD

Để truyền lệnh cho LCD thì chân RS = 0, khi đó các tín hiện trên D0-D7 được xem là lệnh. Ý nghĩa của các lệnh điều khiểnLCD như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

38 trong 49 5/26/2013 4:18 PM

Page 39: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

I/D

1 = Increment (by 1)0 = Decrement (by 1)

RL

1 = Shift right0 = Shift left

S

1 = Display shift on0 = Display shift off

DL

1 = 8-bit interface0 = 4-bit interface

D

1 = Display on0 = Display off

N

1 = Display in two lines0 = Display in one line

U

1 = Cursor on0 = Cursor off

F

1 = Character format 5x10 dots0 = Character format 5x7 dots

B

1 = Cursor blink on0 = Cursor blink off

D/C

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

39 trong 49 5/26/2013 4:18 PM

Page 40: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

1 = Display shift0 = Cursor shift

5.5 Kết nối LCD với vi điều khiển

LCD có 2 chế độ 8 bit và 4 bit. Ở chế độ 8 bit, ta dùng toàn bộ 8 chân D0-D7 để giao tiếp. Ở chế độ 4 bit, ta chỉ dùng 4 bitcao D4-D7 để giao tiếp với LCD. Dữ liệu gửi cho LCD ở chế độ này bao gồm 4bit cao gửi trước, sau đó sẽ đến 4bit thấp. Sơ đồkết nối ở 2 chế độ như sau:

Hình 5.6 : Kết nối LCD với vi điều khiển

Nếu muốn tiết kiệm chân, R/W có thể nối xuống GND. Ở chế độ 4bit thì 4 bit thấp của LCD có thể nối xuống GND.

5.6 Khởi tạo LCD

Quá trình khởi tạo LCD ở chế độ 8 bit như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

40 trong 49 5/26/2013 4:18 PM

Page 41: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 5.7 : Khới tạo LCD 8 bit

Quá trình khởi tạo ở chế độ 4 bit như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

41 trong 49 5/26/2013 4:18 PM

Page 42: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 5.8 : Khởi tạo LCD 4 bit

5.7 Kết nối phần cứng

LCD được kết nối với Port B của vi điều khiển PIC như sau:Trích:

LED_BACKLIGHT = PortB.0PIN_RS : PortB.1PIN_RW : PortB.2PIN_EN : PortB.3D4 : PortB.4D5 : PortB.5D6 : PortB.6D7 : PortB.7

5.8 Viết chương trình & 5.9 Các hàm cơ bản

Để quá trình điều khiển LCD hiệu quả, ta định nghĩa 1 số hàm cơ bản như sau:

Hàm delay: trung bình PIC thực hiện 5 lệnh mất 1us với thạch anh 20Mhz.Code:

void lcd_delay(int time) {

while(--time);}

Hàm ghi dữ liệu ra LCD:Code:

//Ghi 4 bitvoid lcd_write_4bits(unsigned char dat) {

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

42 trong 49 5/26/2013 4:18 PM

Page 43: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

RW(WRITE); //kéo chân RW xu ống 0EN(SET); //set chân Enable lên 1LCD_DATA_OUT(dat & 0xF0); //G ửi data ralcd_delay(10);EN(CLR); //kéo chân Enable xu ống 0lcd_delay(10);

}//Ghi 1 byte : ghi 4 bit 2 l ầnvoid lcd_write_cmd(unsigned char cmd){

lcd_wait_busy();

RS(CMD);lcd_write_4bits(cmd);lcd_write_4bits(cmd << 4);

}

Một số macro trong file lcd.h, ví dụ như:

Code:

#define RS(x) ( (x) ? ( LCD_PORT |= 0x02 ) : ( LCD_P ORT &= 0xFD ) )//N ếu x = 1 thì th ực hi ện l ệnh LCD_PORT |=0x02, x=0 thì th ực hi ện LCD_PORT &=0xFD.

5.10 Khởi tạo LCD chế độ 4 bit

Code:

void init_lcd() {lcd_delay(15000); //1RS(CMD); //2lcd_write_4bits(0x03 << 4); //3lcd_delay(4100); //4lcd_write_4bits(0x03 << 4); //5lcd_delay(100); //6lcd_write_4bits(0x03 << 4); //7lcd_write_4bits(0x02 << 4); //8lcd_write_cmd(0x28) ; //9lcd_write_cmd(0x0C); //10lcd_write_cmd(0x06); //11

}

Ý nghĩa các lệnh trên như sau:

Lệnh 1 : gọi hàm lcd_delay(15000) để delay 15ms.Lệnh 2 : kéo chân RS (nối với LCD_PORT tại bit 1) xuống 0. Lệnh này được định nghĩa là 1 macro trong file lcd.h:#define RS(x) ( (x) ? ( LCD_PORT |= 0x02 ) : ( LCD_ PORT &= 0xFD ) )CMD được define là 0 nên lệnh RS(CMD) sẽ có điều kiện (x) là false và sẽ thực hiện phần thứ 2 của lệnh trên :LCD_PORT & 0xFD (kéo bit 1 xuống 0 : 1111 1101).Lệnh 3 : thực hiện trạng thái đầu tiên sau khi chờ 15ms, ghi D7 D6 D5 D4 = 0011. Các chân này được nối với 4 bit caocủa vi điều khiển nên ta phải dịch trái giá trị 0x03 4 bit.Lệnh 4 : delay khoảng 41ms.Lệnh 5,6,7,8 : Thực hiện các trạng thái 2,3 và 4. Sau lệnh 7 thì LCD đã chuyển sang chế độ 4 bit, và để gửi 1 byte, tasẽ gửi 2 lần 4 bit cao trước rồi tới 4 bit thấp.Lệnh 9 : gọi hàm lcd_write_cmd để ghi 4 bit 2 lần, giá trị 0x28 tương ứng với N = 1 (hiển thị trên 2 hàng của LCD) vàB = 0 (font định dạng 5x7 điểm).Lệnh 10 : thực hiện lệnh display on (xem thêm trong bảng lệnh), D = 1.Lệnh 11 : thực hiện lệnh entry set mode, 0x06 tương ứng với chế độ dịch phải tăng dần.

5.11 Xoá màn hình

Hàm này chỉ đơn giản là gửi lệnh clear màn hình lcd (xem thêm trong bảng lệnh của LCD).Code:

void lcd_clear() {

lcd_write_cmd(0x01);lcd_goto_xy(0, 0);

}

5.12 Thiết lập vị trí con trỏ

Hàm này thiết lập vị trí bắt đầu xuất dữ liệu trên màn hình LCD 2 hàng 16 cột. Để hiện thực hàm này ta phải tính được địachỉ tương ứng với toạ độ (row,col) và dùng lệnh SET DDRAM ADDRESS (bit 7 của lệnh này bằng 1).

Code:

char lcd_goto_xy(unsigned char row, unsigned char c ol) {unsigned char addr = 0x00;if(col >= 20 || row >= 4)

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

43 trong 49 5/26/2013 4:18 PM

Page 44: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

return FALSE;if(row < 2) {

addr = (row * 0x40) + col;addr = 0x80 | (addr & 0x7F);

}else {

addr = (row * 0x40) + col;addr = 0x94 | (addr & 0x7F);

}lcd_write_cmd(addr);

current_row = row;current_col = col;return TRUE;

}

5.13 In kí tự ra màn hình

Hàm này nhận thông số là 1 kí tự và hiển thị kí tự đó ra màn hình LCD. Việc hiện thực hàm này khá đơn giản, ta chỉ cần kéochân RS xuống 0 là LCD sẽ hiểu các bit D7-D4 là dữ liệu.

Code:

void lcd_print_char(unsigned char dat) {

lcd_wait_busy();//find next position

if(current_row == 0 && current_col == 16)lcd_goto_xy(1,0);

if(current_row == 1 && current_col ==16)lcd_goto_xy(0,0);

RS(DAT); //RS = 0lcd_write_4bits(dat);lcd_write_4bits(dat << 4);

current_col ++; //update new position}

Từ những hàm cơ bản này, bạn có thể hiện thực thêm các hàm để xuất 1 string hay 1 giá trị số ra màn hình LCD. Code chitiết có thể xem thêm ở file đính kèm.

5.14 Thiết lập bàn phím điện thoại

Tóm tắt : bàn phím 4x4 có đánh các kí tự số (0-9) và chữ (A,B,C,D,*,#) sẽ là các phím chức năng mô phỏng theo bàn phímđiện thoại. Các trạng thái cũng như thông tin sẽ được hiển thị trên màn hình LCD. Để làm được bài này các bạn cần có nhữnghàm về quét ma trận phím (trong thư mục button_matrix) cũng như xuất ra LCD (trong thư mục lcd).

Trước hết bạn cần phải biết qua bài quét ma trận phím. Trong Button.c chúng ta có hàm button_process(void); Hàm này đượcgọi định kì trong timer để kiểm tra xem có nút nào được nhấn không.Hàm read_matrix_key(void) khi không có nút nào đượcnhấn, nó sẽ trả về giá trị 0. Khi có nút nhấn nó sẽ trả về giá trị từ 1-16 tùy theo vị trí của nút nhấn. Việc kiểm tra này đượcthực hiện nhiều lần và chúng ta sẽ chỉ xử lí nó khi có ít nhất 3 lần đọc giá trị giống nhau (theo nguyên lí chống rung, đọcthêm bài chống rung cho phím).

Bài thứ 2 cần biết là bài về xuất lcd. Trong lcd.c đã hỗ trợ cho bạn sẵn các hàm để ghi lên lcd (Tham khảo thêm trong lcd.h).

Chúng ta bắt đầu bằng việc tạo một project mới với những thiết lập phù hợp. copy thư mục button_matrix, lcd, timer,interrupt vào nơi chứa chương trình để hoàn chỉnh project mới. Thêm những file .h trong các thư mục này vào main.c. Tạothư mục Phone và chứa các file phone.c, phone.h . add vào project. Các sự kiện và trạng thái của chiếc điện thoại của chúngta sẽ được xử lí chính ở trong file phone.c này. Include file .h của button_matrix và lcd.

Định hình: trước hết chúng ta định hình lại vị trí và chức năng của từng nút. Vì để thực hiện được chức năng nhắn tin cũngnhư gọi điện nên mỗi nút từ 0-9 đề có thêm các chức năng riêng. Ta khai báo một mảng lưu giữ những giá trị mà ta muốn nútnhấn có thể thực hiện.

Code:

unsigned char key[16][5] = { '0',' ',0,0,0,'1','.',',',0,0,'2','a','b','c',0,'3','d','e','f',0,'4','g','h','i',0,'5','j','k','l',0,'6','m','n','o',0,'7','p','q','r','s','8','t','u','v',0,'9','w','x','y','z','*',0,0,0,0,'#',0,0,0,0,'A',0,0,0,0,'B',0,0,0,0,'C',0,0,0,0,

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

44 trong 49 5/26/2013 4:18 PM

Page 45: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

#10 (permalink)

'D',0,0,0,0};

Ở đây có các nút có nhiều kí tự (7-p-q-r-s) cũng có nút có ít kí tự (1-.) nên để thuận tiện ta tạo thêm một mảng chứa giá trịlà số kí tự được sử dụng của nút đó :

Code:

unsigned char limit_key[16]={2,3,4,4,4,4,4,5,4,5,1, 1,1,1,1,1};

Bây giờ coi lại trong button.c có hàm quét ma trận phím. Tuy nhiên, giá trị trả về của hàm này là vị trí của các nút trên bànphím (vd:1=1,2=2,3=3,A=4…). Ta sẽ cần phải chuyển đổi sang một hệ khác để thuận tiện trong việc lập trình thông qua mộtmảng sau:

Code:

unsigned char convert_key[16]={ 1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15};

Chương trình chính của chúng ta là hàm Phone() được gọi liện tục trong hàm main() . Hàm này đầu tiên sẽ xét biếnActiveKey xem có nút nhấn nào được nhấn không . Khi có nút nhấn thì sẽ có một chuyển đổi nhỏ

Code:

KeyPress = convert_key[ActiveKey-1];

Và biến KeyPress này chính là giá trị chúng ta xử lí chính.

Biến PhoneStatus chứa giá trị của của các trạng thái của điện thoại. Các trạng thái chính là đợi (WAIT_STATUS), gọi điện(ENTERING_NUMBER_STATUS, CALLING_STATUS, ENDCALL_STATUS), nhắn tin (MESS_STATUS, TYPING_MESS_STATUS,SENDING_STATUS, ENDSEND_STATUS). Với mỗi trạng thái ta xử lí nút C là quay lại, D là xóa kí tự, A là enter… tùy theo quy địnhmỗi người.

Tiếp theo chúng ta xử lí nút nhấn tại mỗi trạng thái. Tại trạng thái đợi, nếu nhập vào là số thì sẽ chỉ hiện sốkey[KeyPress][0]. Còn nếu ở trong chế độ nhắn tin thì nếu như phím được nhấn lặp lại trong khoảng thời gian timeout thì coinhư sẽ chuyển kí tự ngay tại nút đó:

Code:

KeyMessIndex = (KeyMessIndex +1)%(limit_key[KeyPres s]);lcd_putChar(key[KeyPress][KeyMessIndex]);

, nếu không thì in kí tự mới.:Code:

KeyMessIndex = 1;lcd_putChar(key[KeyPress][KeyMessIndex]);

Download code mẫu

Tại đây

__________________BS

The Following User Says Thank You to bs135 For This Useful Post:

InterMilan (04-02-2013)

21-01-2013, 08:55 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 9 : Quét led 7 đoạn và led ma trận

Bài 9 : Quét led 7 đoạn và led ma trận

6.1 Điều khiển led 7 đoạn và led ma trận.

6.1.1 Cấu tạo Led 7 đoạn

LED 7 đoạn gồm có 7 đoạn được đánh dấu: a, b, c, d, e, f, g và một điểm dp. Mỗi đoạn là một led, kết hợp tắt/sángcủa các led này để hiển thị số mà chúng ta hiểu được.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

45 trong 49 5/26/2013 4:18 PM

Page 46: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 6 1 Led 7 đoạnLED 7 đoạn có hai loại là Common Anode và Common Cathode, tương ứng các LED nối chung Anode hay nối chungCathode. Mạch thí nghiệm BKIT PIC sử dụng loại Common Anode.

Hình 6.1 : Sơ đồ nguyên lý led 7 đoạn

6.1.2 Cấu tạo led ma trận

LED ma trận 8x8 hai màu được bố trí thành 8 hàng và 8 cột.

Hình 6 3. Led ma trậnMỗi điểm có hai LED tương ứng với hai màu. Các LED trên cùng một hàng nối chung Anode, các LED cùng màu trêncùng một cột nối chung Cathode.

Hình 6 4 Sơ đồ nguyên lý led ma trận

6.1.3 Nguyên lý quét LED

Để hiện thị 1 led 7 đoạn, ta cần 8 đường tín hiệu để gửi dữ liệu cho nó. Như vậy, với 8 led 7 đoạn, theo kết nối bìnhthường, ta cần tổng cộng 64 đường tín hiệu để thắp sáng 8 led cùng lúc. Việc này rất tốn tài nguyên về phần cứng.Để khắc phục, người ta dùng kĩ thuật quét led. Các đường dữ liệu của các led sẽ được nối với nhau.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

46 trong 49 5/26/2013 4:18 PM

Page 47: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 6 5 Kết nối khi quét led 7 đoạnVới kĩ thuật quét led này, tại 1 thời điểm, chỉ có 1 led sáng. Tại thời điểm t1 chỉ có led 1 sáng, tại thời điểm t2 = t1 +t0 chỉ có led 2 sáng, khi t0 rất nhỏ, mắt người không thể nhận biết được độ nhấp nháy giữa 2 lần luân chuyển, và sẽcó cảm giác là 2 đèn sáng cùng lúc. Thường thì t0 này phải nhỏ hơn 1/24 giây, tức là trong một giây sẽ có nhiều hơn24 lần luân chuyển giữa các led.Bảng mô tả quá trình quét Led 7 đoạn:

Tương tự đối với led ma trận, ta dùng 16 đường tín hiệu để điều khiển hai màu led và 8 đường tín hiệu để tích cựcdòng (ROW). Tại mỗi thời điểm chỉ có một dòng led ma trận được hiển thị dữ liệu.

Hình 6 6 Nguyên lý quét led ma trận

6.2 Sơ đồ kết nối mạch

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

47 trong 49 5/26/2013 4:18 PM

Page 48: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Hình 6-7 Sơ đồ kết nối led 7 đoạn và led ma trậnMục đích của bài này là để mọi người làm quen với led 7 đoạn và led ma trận cho nên các led 7 đoạn và led ma trận được kết nốitheo kiếu song song, các chân dữ liệu và điều khiển led được gắn trực tiếp với chân vi điều khiển PIC, vì vậy chương trình sẽ đơngiản và dễ thực hiện hơn.

6.3 Xây dựng chương trình

6.3.1 Ý tưởng hiện thực

Để có thể hiện thực giải thuật quét led chúng ta cần sử dụng tới bộ đinh thời(timer) và ngắt quãng để thiết lập thờigian quét. Ví dụ chúng ta quét 1 led với tần số 50Hz(nghĩa là led sáng 50 lần/giây) như vậy ta cần cấu hình cho timerlà cứ sau 1000ms/50 = 20ms thì ngắt 1 lần và trong hàm xử lý ngắt ta sẽ đưa dữ liệu ra cho led. Nếu số led nhiềuhơn thì ta chỉ cần lấy tần số chuẩn cho mỗi led nhân với số lượng led. Ví dụ nếu quét cùng luc 8 led 7 đoạn với tấn sốmỗi led là 50Hz thì tần số ngắt của timer là 8*50 = 400Hz.

6.3.2 Các hàm phục vụ quét led

2.6.3.1 Hàm quét led 7 đoạn

Code:

void display_led7(void){

PORTE = 0;PORTD = led7_buffer[index_led7];PORTE = 1 << index_led7;index_led7 = (index_led7 + 1) % 3;

}

Theo sơ đồ nguyên lý PORTD là port đưa dữ liệu ra led 7 đoạn và PORTE là port chọn led(ở đây chúng tacó 3 led 7 đoạn).Trước mỗi lần xuất led, ta cần phải tắt tất cả các led để tránh trường hợp dữ liệu cũ đượcđưa vào led được chọn tiếp theo,hay ngược lại dữ liệu mới được đưa vào led trước đó.

2.6.3.2 Hàm quét led ma trận

Code:

void display_ledmatrix(void){

PORTA = 0;PORTB = green_buffer[index_matrix];PORTC = red_buffer[index_matrix];PORTA = 1 << index_matrix;index_matrix = (index_matrix + 1) % 8;

}

Theo sơ đồ nguyên lý, PORTA là port lựa chọn led, PORTB và PORTC tương ứng là các dữ liệu xanh và đỏcủa led ma trận, cách quét vẫn giống với việc quét led 7 đoạn.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

48 trong 49 5/26/2013 4:18 PM

Page 49: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - BKIT Hardwareclub)

Đối với việc quét led ta nên tạo ra những mảng buffer để tiện cho việc xuất dữ liệu và cập nhập chúng,cùng với việc hiện thực 1 số hầm cập nhập buffer như update_led7_buffer(), update_green_bugffer(),update_red_buffer() chương trình của chúng ta trở nên thân thiện, trong sáng, đơn giản hơn rất nhiều vàphù hợp với việc phát triển lên thành những bài khó hơn như chạy chữ hay các hiệu ứng led river.

__________________BS

The Following User Says Thank You to bs135 For This Useful Post:

InterMilan (04-02-2013)

Trang 1/2 1 2 >

« Ðề Tài Trước | Ðề Tài Kế »

Quyền viết bài

Bạn không thể gửi chủ đề mớiBạn không thể gửi trả lờiBạn không thể gửi file đính kèmBạn không thể sửa bài viết của mình

BB code is MởMặt cười đang Mở[IMG] đang MởHTML đang TắtTrackbacks are MởPingbacks are MởRefbacks are Mở

Forum Rules

Múi giờ GMT. Hiện tại là 03:18 PM

Liên hệ - Lưu Trữ - Lên trên

BKIT Hardware Club forum Powered by: vBulletin Copyright ©2000-2013, Jelsoft Enterprises Ltd.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC -... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

49 trong 49 5/26/2013 4:18 PM