71
ĐẠI HC QUC GIA TP.HCM TRƯỜNG ĐẠI HC BÁCH KHOA KHOA KHOA HC VÀ KTHUT MÁY TÍNH THÍ NGHIM VI XLÝ - VI ĐIU KHIN BM Kthut Máy tính 2011

Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Embed Size (px)

Citation preview

Page 1: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH

THÍ NGHIỆM VI XỬ LÝ - VI ĐIỀU KHIỂN

BM Kỹ thuật Máy tính 2011

Page 2: Thi Nghiem Vi Xu Ly - Vi Dieu Khien
Page 3: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Mục Lục Mục Lục .............................................................................................................................. 1 Bài 1 : Giới thiệu MPLAB IDE và KIT PIC .................................................................. 1

1.1 Môi trường phát triển MPLAB ................................................................................. 1 1.2 Nạp file hex vào vi điều khiển PIC........................................................................... 6 1.3 Debug dùng MpLab SIM........................................................................................ 10 1.4 Debug onchip dùng Mplab ICD2............................................................................ 12 1.5 Bài tập ..................................................................................................................... 12

Bài 2 : Khảo sát cổng xuất nhập ................................................................................... 13 2.1 Kiến thức liên quan................................................................................................. 13

2.1.1 Các thanh ghi điều khiển cổng xuất nhập ........................................................ 13 2.1.2 Kết nối mạch .................................................................................................... 13

2.2 Các bước hiện thực yêu cầu 1 ................................................................................. 14 2.3 Chương trình mẫu yêu cầu 1................................................................................... 16 2.4 Các bước hiện thực yêu cầu 2 ................................................................................. 17 2.5 Chương trình mẫu yêu cầu 2................................................................................... 18 2.6 Bài tập ..................................................................................................................... 19

Bài 3 : Khảo sát cơ chế ngắt quãng, giao tiếp LCD ký tự ............................................ 21 3.1 Kiến thức liên quan................................................................................................. 21

3.1.1 Tóm tắt các thanh ghi điều khiển ngắt ............................................................. 21 3.2 Các bước hiện thực yêu cầu 1 ................................................................................. 22 3.3 Chương trình mẫu yêu cầu 1................................................................................... 24 3.4 LCD ký tự 2x16 ...................................................................................................... 26

3.4.1 Hình dạng và ý nghĩa các chân: ....................................................................... 26 3.4.2 Tổ chức vùng nhớ của LCD............................................................................. 27 3.4.3 Các lệnh giao tiếp với LCD ............................................................................. 30 3.4.4 Khởi tạo LCD................................................................................................... 30

3.5 Các bước hiện thực yêu cầu 2 ................................................................................. 32 3.6 Bài tập ..................................................................................................................... 37

Bài 4 : Khảo sát bộ định thời ........................................................................................ 37 4.1 Các bước hiện thực yêu cầu 1 ................................................................................. 38 4.2 Chương trình mẫu ................................................................................................... 39 4.3 Bài tập ..................................................................................................................... 41

Bài 5 : Kỹ thuật quét ma trận phím .............................................................................. 42 5.1 Kết nối mạch ma trận phím..................................................................................... 42 5.2 Các bước hiện thực ................................................................................................. 43 5.3 Bài tập ..................................................................................................................... 47

Bài 6 : Kỹ thuật quét LED............................................................................................ 48 6.1 Cấu tạo LED 7 đoạn và LED ma trận..................................................................... 48 6.2 Kết nối mạch ........................................................................................................... 50 6.3 Các thanh ghi liên quan và cách điều khiển............................................................ 51 6.4 Các bước hiện thực. ................................................................................................ 54 6.5 Bài tập ..................................................................................................................... 57

Bài 7 : Khảo sát bộ truyền nhận nối tiếp ...................................................................... 58 7.1 Các bước hiện thực. ................................................................................................ 58

Page 4: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

7.2 Chương trình mẫu ................................................................................................... 60 7.3 Bài tập ..................................................................................................................... 62

Bài 8 : Khảo sát khối chuyển đổi A-D.......................................................................... 63 8.1 Các bước hiện thực ................................................................................................. 63 8.2 Bài tập ..................................................................................................................... 64

Bài 9 : Khảo sát các khối chức năng đặc biệt khác ...................................................... 65 9.1 Các bước hiện thực PWM....................................................................................... 65 9.2 Chương trình mẫu ................................................................................................... 66 9.3 Bài tập ..................................................................................................................... 67

Page 5: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 1 Thực hành Vi xử lý

Bài 1 : Giới thiệu MPLAB IDE và KIT PIC Nội dung :

Tạo project trên MPLAB IDE. Viết chương trình ASM. Dịch và nạp chương trình vào vi điều khiển PIC. Chạy và gỡ rối chương trình.

1.1 Phần cứng thí nghiệm ICD2 và PICDEM 2 PLUS. Bộ hổ trợ lập trình dùng với máy tính ICD2 (In-Circuit Debugger).

Kit thí nghiệm PICDEM 2 Plus có các đặc điểm như hình sau :

1. Đế cắm DIP 18, 28 và 40 chân (có thể cắm 3 linh kiện nhưng chỉ dùng 1 mỗi lần). 2. Ổn áp +5V dùng cho nguồn 9V, 100 mA AC/DC hay pin 9V. 3. Đầu cắm DB-9 theo chuẩn giao tiếp RS-232. 4. Đầu cắm qua bộ lập trình In-Circuit Debugger (ICD). 5. Biến trở 5KΩ dùng cho tín hiệu nhập tương tự. 6. Ba nút nhấn dùng tạo tín hiệu kích từ bên ngoài và reset. 7. LED nguồn. 8. Bốn LED chỉ thị cho PORTB. 9. Jumper J6 để ngắt LED chỉ thị RB0 (khi nhập tín hiệu từ nút nhấn RB0).

USB

Nối với card PICDEM

Nối với máy tính

Cổng nối tiếp

ICD2

Sơ đồ kết nối ICD2

Page 6: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 2 Thực hành Vi xử lý

10. Bộ dao động (OSC) 4 MHz. 11. Nơi để lắp thêm thạch anh dao động nếu cần. 12. Thạch anh dao động 32.768 kHz tạo xung clock cho Timer1. 13. Jumper J7 để ngắt dao động RC có sẳn (khoảng 2 MHz). 14. EEPROM nối tiếp 32K x 8 bit. 15. Màn hình LCD. 16. Kèn Piezo. 17. Vùng lắp thêm linh kiện. 18. Cảm biến nhiệt TC74.

1.2 Môi trường phát triển MPLAB Bước 1. Chạy phần mềm MPLAB:

Start_|All Programs_|Microchip_|MPLAB IDE v8.00_|MPLAB IDE.

Bước 2. Chọn Menu : Project_|Project Wirazd…

Chọn Next ở cửa sổ Welcome

Bước 3. Chọn số hiệu PIC cần sử dụng (PIC18F4520) rồi bấm Next:

Bước 4. Chọn tool Microchip MPASM Toolsuite tại ô Active Toolsuite.

Page 7: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 3 Thực hành Vi xử lý

Chọn MPASM Assembler (mpasmwin.exe) tại ô Tollsuite Contents.

Click Next qua cửa sổ kế. Bước 5. Nhấn Browse… để chọn thư mục và đánh tên project.

Chọn thư viện thông qua file .INC và .LKR thêm vào project

Page 8: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 4 Thực hành Vi xử lý

C:\Program Files\Microchip\MPASM Suite\LKR\18f4520.lkr C:\Program Files\Microchip\MPASM Suite\P18F4520.INC

Click Next sẽ thấy như sau :

Click Finish. Ta sẽ được một project như hình sau:

Page 9: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 5 Thực hành Vi xử lý

Bước 6. Thêm file vào dự án theo các bước sau : Một project đơn giản nhất phải gồm có 2 thành phần Source files và Hearder Files.

Thư mục Source files chứa file text *.asm hoặc file *.c chứa code lập trình. Thư mục Hearder Files chứa file *.h hoặc *.INC: file có sẵn của microchip.

Nếu bạn quên không thêm các file cần có vào thì làm theo hướng dẫn sau : ADD header file: ( Copy header file vào thư mục chứa project để tiện cho việc sử

dụng sau này).

Chọn header file phù hợp với PIC

mình đã chọn. Open. ADD source file: Click chọn New

trên toolbar: Cửa sổ hiện lên như sau: Từ Menu

bar chọn File_|Save để lưu.

Thực hiện Save, đặt tên với đuôi .asm vào thư mục chứa dự án.

Nhấp phải vào Source Files chọn Add file >>> chọn file chúng ta vừa tạo xong.

Chúng ta đã hoàn tất việc thêm file vào các thư mục Source files và Header files.

cửa sổ lựa chọn

Page 10: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 6 Thực hành Vi xử lý

Công việc tiếp theo là viết code (trong cửa sổ text editor của source file). Ðối với project lớn dùng nhiều source file và header file, ta làm lại quá trình thêm file

vào dự án nhiều lần.

1.3 Nạp file hex vào vi điều khiển PIC Sau khi tạo được một project, ta tiến hành build nó để tạo ra *.hex. Có thể mô tả công

việc như sau: Ví dụ, ta có một chương trình cho PIC như sau:

;=================================================== ; Name: BaiTN1.asm ; Project: Nhap du lieu tu nut nhan RA4. ; Khi nut RA4 duoc nhan thi led don RB0 sang, ; Khi khong nhan RA4 thi led don RB0 tat ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 7 - 31 - 2009 ;=================================================== list p=18f4520 #include p18f4520.inc code 0 goto start ;vung dinh nghia du lieu udata ;vung dinh nghia cac chuong trinh con PRG code start call init ;chuong trinh chinh main btfsc PORTA,RA4 ;cho nhan nut RA4 bra main bsf LATB,RB0 ;Bat LED RB0 swoff btfss PORTA,RA4 ;cho nhan nut RA4 bra swoff bcf LATB,RB0 ;tat LED RB0 bra main ;Lap lai cong viec ;chuong trinh khoi dong ban dau init bcf TRISB,RB0 ;khoi dong RB0 la cong xuat bsf TRISA,RA4 ;khoi dong RA4 la cong nhap return end Bây giờ chúng ta lưu chương trình vừa viết thành BaiTN1.asm vào một thư mục đã

tạo project phía trên. Để compile chương trình ta vào menu Project_|Build All như hình bên dưới.

Page 11: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 7 Thực hành Vi xử lý

Nếu việc build thất bại, nhưng việc này thì không mong muốn, ta có thấy kết quả như

hình sau:

Page 12: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 8 Thực hành Vi xử lý

Nếu thành công, ta sẽ thấy hình sau:

Nếu việc build đã thành công, chương trình sẽ dịch BaiTN1.asm thành BaiTN1.hex

trong cùng thư mục chương trình BaiTN1.asm. Sau khi đã có được file hex, công việc tiếp theo là làm thế nào để nạp được file Hex xuống board. Đầu tiên, chọn mạch nạp bằng cách vào menu Programmer_|Select Programmer_|Mplab ICD2 như hình sau :

Sau khi chọn Mplab ICD2 xong thì ta sẽ thấy giao diện như sau:

Page 13: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 9 Thực hành Vi xử lý

Một thao tác cần làm giúp ta có thể dịch chương trình, nạp và chạy tự động là vào menu Programmer_|Settings…_|Program chọn mục Automatically như hình sau :

Bây giờ ta có thể dịch, nạp và chạy dự án với thao tác menu Project_|Build All (hoặc

nhấn Ctrl-F10).

Nếu thành công thì chương trình sẽ được dịch, nạp ra card PICDEM và chạy ngay.

Page 14: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 10 Thực hành Vi xử lý

Nếu thất bại, xem thông tin báo lỗi trong cửa sổ Output để khắc phục và làm lại từ bước Build All.

Trường hợp thành công mà chương trình chạy không đúng, ta phải sử dụng công cụ Debugger để tìm lỗi theo một trong hai cách sau.

1.4 Debug dùng MpLab SIM Bước 1. Chọn Debugger bằng menu Debugger_|Select Debugger_|Mplab SIM

Bước 2. Tham khảo menu Debugger. Xuất hiện nhiều chức năng hỗ trợ debug.

Từ đây ta đã có thể mô phỏng được chương trình của mình một cách dễ dàng. Các chức năng thường dùng :

• Run (F9): chạy chương trình, chương trình sẽ chạy liên tục đến khi nào có breakpoint thì dừng.

• Breakpoints (F2): tạo ra breakpoint tại vị trí hiện tại của con trỏ (cũng có thể "double click" vào hàng code mình mong muốn đặt Breakpoint).

• Step Into (F7): chạy từng bước, vào trong chương trình con (nếu gặp). • Step Over (F8): chạy từng bước, gọi chương trình con cũng xem như 1 bước. • Reset: trở về đầu chương trình.

Page 15: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 11 Thực hành Vi xử lý

Bước 3. Khi debug thì ta cũng cần phải biết giá trị của các thanh ghi cũng như bộ nhớ của chip như thế nào, để xem được các giá trị này thì chúng ta qua menu View.

Để xem được giá trị của các thanh ghi trong PIC ta chọn menu View_|File registers sẽ xuất hiện cửa sổ như hình sau:

Để xem được giá trị của các thanh ghi SFR thì ta chọn View_|Special Function

Registers sẽ xuất hiện của sổ như hình sau:

Hay để xem một và thanh ghi mà ta quan tâm thì có thể dùng Watch để xem bằng

cách vào menu View_|Watch thì hình sau sẽ xuất hiện:

Muốn xem thanh ghi nào, ta chỉ việc chọn thanh ghi tương ứng trong combobox bên

trên, sau đó nhấn Add SFR.

Page 16: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 12 Thực hành Vi xử lý

1.5 Debug onchip dùng Mplab ICD2. Cũng giống như debug trên Mplab SIM, Mplab ICD2 cũng có những tính năng tương

tự, nhưng khi sử dụng Mplab ICD2 thì cần phải có mạch debug, và các hiện tượng xảy ra giống như khi chạy thực tế.

1.6 Bài tập Cải tiến chương trình BaiTN1.asm để khi nhấn RA4 sẽ thấy 4 LED từ RB3 đến RB0

sáng như đầu ra một bộ đếm 4 bit nhị phân tăng dần (mỗi lần nhấn tăng 1).

1.7 Báo cáo • Các điều kiện cần có để tiến hành thí nghiệm gồm những gì ? • Các bước cần làm để nạp chương trình ra card có chip vi điều khiển. • Các bước cần làm để tiến hành debug giả lập trên máy hoặc trên mạch.

Page 17: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 13 Thực hành Vi xử lý

Bài 2 : Khảo sát cổng xuất nhập

Nội dung: Khảo sát hoạt động của nút nhấn, LED. Khảo sát các thanh điều khiển cổng xuất nhập. Tính toán thời gian thực thi lệnh, viết chương trình con làm nhiệm vụ delay. Viết chương trình kiểm tra nút nhấn và hiển thị kết quả kiểm tra ra LED.

Yêu cầu: Viết chương trình xuất dữ liệu ra 4 led đơn đếm từ 0 -> 15 -> 0. Thời gian giữa

các lần đếm lên 1 đơn vị là 1s. Nhập dữ liệu từ nút nhấn RA4. Khi nút RA4 được nhấn thì led đơn RB0 sáng,

khi không nhấn RA4 thì led đơn RB0 tắt.

2.1 Kiến thức liên quan 2.1.1 Các thanh ghi điều khiển cổng xuất nhập

Mỗi Port có ba thanh ghi điều khiển hoạt động chính: Các bit trong thanh ghi TRIS: thiết lập chân tương ứng là ngõ vào (logic 1) hoặc

ngõ ra (logic 0). Các bit trong thanh ghi PORT: đọc mức logic từ chân tương ứng. Các bit trong thanh ghi LAT: ghi mức logic ra chân tương ứng.

2.1.2 Kết nối mạch Vị trí LED hiển thị và nút nhấn trên board như hình dưới đây:

Page 18: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 14 Thực hành Vi xử lý

LED hiển thị có kết nối như sau:

Muốn các LED sáng, các chân RBi tương ứng phải lên mức 1. Riêng LED D2 còn

phải nối jumper J6 lại mới sáng được khi RB0=1. Lý do có jumper JP6 là do chân RB0 còn được dùng làm ngỏ nhập nút nhấn RB0.

Như vậy, lúc nào muốn dùng chân RB0 là ngỏ xuất LED thì đóng jumper JP6 lại. Ngược lại, để hở JP6 sẽ dùng RB0 làm ngỏ nhập nút nhấn.

Các nút nhấn có kết nối như sau:

Nút nhấn RA4, RB0 khi được nhấn sẽ làm cho chân tương ứng ở mức logic 0.

Cần thiết lập các chân RA4 và RB0 là ngõ vào. Bộ dao động chính là bộ dao động ngoài tần số 4 MHz có kết nối như sau:

Trên kit thí nghiệm, thạch anh Y2 được sử dụng cho tất cả các bài thí nghiệm.

2.2 Các bước hiện thực yêu cầu 1 Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Led_don,

tạo file led_don.asm và chọn chip 18f4520. Ta được hình sau:

Page 19: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 15 Thực hành Vi xử lý

Bước 2. Include file p18f4520.inc vào file led_don.asm. Bước 3. Khởi tạo PORTB là cổng xuất ở các bit RB0-RB3.

init clrf PORTB ; bcf TRISB,RB0 ; RB0 xuất bcf TRISB,RB1 ; RB1 xuất bcf TRISB,RB2 ; RB2 xuất bcf TRISB,RB3 ; RB3 xuất return

Bước 4. Tạo hàm delay1ms có sử dụng biến delay (định nghĩa trong udata) như sau : udata delay res 1 ; định nghĩa biến delay . . . delay1ms ; Gần đúng 1 ms với xung clock 4 MHz clrf delay ; xóa biến delay (vòng lặp 256 lần) dl_1 nop decfsz delay bra dl_1 return

Bước 5. Từ đây ta có thể tạo ra được hàm delay1s bằng cách gọi hàm delay1ms 1000 lần

delay1s movlw .4 movwf delay_1sa dl_2 movlw .250 ; bắt đầu vòng lặp ngoài

Page 20: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 16 Thực hành Vi xử lý

movwf delay_1sb dl_3 call delay1ms ; bắt đầu vòng lặp trong decfsz delay_1sb bra dl_3 ; kết thúc vòng lặp trong (250 lan) decfsz delay_1sa bra dl_2 ; kết thúc vòng lặp ngoài (4 lần) return

Bước 6. Viết chương trình cho hàm begin thực hiện các yêu cầu của đề bài : begin incf LATB call delay1s bra begin ; lặp lại sau mỗi giây

2.3 Chương trình mẫu yêu cầu 1 ;=====================================; ; Name: led_don.asm ; Project: Xuất dữ liệu ra 4 led đơn đếm từ 0 → 15 → 0. ; Thời gian giữa các lần đếm lên 1 đơn vị là 1s. ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 7 - 31 - 2009 ;======================================;

list p=18f4520 #include p18f4520.inc code 0 goto start ; Vung du lieu udata delay res 1 delay_1sa res 1 delay_1sb res 1 ; Vung bat dau code PRG code start call init ; chuong trinh chinh begin incf LATB call delay1s bra begin ; lap lai sau moi giay ; Ham khoi dong ban dau init clrf PORTB ; bcf TRISB,RB0 ; cau hinh RB0 xuat bcf TRISB,RB1 ; cau hinh RB1 xuat bcf TRISB,RB2 ; cau hinh RB2 xuat bcf TRISB,RB3 ; cau hinh RB3 xuat return

Page 21: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 17 Thực hành Vi xử lý

; Ham lam tre 1ms voi tan so dao dong 4MHz delay1ms ; Gan dung voi xung clock 4 MHz clrf delay ; xoa bien delay (vong lap 256 lan) dl_1 nop decfsz delay bra dl_1 return ; Ham lam tre 1s = 1000 x 1ms delay1s movlw .4 movwf delay_1sa dl_2 movlw .250 ; bat dau vong lap ngoai (4 lan) movwf delay_1sb dl_3 call delay1ms ; bat dau vong lap trong (250 lan) decfsz delay_1sb bra dl_3 ; ket thuc vong lap trong decfsz delay_1sa bra dl_2 ; ket thuc vong lap ngoai return end

Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1.

2.4 Các bước hiện thực yêu cầu 2 Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Nut_nhan

và chọn chip 18f4520. Ta được hình sau:

Page 22: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 18 Thực hành Vi xử lý

Bước 2. Include file p18f4520.inc vào file nut_nhan.asm. Bước 3. Khởi tạo PORTB bit RB0 là cổng xuất (jumper JP6 đóng) và PORTA bit RA4

là cổng nhập. init clrf PORTB bcf TRISB,RB0 ; RB0 xuất bsf TRISA,RA4 ; RA4 nhập return

Bước 4. Viết chương trình cho hàm main thực hiện yêu cầu của đề bài main btfsc PORTA,RA4 ; chờ đến khi RA4 được nhấn bra main bsf LATB,RB0 ; bật sáng LED RB0 swoff btfss PORTA,RA4 ; chờ đến khi RA4 được nhả bra swoff bcf LATB,RB0 ; tắt LED RB0 bra main ; lặp lại quá trình

2.5 Chương trình mẫu yêu cầu 2 ;=====================================; ; Name: nut_nhan.asm ; Project: Nhập dữ liệu từ nút nhấn RA4. ; Khi nút RA4 được nhấn thì led đơn RB0 sáng, ; Khi không nhấn RA4 thì led đơn RB0 tắt ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 7 - 31 - 2009 ;======================================; list p=18f4520 #include p18f4520.inc code 0 goto start ; Vung du lieu udata ; Chuong trinh nay khong su dung bien ; Vung bat dau code PRG code start call init ; chuong trinh chinh main btfsc PORTA,RA4 ; cho den khi RA4 duoc nhan bra main bsf LATB,RB0 ; bat sang LED RB0 swoff btfss PORTA,RA4 ; cho den khi RA4 duoc nha bra swoff bcf PORTB,RB0 ; tat LED RB0 goto main ; lap lai qua trinh ; Ham khoi dong ban dau init clrf PORTB bcf TRISB,RB0 ; RB0 xuat

Page 23: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 19 Thực hành Vi xử lý

bsf TRISA,RA4 ; RA4 nhap return end Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống

mạch để chạy chương trình như hướng dẫn ở chương 1.

2.6 Bài tập

a) Viết chương trình để khi nhấn RA4 thì các led sẽ sáng đếm lên, mỗi lần nhấn đếm lên 1 đơn vị.

b) Viết chương trình sao cho mỗi lần nhấn RA4 thì 2 led trái và 2 led phải thay nhau sáng.

c) Tạo hiệu ứng light river trên 4 led của board mạch starter kit. Nhấn RA4 để thay đổi chiều của light river.

2.7 Báo cáo • Cần làm những gì để có thể sử dụng cổng giao tiếp song song? • Giải thích tại sao dùng LATB và PORTB lúc giống nhau, lúc khác nhau. • Hãy tính thời gian chính xác của vòng lặp delay.

Page 24: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 20 Thực hành Vi xử lý

Page 25: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 21 Thực hành Vi xử lý

Bài 3 : Khảo sát cơ chế ngắt quãng, giao tiếp LCD ký tự

Nội dung: Khảo sát các nguyên nhân gây ngắt quãng, cách xử lý ngắt quãng, tính ưu tiên

giữa các ngắt của vi điều khiển PIC 18F4520. Khảo sát ngắt ngoài của vi điều khiển PIC 18F4520. Điều khiển LCD ký tự 2 x 16.

Yêu cầu: 1. Viết chương trình khởi tạo 2 ngắt:

Ngắt ngoài INT0 (nhận ngắt qua nút nhấn RB0, Jumper JP6 hở) với độ ưu tiên cao. Ngắt timer 0 với độ ưu tiên thấp.

Trong chương trình ngắt ngoài INT0 bật 3 led đơn RB1, RB2, RB3 sáng cùng lúc. Trong chương trình timer 0 sau 1s khi 3 led được bật ở trong ngắt ngoài thì tắt 3

led đơn RB1, RB2, RB3 cùng lúc. 2. Viết chương trình hiển thị kí tự lên LCD.

3.1 Kiến thức liên quan 3.1.1 Tóm tắt các thanh ghi điều khiển ngắt Thanh ghi INTCON:

Thanh ghi PIE1:

Thanh ghi PIE2:

Thanh ghi PIR1:

Thanh ghi PIR2:

Page 26: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 22 Thực hành Vi xử lý

Sơ đồ điều khiển ngắt:

3.2 Các bước hiện thực yêu cầu 1 Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Interrupt,

tạo file interrupt.asm và chọn chip 18f4520. Ta được hình sau:

Bước 2. Include file p18f4520.inc vào file interrupt.asm Bước 3. Khởi tạo PortB là output sử dụng các lệnh clrf, bcf

init clrf LATB ; RB1-RB3 la cong xuat movlw 0x0F

Page 27: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 23 Thực hành Vi xử lý

movwf ADCON1 bsf TRISB,RB0 bcf TRISB,RB1 bcf TRISB,RB2 bcf TRISB,RB3 movlw .10 ; khoi dong bien delay=10 movwf delay return

Bước 4. Khởi tạo timer 0 tạo ngắt 100 ms (với xung clock 4 MHz, chọn prescaler 2:1, số đếm 50000), cho ngắt timer 0 có độ ưu tiên thấp.

init_timer0 bsf RCON,IPEN ; cho phep uu tien ngat. bcf INTCON2,TMR0IP ; timer0 uu tien thap bcf INTCON,TMR0IF ; xoa co ngat timer0 bsf INTCON,TMR0IE ; cho phep ngat timer0 bsf INTCON,GIEH ; cho phep ngat uu tien cao bsf INTCON,GIEL ; cho phep ngat uu tien thap clrf T0CON ; prescaler 2:1 movlw HIGH (-50000) ; nap so dem 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phep timer0 dem return

Bước 5. Khởi tạo ngắt ngoài 0 tích cực cạnh xuống. Đối với ngắt ngoài INT1 và INT2, độ ưu tiên phụ thuộc vào 2 bit INT1IP và INT2IP

trong thanh ghi INTCON3. Còn với ngắt ngoài INT0 thì độ ưu tiên luôn là cao. init_int0 bcf INTCON2,INTEDG0 ; tac dong canh xuong bcf INTCON,INT0IF ; xoa co ngat bsf INTCON,INT0IE ; cho phep ngat ngoai INT0 return

Bước 6. Viết chương trình cho ngắt ngoài 0, bật 3 đèn led đơn cùng sáng và khởi tạo lại giá trị cho biến delay để 1s sau thì ngắt timer sẽ tắt 3 đèn đó.

int0_isr bcf INTCON,INT0IF bsf LATB,RB1 bsf LATB,RB2 bsf LATB,RB3 movlw .10 movwf delay return

Bước 7. Viết chương trình cho ngắt timer0, sau 1s sau khi led được bật sáng thì nó sẽ làm cho led tắt.

Thời gian để timer đếm lên 1 đơn vị đựơc tính bằng công thức : t = (1/(Focs/4))*prescaler = (1/(4Mhz/4))*2) =2μs

Page 28: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 24 Thực hành Vi xử lý

Như vậy, muốn có thời khoảng 100 ms (100000μs), ta cần đếm 50000 lần. timer0_isr bcf INTCON,TMR0IF decfsz delay,1 bra timer0_isr_1 bcf LATB,RB1 bcf LATB,RB2 bcf LATB,RB3 movlw .10 movwf delay timer0_isr_1 bcf T0CON,TMR0ON movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phep timer0 dem lai return

3.3 Chương trình mẫu yêu cầu 1 ;=====================================; ; Name: led_don.asm ; Project: Viết chương trình khởi tạo 2 ngắt: ; -Ngắt ngoài 0 với độ ưu tiên cao. ; -Ngắt timer 0 với độ ưu tiên thấp. ; -Ngắt INT0 : bật 3 led đơn RB1, RB2, RB3 sáng cùng ;lúc ; -Ngắt timer0 : tắt 3 led đơn RB1, RB2, RB3 sau 1s ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 7 - 31 - 2009 ;======================================; list p = 18f4520 #include P18f4520.inc code 0 goto main org 08H goto isr_high org 18H goto isr_low ; Vung du lieu udata delay res 1 ; Vung bat dau code PRG code main call init

Page 29: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 25 Thực hành Vi xử lý

call init_timer0 call init_int0 goto $ ; Ham khoi dong ban dau init clrf LATB ; RB1-RB3 la cong xuat movlw 0x0F movwf ADCON1 bsf TRISB,RB0 bcf TRISB,RB1 bcf TRISB,RB2 bcf TRISB,RB3 movlw .10 ; khoi dong bien delay=10 movwf delay return ; Ham khoi dong timer0 init_timer0 bsf RCON,IPEN ; cho phep uu tien ngat. bcf INTCON2,TMR0IP ; timer0 uu tien thap bcf INTCON,TMR0IF ; xoa co ngat timer0 bsf INTCON,TMR0IE ; cho phep ngat timer0 bsf INTCON,GIEH ; cho phep ngat uu tien cao bsf INTCON,GIEL ; cho phep ngat uu tien thap clrf T0CON ; prescaler 2:1 movlw HIGH (-50000) ; nap so dem 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phep timer0 dem return ; Ham khoi dong int0 init_int0 bcf INTCON2,INTEDG0 ; tac dong canh xuong bcf INTCON,INT0IF ; xoa co ngat bsf INTCON,INT0IE ; cho phep ngat ngoai INT0 return ; Ham xu ly ngat timer0 timer0_isr bcf INTCON,TMR0IF decfsz delay,1 bra timer0_isr_1 bcf LATB,RB1 bcf LATB,RB2 bcf LATB,RB3 movlw .10 movwf delay timer0_isr_1

Page 30: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 26 Thực hành Vi xử lý

bcf T0CON,TMR0ON movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phep timer0 dem lai return ; Ham xu ly ngat int0 int0_isr bcf INTCON,INT0IF bsf LATB,RB1 bsf LATB,RB2 bsf LATB,RB3 movlw .10 movwf delay return ; Ham xu ly ngat uu tien cao isr_high call int0_isr retfie ; Ham xu ly ngat uu tien thap isr_low call timer0_isr retfie end

Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống

mạch để chạy chương trình như hướng dẫn ở chương 1.

3.4 LCD ký tự 2x16 3.4.1 Hình dạng và ý nghĩa các chân:

Tên chân Mức logic Mô tả GND - Đất (0V)

Page 31: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 27 Thực hành Vi xử lý

VCC - Nguồn (+5V) VEE - Chỉnh contrast (0 – VCC) RS 0

1 D0-D7 là giá trị lệnh

D0-D7 là giá trị dữ liệu R/W 0

1 Ghi giá trị vào LCD Đọc giá trị ra từ LCD

E 0 1

Từ 1 xuống 0

Cấm truy xuất LCD LCD hoạt động trao đổi dữ liệu

Dữ liệu/Lệnh đưa vào LCD D0 0/1 Bit 0/LSB D1 0/1 Bit1 D2 0/1 Bit2 D3 0/1 Bit3 D4 0/1 Bit4 D5 0/1 Bit5 D6 0/1 Bit6 D7 0/1 Bit7/MSB A - Chân Anode của đèn nền K - Chân Cathode của đèn nền

3.4.2 Tổ chức vùng nhớ của LCD 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ịch chữ bằng cách sử dụng lệnh dịch (mô tả sau), khi đó cửa sổ hiển thị sẽ dịch đem lại hiệu ứng dịch chữ.

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).

Page 32: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 28 Thực hành Vi xử lý

Character Generator Rom (CGROM): lưu trữ cứng các mẫu ký tự tương ứng với mã

ASCII. Dưới đây là bảng ánh xạ giữa mã ký tự và mẫu ký tự.

Page 33: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 29 Thực hành Vi xử lý

Chú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 đến 0x4f, đâ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ẫu ký tự CGRAM thứ nhất “®”).

Page 34: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 30 Thực hành Vi xử lý

3.4.3 Các lệnh giao tiếp với LCD

Lệnh RS RW D7 D6 D5 D4 D3 D2 D1 D0 Thời gian thực thi

Clear display 0 0 0 0 0 0 0 0 0 1 1.52ms

Return home 0 0 0 0 0 0 0 0 1 * 1.52ms

Entry mode set 0 0 0 0 0 0 0 1 I/D SH 37µs

Display on/off control 0 0 0 0 0 0 1 D C B 37µs

Cursor/Display shift 0 0 0 0 0 1 S/

C R/L * * 37µs

Function set 0 0 0 0 1 DL N F * * 37µs

Set CGRAM address 0 0 0 1 CGRAM address 37µs

Set DDRAM address 0 0 1 DDRAM address 37µs

Read BUSY flag (BF) 0 1 BF DDRAM address 0µs

Write to DDRAM or

CGRAM 1 0 D7 D6 D5 D4 D3 D2 D1 D0 43µs

Read from DDRAM or

CGRAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0 43µs

Các bit trên bảng tóm tắt các lệnh có ý nghĩa như sau: I/D 1 Increment 0 Decrement SH 1 Entire shift on 0 Entire shift off S/C 1 Display shift 0 Cursor move R/L 1 Shift to the Right 0 Shift to the Left DL 1 8 bits 0 4 bits N 1 2 Lines 0 1 Lines F 1 5x10 dots Font 0 5x8 dots Font BF 1 Internally operating 0 Can accept instruction

Trên kit thí nghiệm LCD ký tự 2x16 được kết nối vào Port D ở chế độ 4 bit. Ở chế độ 4 bit, để đọc hay ghi một byte phải tiến hành cài dữ liệu hai lần, lần đầu là 4 bit cao, lần thứ hai là 4 bit thấp.

3.4.4 Khởi tạo LCD Sơ đồ kết nối LCD:

Page 35: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 31 Thực hành Vi xử lý

Q2MMBT2222A

VCC

R20 2.2KRD7

RD4RD5RD6

Vss1

Vdd2

Vee3

RS4

R/W5

E6

D07

D18

D29

D310

D411

D512

D613

D714

A15

K16

LCD1

RD3RD2RD1RD0

LCD ký tự 2x16

Trước khi xuất ký tự ra màn hình LCD, LCD controller phải được khởi tạo khi mới

được cấp nguồn. Trình tự khởi tạo như lược đồ sau. Trên lược đồ, lệnh “Display clear” có giá trị 0x01 được gửi hai lần, lần đầu là 4 bit cao có giá trị 0x0, lần thứ hai là bốn bit thấp có giá trị 0x01. Lệnh “Function set” gửi hai lần giá trị 0x2.

Page 36: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 32 Thực hành Vi xử lý

Bật nguồn (chân PD7 out ra mức logic 1)

Chờ tối thiểu 30ms(Đợi VDD > 4.5V)

Gửi lệnh “Function set”

RS RW D7 D6 D5 D4

0 0 0 0 1 0

0 0 0 0 1 0

0 0 N F * *

Chờ tối thiểu 39µs

0 0 0 0 0 0

0 0 1 D C B

Chờ tối thiểu 39µs

0 0 0 0 0 0

0 0 0 0 0 1

Kết thúc khởi tạo

0 0 0 0 0 0

0 0 0 1 I/D SHGửi lệnh “Display on/off control”

RS RW D7 D6 D5 D4

Gửi lệnh “Entry mode set”

RS RW D7 D6 D5 D4

Gửi lệnh “Display clear”

RS RW D7 D6 D5 D4

3.5 Các bước hiện thực yêu cầu 2 Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là LCD, tạo

file lcd.asm và chọn chip 18f4520. Ta được hình sau:

Page 37: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 33 Thực hành Vi xử lý

Bước 2. Include file p18f4520.inc vào file lcd.asm Bước 3. Dựa vào sơ đồ nguyên lý kết nối vi điều khiển với LCD kí tự ta define lại để dễ

dàng sử dụng hơn. #define LCD_D4 LATD, RD0 ; LCD data bits #define LCD_D5 LATD, RD1 #define LCD_D6 LATD, RD2 #define LCD_D7 LATD, RD3 #define LCD_D4_DIR TRISD, RD0 ; LCD data bits #define LCD_D5_DIR TRISD, RD1 #define LCD_D6_DIR TRISD, RD2 #define LCD_D7_DIR TRISD, RD3 #define LCD_E LATD, RD6 ; LCD E clock #define LCD_RW LATD, RD5 ; LCD read/write line #define LCD_RS LATD, RD4 ; LCD register select line #define LCD_E_DIR TRISD, RD6 #define LCD_RW_DIR TRISD, RD5 #define LCD_RS_DIR TRISD, RD4 #define LCD_INS 0 #define LCD_DATA 1

Bước 4. Viết hàm xuất dữ liệu 4 bit ra cho LCD kí tự : LCDWriteNibble btfss STATUS, C ; Set the register select bcf LCD_RS btfsc STATUS, C bsf LCD_RS

Page 38: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 34 Thực hành Vi xử lý

bcf LCD_RW ; Set write mode bcf LCD_D4_DIR ; Set data bits to outputs bcf LCD_D5_DIR bcf LCD_D6_DIR bcf LCD_D7_DIR nop ; Small delay nop bsf LCD_E ; Setup to clock data nop nop btfss temp_wr, 7 ; Set high nibble bcf LCD_D7 btfsc temp_wr, 7 bsf LCD_D7 btfss temp_wr, 6 bcf LCD_D6 btfsc temp_wr, 6 bsf LCD_D6 btfss temp_wr, 5 bcf LCD_D5 btfsc temp_wr, 5 bsf LCD_D5 btfss temp_wr, 4 bcf LCD_D4 btfsc temp_wr, 4 bsf LCD_D4 nop ; Small delay nop bcf LCD_E ; Send the data return

Bước 5. Tiếp tục ta viết hàm để truyền lệnh (command) cho lcd kí tự. Macro LCDWrite_command có một đối số là data, ta dùng đối số này để truyền lệnh

cho lcd. Ở đây, LCD ta thiết lập chế độ 4 bít nên khi truyền lệnh nó cũng chỉ cần 4 bit để điều khiển. Trong macro này data1 chỉ sử dụng 4 bit cao mà thôi.

LCDWrite_command macro data1 bcf LCD_RS ;write command movlw data1 movwf temp_wr call LCDWriteNibble movlw 0xF movwf delay rcall DelayXCycles endm

Bước 6. Sau đó viết thêm hàm truyền dữ liệu hiển thị ra LCD kí tự. Macro LCDWrite_data có một đối số là data1, ta dùng macro với đối số tương ứng để

truyền data hiển thị lên màn hình LCD. Như trên ta đã đề cập, trong ứng dụng này ta sử

Page 39: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 35 Thực hành Vi xử lý

dụng LCD chế độ 4 bít, nên data ở đây được truyền theo thứ tự là 4 bit cao truyền trước sau đó 4 bít thấp được truyền sau.

LCDWrite_data macro data1 bsf LCD_RS ;write data movff data1,temp_wr rcall LCDBusy bsf STATUS, C rcall LCDWrite movlw 0x0F ;Wait ~100μs @ 20 MHz movwf delay rcall DelayXCycles endm

Bước 7. Hàm quan trọng nhất của LCD kí tự chính là hàm khởi tạo LCD. Trước khi sử dụng được lcd ta phải khởi tạo cho nó theo như giản đồ khởi tạo lcd ở trên phần hướng dẫn lý thuyết. Ngoài ra do thiết kế mạch, để LCD có thể hiện thị bình thường trước tiên ta phải bật nguồn của LCD lên, chân nguồn của LCD được điều khiển bởi PortD.7 tích cực mức cao, nên trước khi muốn sử dụng LCD ta phải bật PortD.7 lên 1.

LCDInit1 call init_variable bsf LATD, RD7 bcf TRISD, RD7 bcf LCD_E_DIR ;configure control lines bcf LCD_RW_DIR bcf LCD_RS_DIR movlw b'00001110' movwf ADCON1 movlw 0xff ; Wait ~15ms @ 20 MHz movwf COUNTER lil11 movlw 0xFF movwf delay rcall DelayXCycles decfsz COUNTER,F bra lil11 LCDWrite_command 0x20 LCDWrite_command 0x20 LCDWrite_command 0x80 LCDWrite_command 0x00 LCDWrite_command 0xf0 LCDWrite_command 0x00 LCDWrite_command 0x10 call LongDelay ;2ms call LongDelay ;2ms LCDWrite_command 0x00 LCDWrite_command 0x20

Page 40: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 36 Thực hành Vi xử lý

call Lcd_clear return

Bước 8. Đến đây ta có thể viết chương trình để hiển thị kí tự lên lcd kí tự. Ý tưởng thực hiện ở đây là lúc đầu ta khai báo một vùng nhớ gồm 32 ô nhớ tương

ứng với 32 vị trí trên lcd kí tự. Hàm lcd_display của chúng ta sẽ thực hiện một việc đơn giản là lấy dữ liệu chứa trong vùng nhớ này ra hiển thị lên lcd kí tự. Còn người dùng muốn hiển thị lên lcd thì chỉ cần update giá trị vào vùng nhớ này là xong.

Lcd_display movff INDF0,temp_wr1 movlw .0 cpfseq temp_wr1 goto Lcd_display1 movlw 0x20 movwf temp_wr1 Lcd_display1 LCDWrite_data temp_wr1 incf FSR0L clrf WREG addwfc FSR0H, F movlw .0 cpfseq flag_line goto Lcd_display_line2 ;display line1 incf index_of_lcd molw MAX_INDEX cpfseq index_of_lcd goto Exit_Lcd_display clrf Index_of_lcd movlw .1 movwf flag_line Set_cursor .0,.1 goto Exit_Lcd_display ;display line2 Lcd_display_line2 incf index_of_lcd movlw MAX_INDEX cpfseq index_of_lcd goto Exit_Lcd_display clrf Index_of_lcd movlw .0 movwf flag_line movlw HIGH Lcd_buffer movwf FSR0H movlw LOW Lcd_buffer movwf FSR0L

Page 41: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 37 Thực hành Vi xử lý

Set_cursor .0, .0 Exit_Lcd_display return

3.6 Bài tập a) Viết chương trình kiểm tra phát hiện rung phím RA4. b) Viết chương trình chạy chữ qua LCD. c) Viết chương trình thay đổi chữ hiển thị trên LCD khi nhấn nút.

3.7 Báo cáo a) Bố cục của chương trình có sử dụng ngắt quãng. b) Dùng ngắt ngoài đọc trạng thái nút nhấn RA4 có bị rung không ? Làm sao biết để

chống rung ?

Page 42: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 38 Thực hành Vi xử lý

Bài 4 : Khảo sát bộ định thời

Nội dung: Khảo sát các chế độ hoạt động của các bộ định thời. Khảo sát các thanh ghi điều khiển bộ định thời. Sử dụng bộ định thời trong chương trình.

Yêu cầu: Sử dụng bộ timer0 cứ sau 1s đếm lên 1 đơn vị rồi xuất giá trị ra led đơn. Viết chương trình sử dụng bộ định thời làm đồng hồ điều khiển đèn giao thông.

4.1 Các bước hiện thực yêu cầu 1 Bước 1. Tạo project mới tên timer. Bước 2. Tạo tập tin nguồn timer.asm. Bước 3. Khởi tạo PORTB là cổng xuất.

init clrf PORTB ; toàn bộ PORTB là cổng xuất clrf TRISB return

Bước 4. Khởi tạo các vector ngắt. Địa chỉ 0x00 bắt đầu chương trình chính. Địa chỉ 0x08 địa chỉ của vector ngắt có độ ưu tiên cao. Địa chỉ 0x18 địa chỉ của vector ngắt có độ ưu tiên thấp.

code 0 goto main org 0x000008 ; vector ngắt ưu tiên cao goto isr_high org 0x000018 ; vector ngắt ưu tiên thấp goto isr_low ; Vùng định nghĩa dữ liệu udata bien res 1 ; Vùng bắt đầu code PRG code main call init . . . ; chương trình phục vụ ngắt ưu tiên cao isr_high . . . retfie ; chương trình phục vụ ngắt ưu tiên thấp isr_low . . . retfie

Bước 5. Khởi tạo ngắt timer0 phát ra ngắt 100ms (với xung clock 4 MHz, chọn prescaler

2:1, số đếm 50000). ;=====================;

Page 43: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 39 Thực hành Vi xử lý

; Initializing timer 0: 16BIT ;=====================; init_timer0 bsf RCON,IPEN ; cho phép dùng ưu tiên ngắt. bcf INTCON2,TMR0IP ; ngắt timer0 ưu tiên thấp bcf INTCON,TMR0IF ; xóa cờ báo ngắt timer0 bsf INTCON,TMR0IE ; cho phép ngắt timer0 bsf INTCON,GIEH ; cho phép ngắt ưu tiên cao bsf INTCON,GIEL ; cho phép ngắt ưu tiên thấp clrf T0CON ; prescaler 2:1 movlw HIGH (-50000) ; nạp số đếm 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phép timer0 đếm return

Bước 6. Viết chương trình con chạy trong timer, sau 1s tăng giá trị hiển thị ra ngoài led đơn.

Vì cứ 100ms thì có ngắt một lần, do đó để sau 1s ta tăng lên một giá trị thì cần 10 lần ngắt như vậy, nên ban đầu ta phải khởi tạo cho biến delay = 10. Và đây là hàm chính thực hiện chức năng của bài tập 1.

timer0_isr bcf INTCON,TMR0IF decfsz delay ; đếm số lần xảy ra ngắt bra timer0_isr_1 ; chưa đủ, chuyển đi incf LATB ; đã đủ tăng PORTB lên 1 movlw .10 ; nạp lại biến đếm số lần ngắt xảy ra movwf delay ; 10 x 100 ms = 1s timer0_isr_1 bcf T0CON,TMR0ON movlw HIGH (-50000) ; nạp lại số đếm 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phép timer0 đếm lại return

4.2 Chương trình mẫu ;================================================== ; Name: timer.asm ; Project: Su dung bo Timer0, cu sau 1s đem len 1 đon vi roi xuat gia tri ra led don. ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 8 - 6 - 2009 ;================================================== list p = 18f4520

Page 44: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 40 Thực hành Vi xử lý

#include p18f4520.inc code 0 goto main org 0x000008 ; vector ngat uu tien cao goto isr_high org 0x000018 ; vector ngat uu tien thap goto isr_low ; Vung du lieu udata delay res 1 ; Vung bat dau code PRG code main call init call init_timer0 goto $ ; Ham khoi dong ban dau init clrf PORTB ; toan bo PORTB la cong xuat clrf TRISB return ;===========================================; ; Khoi dong Timer0 dem 16 bit. ; De tinh thoi khoan tao ra boi Timer0, ta can biet mot so diem ; 1. Tan so xung clock ngoài: 4Mhz ; 2. Thong so dem truoc Timer0 : 1:2 ; thoi gian tao ra ngat tu Timer0 = 1/((FOSC /4)*2) = 2μs ;===========================================; init_timer0 bsf RCON,IPEN ; cho phep uu tien ngat. bcf INTCON2,TMR0IP ; timer0 uu tien thap bcf INTCON,TMR0IF ; xoa co ngat timer0 bsf INTCON,TMR0IE ; cho phep ngat timer0 bsf INTCON,GIEH ; cho phep ngat uu tien cao bsf INTCON,GIEL ; cho phep ngat uu tien thap clrf T0CON ; prescaler 2:1 movlw HIGH (-50000) ; nap so dem 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phep timer0 dem return ;===============================================; ; chuong trinh phuc vu ngat quang uu tien cao ;===============================================;

Page 45: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 41 Thực hành Vi xử lý

isr_high ; khong lam gi ca retfie ;===============================================; ; Chuong trinh phuc vu ngat quang uu tien thap ;===============================================; isr_low call timer0_isr retfie ;===============================================; ; Chuong trinh phuc vu ngat quang Timer0 ;===============================================; timer0_isr bcf INTCON,TMR0IF decfsz delay,1 bra timer0_isr_1 incf LATB movlw .10 movwf delay timer0_isr_1 bcf T0CON,TMR0ON movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0 movwf TMR0H movlw LOW (-50000) movwf TMR0L bsf T0CON,TMR0ON ; cho phep timer0 dem lai return end

4.3 Bài tập a) Làm lại bài thí nghiệm nhưng sử dụng Timer1 thay vì Timer0. b) Dùng bộ định thời tạo xung vuông chu kì 10ms, duty cycle 30%. c) Thực hiện yêu cầu 2 của bài thí nghiệm dùng timer điều khiển đèn giao thông.

4.4 Báo cáo a) Giải thích ý nghĩa công thức tính thời gian của Timer. Nếu dùng prescaler 16:1 thì

cần chỉnh các thông số nào trong bài thí nghiệm để thời gian không đổi.

Page 46: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 42 Thực hành Vi xử lý

Bài 5 : Kỹ thuật quét ma trận phím

Nội dung: Khảo sát cấu tạo, hoạt động của ma trận phím. Tìm hiểu kỹ thuật lấy dữ liệu từ ma trận phím, chống rung phím nhấn.

Yêu cầu: Viết chương trình lấy dữ liệu từ phím nhấn sau đó hiện thị giá trị của phím nhấn

ra led đơn.

5.1 Kết nối mạch ma trận phím

Ma trận phím gồm 16 phím nhấn kết nối chung 4 hàng và 4 cột. Bốn cột COL1-COL4

nối vào bốn bit thấp của Port D D0-D3. Bốn hàng ROW1-ROW4 nối vào bốn bit cao của Port D D4-D7. Bốn cột được nối với điện trở kéo lên để đảm bảo mức logic 1 khi phím không được nhấn.

ROW1

COL2 COL3 COL4COL1

ROW2

ROW3

ROW4

RD11

RD02

RD33

RD24

RD55

RD46

RD77

RD68

RE19

RE010

GND11

VCC12

CON12A

COL2COL4ROW2ROW4

COL1COL3ROW1ROW3

VCC

Page 47: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 43 Thực hành Vi xử lý

Connector mở rộng Port D

5.2 Các bước hiện thực Bước 1. Tạo project mới tên là Key. Ta được hình sau:

Bước 2. Đánh code vào tập tin Key.asm theo dạng "Relocatable". Bước 3. Define các port tương ứng với hàng và cột của ma trận phím để dễ sử dụng sau

này. Dựa vào sơ đồ mạch ta định nghĩa như sau:

Page 48: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 44 Thực hành Vi xử lý

#define COLUMN_1 PORTD, 0 #define COLUMN_2 PORTD, 1 #define COLUMN_3 PORTD, 2 #define COLUMN_4 PORTD, 3 #define ROW_1 PORTD, 4 #define ROW_2 PORTD, 5 #define ROW_3 PORTD, 6 #define ROW_4 PORTD, 7

Bước 4. Khởi tạo input và output cho các port tương ứng. Ở đây column là output, còn

row là input. Portb dùng để hiển thị led đơn cũng được cấu hình là output. INIT_IO ;assigning PORTB is a digital output MOVLW 0x0F MOVWF ADCON1 ; setup portb for outputs CLRF TRISB CLRF PORTB MOVLW 0x0F MOVWF TRISD MOVLW 0xFF MOVWF PORTD RETURN

Bước 5. Khởi tạo timer, phần này chúng ta đã học từ chương 4, ta có thể có một hàm khởi tạo timer đơn giản như sau:

INIT_TIMER0 BSF RCON,IPEN ;enable priority interrupts. BSF INTCON2,TMR0IP BSF INTCON,TMR0IF BSF INTCON,TMR0IE BSF INTCON,GIEH BSF INTCON,GIEL CLRF T0CON MOVLW 0x3c MOVWF TMR0H MOVLW 0xAF MOVWF TMR0L BSF T0CON,TMR0ON RETURN

Bước 6. Viết hàm Get_key với 2 đối số. Đối số thứ nhất có tên là temp_wr, chính là giá trị output tương ứng với các cột của ma trận phím, đối số thứ 2 có tến là col chính là giá trị bắt đầu của mỗi cột. Ví dụ cột 1 thì giá trị đó bằng 0, cột 2 thì giá trị đó bằng 1, cột 3 thì giá trị đó bằng 2 và cột 4 thì giá trị đó bằng 3.

GET_KEY BTFSS temp_wr, 0

Page 49: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 45 Thực hành Vi xử lý

BCF COLUMN_1 BTFSS temp_wr, 0 BSF COLUMN_1 BTFSS temp_wr, 1 BCF COLUMN_2 BTFSS temp_wr, 1 BSF COLUMN_2 BTFSS temp_wr, 2 BCF COLUMN_3 BTFSS temp_wr, 2 BSF COLUMN_3 BTFSS temp_wr, 3 BCF COLUMN_4 BTFSS temp_wr, 3 BSF COLUMN_4 BTFSC PORTD,4 ;BIT TEST F, SKIP IF SET GOTO NEXT_BUTTON_1 MOVLW .0 MOVWF KeyReg1 GOTO EXIT_GET_KEY NEXT_BUTTON_1 BTFSC PORTD,5 ;BIT TEST F, SKIP IF SET GOTO NEXT_BUTTON_2 MOVLW .4 MOVWF KeyReg1 GOTO EXIT_GET_KEY NEXT_BUTTON_2 BTFSC PORTD,6 ;BIT TEST F, SKIP IF SET GOTO NEXT_BUTTON_3 MOVLW .8 MOVWF KeyReg1 GOTO EXIT_GET_KEY NEXT_BUTTON_3 BTFSC PORTD,7 ;BIT TEST F, SKIP IF SET GOTO NEXT_BUTTON_2 MOVLW .12 MOVWF KeyReg1 EXIT_GET_KEY MOVFF COL,W ADDWF KeyReg1,d RETURN

Bước 7. Dựa vào hàm Get_key ở trên ta có thể hoàn thiện hàm Scan_button một cách dễ dàng. Ở đây ta nhắc lại cách mà sử lý phím để nhận dữ liệu ngược trở về là tại

Page 50: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 46 Thực hành Vi xử lý

một thời điểm chỉ cho một cột được tích cực (ở đây là mức 0) sau đó đọc ngược giá trị từ các hàng. Hàng 1 tương ứng với cột 1 là số 0, tương tự hàng 2 với cột 1 là số 4…

Khi nhấn phím thì sẽ có hiện tượng rung phím, để giải quyết trường hợp này ta có một cách giải quyết ở đây là đọc dữ liệu 3 lần liên tiếp mỗi lần cách nhau 10ms, sau đó so sánh 3 giá trị đọc được. Nếu 3 giá trị bằng nhau thì ta xem như có một nút nhấn được nhấn. Trong hàm Scan_button ta dùng 3 biến KeyReg1, KeyReg2 và KeyReg3 để lưu giá trị của 3 lần đọc dữ liệu liên tiếp, khi kiểm tra 3 biến này có giá trị bằng nhau thì ta sẽ lưu vào biến KeyReg và xuất dữ liệu ra PORTB.

Scan_button MOVFF KeyReg2,KeyReg3 MOVFF KeyReg1,KeyReg2 MOVLW 0x0E MOVWF temp_wr MOVLW .0 MOVWF COL CALL GET_KEY MOVLW 0x0D MOVWF temp_wr MOVLW .1 MOVWF COL CALL GET_KEY MOVLW 0x0B MOVWF temp_wr MOVLW .2 MOVWF COL CALL GET_KEY MOVLW 0x07 MOVWF temp_wr MOVLW .3 MOVWF COL CALL GET_KEY MOVFF KeyReg1,W CPFSEQ KeyReg2 GOTO EXIT_SCAN_BUTTON CPFSEQ KeyReg3 GOTO EXIT_SCAN_BUTTON MOVFF KeyReg,W CPFSEQ KeyReg1 GOTO Scan_button1

Page 51: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 47 Thực hành Vi xử lý

GOTO EXIT_SCAN_BUTTON Scan_button1 MOVFF KeyReg1,KeyReg CALL Button_process EXIT_SCAN_BUTTON RETURN

Bước 8. Như giải thuật trên nói là cứ mỗi 10ms thì ta đọc dữ liệu một lần, để cho điều này được thực hiện dễ dàng thì ta phải dùng đến interrupt timer. Ta khởi tạo một interrupt timer cứ sau 10ms thì interrupt một lần. Để làm được điều này các bạn có thể xem lại chương timer để có thể làm việc một cách dễ dàng.

Ở đây chỉ giới thiệu cho các bạn là hàm Timer0_routine, hàm này được gọi trong interrupt timer và trong hàm này ta gọi hàm Scan_button ở trên.

TIMER0_ROUTINE BCF INTCON,TMR0IF BCF T0CON,TMR0ON MOVLW 0x3c MOVWF TMR0H MOVLW 0xaf MOVWF TMR0L BSF T0CON,TMR0ON CALL SCAN_BUTTON RETURN

5.3 Bài tập a) Cải tiến hàm chống rung phím, khi nhấn đè 1 phím thì phải sau 1 thời gian

TimeOutForKey thì mới tích cực phím nhấn đó. b) Viết ứng dụng đồng hồ casio đơn giản (hiển thị giờ, ngày, cho phép chỉnh sửa

ngày giờ) sử dụng ma trận phím và LCD.

Page 52: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 48 Thực hành Vi xử lý

Bài 6 : Kỹ thuật quét LED

Nội dung: Khảo sát cấu tạo, hoạt động của LED 7 đoạn, LED ma trận. Tìm hiểu kỹ thuật quét LED 7 đoạn và LED ma trận.

Yêu cầu: Viết chương trình cho phép hiển thị giá trị ra led 7 đoạn và led ma trận.

6.1 Cấu tạo LED 7 đoạn và LED ma trậ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.

LED 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 chung Cathode.

Common Anode

Common Cathode

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

Page 53: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 49 Thực hành Vi xử lý

Các LED trên cùng một hàng nối chung Anode, các LED cùng loại trên cùng một cột nối chung Cathode.

Page 54: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 50 Thực hành Vi xử lý

6.2 Kết nối mạch

Row

.5

Red

.5

Gre

en.5

Red

.6

Gre

en.1

Gre

en.6

Gre

en.7

Row

.6

Gre

en.8

Row

.7

Red

.7

Red

.1

Row

.8

Red

.8

Gre

en.2

Row

.1

Row

.2

GR

124

RD

123

RW

1

22

GR

2

21

RD

2

20

RW

2

19

GR

3

18

RD

3

17G

R5

1

RD

5

2

RW

5

3

GR

6

4

RD

6

5

RW

6

6

GR

7

7

RD

7

8

RW

7

9

GR

8

10

RW

3

16

GR

4

15

RD

4

14

RW

4

13

RD

8

11

RW

8

12

ML1LED 8x8x2R

ed.3

Gre

en.3

Red

.4

Gre

en.4

Row

.3

Row

.4

ENABLE_LED3

C

E

Ge

1 d2

g10

c4

dot5

b6 a7

f9

Vcc

3

Vcc

8

8.

LED3

led7

F

BA

ENABLE_LED4

DC

E

Ge

1 d2

g10

c4

dot5

b6 a7

f9

Vcc

3

Vcc

8

8.

LED4

led7

F

BA

DOT

D

G

ENABLE_LED1

DOT

Ee

1 d2

g10

c4

dot5

b6 a7

f9

Vcc

3

Vcc

8

8.

LED1

led7

A

C

F

B

DOT

D

DOT

E

G

ENABLE_LED2

e1 d2

g10

c4

dot5

b6 a7

f9

Vcc

3

Vcc

8

8.

LED2

led7

A

CD

F

B

Red

.2

Mạch LED mở rộng gồm có 4 LED 7 đoạn và 1 LED ma trận hai màu xanh đỏ. Mạch được nối vào một phần của Port PICtail. Dữ liệu được dịch nối tiếp và được cài bởi IC 74HC595, TPIC6595. Module SPI của PIC đảm nhận việc dịch dữ liệu nối tiếp thông qua chân dữ liệu SDO và chân clock dịch SCK. Sau khi dịch đủ 4 byte, tín hiệu LATCH chuyển từ mức 0 lên mức 1 sẽ đẩy dữ liệu của 4 byte tạm ra 4 byte ngõ ra QA-QH tương ứng. Tín hiệu CLR_DISP tích cực mức 0 không cho phép hiển thị.

Page 55: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 51 Thực hành Vi xử lý

SCK

SDO

VCC

VCC

VCC

R5330R6330

Red.1

R7330R8330

R1330

Red.4Red.3Red.2

Red.6Red.5

Red.8Red.7

R2330R3330R4330

Row.2 ENABLE_LED2Row.1 ENABLE_LED1

COM10

V+

9

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT217

OUT316

OUT415

OUT514

OUT613

OUT712

OUT811

U3

UDN2981

Row.6Row.5

Row.3 ENABLE_LED3

Row.8Row.7

Row.4 ENABLE_LED4

R13100R14100R15100

Green.1

R16100

Green.3Green.2

R9100

Green.6Green.5Green.4

Green.8Green.7

R10100R11100R12100

LATCHCLR_DISP

R21330R22330

A

R23330

B

R24330

C

R17330

ED

DOTGF

R18330R19330R20330

SDI3

SRCLR8

G9

RCLK12

SRCLK13

SDO18

DRAIN04

DRAIN15

DRAIN26

DRAIN37

DRAIN414

DRAIN515

DRAIN616

DRAIN717

U3 TPIC6595

VCC

SDO

VCC

LATCHSCK

LATCH

SDO9

CLR10

G13

SDI14

SRCLK11 RCLK12

QA15

QB1

QC2

QD3

QE4

QF5

QG6

QH7

U4 74HC595

CLR_DISP

SCK

LATCH

CLR_DISP

SCK

CLR_DISP

SCKLATCH

SDI3

SRCLR8

G9

RCLK12

SRCLK13

SDO18

DRAIN04

DRAIN15

DRAIN26

DRAIN37

DRAIN414

DRAIN515

DRAIN616

DRAIN717

U1 TPIC6595

SDI3

SRCLR8

G9

RCLK12

SRCLK13

SDO18

DRAIN04

DRAIN15

DRAIN26

DRAIN37

DRAIN414

DRAIN515

DRAIN616

DRAIN717

U2 TPIC6595

VCC

GND1 +5V2 RC23 RC14 RC05 RA26 RA17 RA08 RC39 RC4

10 RC511 RA312

PICtail

CON12

6.3 Các thanh ghi liên quan và cách điều khiển

- Thanh ghi trạng thái SSPSTAT:

Page 56: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 52 Thực hành Vi xử lý

- Thanh ghi điều khiển SSPCON1:

- Sơ đồ khối module Synchronous Serial Port:

Với sơ đồ mạch trên, mỗi lần có một hàng LED ở LED ma trận hay một con LED 7 đoạn hiển thị dữ liệu. Lợi dụng hiện tượng lưu ảnh của mắt, dữ liệu của mỗi hàng LED ma trận hay mỗi con LED 7 đoạn được xuất ra tuần tự hàng (con) này đến hàng (con) khác, chúng ta sẽ thấy được hình ảnh của cả màn hình ma trận LED hay của cả 4 con LED 7 đoạn.

Khi tất cả các hàng LED ma trận và tấc cả các con LED 7 đoạn đã được hiển thị (quét) qua một lần, ta nói đã hiển thị một frame. Để mắt không cảm thấy hình ảnh bị rung thì số lần hiển thị frame trong một giây phải lớn hơn 24 lần (thường là 30 lần).

Đầu tiên tín hiệu CLR_DISP tích cực (mức 0) không cho LED hiển thị, sau đó dịch bốn byte dữ liệu, tín hiệu LATCH chuyển từ mức 0 lên mức 1 đưa dữ liệu mong muốn sẵn sàn ở ngõ ra, cuối cùng đưa tín hiệu CLR_DISP lên mức 1 cho phép LED hiển thị dữ liệu mong muốn. Cứ như vậy lặp lại chu trình này.

Page 57: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 53 Thực hành Vi xử lý

Bốn byte dữ liệu được dịch ra mỗi lần có ý nghĩa tương ứng là dữ liệu của một hàng LED đỏ, dữ liệu của một hàng LED xanh, dữ liệu của một con LED 7 đoạn, điều khiển hàng (con) LED nào hiển thị.

Cách điều khiển được minh họa thông qua hình sau :

GREEN LED dataRED LED data

00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Control

1 0 0 0 0 0 0 0

7SEG

00 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0

00 0 1 0 01 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0

00 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0

00 1 0 0 0 01 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0

00 1 0 0 0 01 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0

00 1 0 0 0 01 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0

00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

Control

1 0 0 0 0 0 0 0

GREEN LED data

RED LED data 7SEG

0 0

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

10 0 0 0 0 0 00 0

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

100 0 0 0 0 00 0

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

ab

gc

f

ed p

10 00 0 0 0 00 0

Giá trị của byte “control” chỉ chứa nhiều nhất một bit 1. Như hình vẽ, cần 12 lần xuất dữ liệu (4 byte) cho 1 frame gồm cả LED ma trận và LED 7 đoạn, 8 lần xuất dữ liệu cho 1 frame gồm chỉ có LED ma trận (không quan tâm nội dung hiển thị LED 7 đoạn), 4 lần

Page 58: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 54 Thực hành Vi xử lý

xuất dữ liệu cho 1 frame gồm chỉ có LED 7 đoạn(không quan tâm nội dung hiển thị LED ma trận).

6.4 Các bước hiện thực. Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Led và chọn

chip 18f4520. Ta được hình sau:

Bước 2. Include file p18f4520.inc vào file Led_matran.asm Bước 3. Khai báo các buffer cần thiết để viết driver cho led. Vì ở đây ta viết driver nên

mọi người khi sử dụng những module này sẽ không sử dụng những hàm mà chúng ta viết trong này chỉ có thể thao tác trên các buffer mà thôi.

GREEN_SCREEN_BUFFER RES .8 RED_SCREEN_BUFFER RES .8 SEVEN_LED_BUFFER RES .8 COLUMN_BUFFER RES .8 INDEX_OF_BUFFER RES .1 RED_DATA RES .1 GREEN_DATA RES .1 SEVEN_LED_DATA RES .1 COLUMN_DATA RES .1

Bước 4. Ngoài ra nhìn vào mạch ta có thể dễ dàng nhận thấy được rằng dữ liệu của

chúng ta được truyền theo kiểu truyền đồng bộ nối tiếp, chính xác hơn ở đây người ta sử dụng chức năng SPI để truyền dữ liệu. Do đó ta phải cấu hình cho chip làm sao có thể hoạt động được ở chế độ SPI này.

INIT_SPI CLRF SSPCON1 ;SET Fspi = f/4 BSF SSPCON1,5 ;ENALBLE SPI MODE BCF TRISC,5 BCF TRISC,3 RETURN

Page 59: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 55 Thực hành Vi xử lý

Trên đây ta mới chỉ khởi tạo module SPI để nó có thể hoạt động nhưng nhìn lại sơ đồ mạch ta lại thấy có thêm vài kết nối nữa từ vi điều khiển ra IC74595. Để IC này hoạt động được thì ta cần thêm một chân tạo clock để có thể chuyển dữ liệu nối tiếp ra song song của IC này. Ta define thêm cho chân Latch của IC 74595.

#define LATCH_DIR TRISA,1 #define LATCH_DATA PORTA,1 Đồng thời khởi tạo các PORT liên quan:

INIT MOVLW 0x0F MOVWF ADCON1 BCF LATCH_DIR BCF LATCH_DATA CLRF INDEX_OF_BUFFER RETURN

Bước 5. Ngoài ra để thực hiện được bài này không thể nào thiếu timer được, vì để hiển thị ra led ma trận ta phải quét từng cột led trên ma trận led.

Khi nhìn vào cấu tạo của ma trận led ta thấy để hiện thị được một hình gì đó trên ma trận led thì ta phải quét led, vì tại một thời điểm chỉ có thể hiển thị một cột led mà thôi. Nhờ vào hiện tượng lưu ảnh ở mắt mà khi quét với tần số cao thì mắt ta sẽ thấy như là cột đó sáng chứ không phải chớp nháy nữa.

Vậy làm sao biết được ta quét led với tần số bao nhiêu là hợp lý. Như trong phim ảnh khi xem phim thực chất ta biết là nó đang chạy với tần số là 24 hình /s. Ở đây ta cũng giả sử như vậy, cả màn hình của led cũng chớp nháy với tần số là 24 hình/s, mà mỗi hình ta phải quét 8 lần vì có 8 cột. Từ đó ta có thể suy ra tần số ta cần phải quét cho mỗi cột là 8x24 lần/s. Từ đây ta có thể dễ dàng tính được timer của chúng ta cần bao nhiêu để có thể quét led được một cách dễ dàng.

INIT_TIMER0 BSF RCON,IPEN ;enable priority interrupts. BSF INTCON2,TMR0IP BSF INTCON,TMR0IF BSF INTCON,TMR0IE BSF INTCON,GIEH BSF INTCON,GIEL CLRF T0CON MOVLW 0x3c MOVWF TMR0H MOVLW 0xAF MOVWF TMR0L BSF T0CON,TMR0ON RETURN

Bước 6. Ban đầu ta khởi tạo các buffer để hiển thị cũng như quét cột led. Để dễ dàng trong việc sử lý ta sẽ khởi tạo cho Column_Buffer các giá trị tương ứng làm sao, khi xuất ra nó chỉ tích cực một cột của led mà thôi. Ở đây giả sử tích cực tại mỗi cột là tích cực mức cao thì ta có thể khởi tạo cho Column_buffer các giá trị sau: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80.

Page 60: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 56 Thực hành Vi xử lý

Bước 7. Đến đây mọi sử chuẩn bị đã xong, ta có thể bắt đầu viết hàm để hiển thị dữ liệu ra led. Đầu tiên ta sẽ viết một macro SPI_transmit với đối số sẽ là giá trị byte sẽ được truyền nối tiếp ra ngoài.

SPI_TRANSMIT MACRO TEMP_DATA ;Has data been received (transmit complete)? BTFSS SSPSTAT, BF GOTO $-2 ;No MOVF TEMP_DATA, W ;W reg = contents of TXDATA MOVWF SSPBUF ENDM

Bước 8. Tiếp theo là làm sao lấy dữ liệu từ các buffer để đưa vào các biến tương ứng xuất ra led. Ta viết thêm một Macro nữa gồm 2 đối số là buffer và temp_data. Macro này sẽ làm nhiệm vụ là lấy dữ liệu tại vị trí (được lưu trong biến index_of_buffer) của buffer lưu vào temp_data.

UPDATE_DATA MACRO BUFFER,TEMP_DATA MOVLW HIGH BUFFER MOVWF FSR0H MOVLW LOW BUFFER MOVWF FSR0L MOVFF INDEX_OF_BUFFER,W ADDWF FSR0L,F CLRF W ADDWFC FSR0H MOVFF INDF0,TEMP_DATA ENDM

Bước 9. Như trên đã giới thiệu để xuất dữ liệu ra led, ngoài việc dùng module SPI để xuất dữ liệu ta cần phải có thêm một tín hiệu clock tác động lên IC74595 thì dữ liệu nối tiếp của ta mới chuyển qua song song và hiển thị ra led. Do đó ta phải viết thêm một hàm tạo clock trên chân đã define khi nãy là Latch_data.

CLOCK_STORAGE BSF LATCH_DATA NOP NOP BCF LATCH_DATA NOP NOP BSF LATCH_DATA RETURN

Bước 10. Cuối cùng là hàm quan trọng nhất, hàm này được gọi trong timer để thực hiện việc quét led.

DISPLAY CALL INCREASING_INDEX UPDATE_DATA RED_SCREEN_BUFFER,RED_DATA UPDATE_DATA GREEN_SCREEN_BUFFER,GREEN_DATA

Page 61: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 57 Thực hành Vi xử lý

UPDATE_DATA SEVEN_LED_BUFFER,SEVEN_LED_DATA UPDATE_DATA COLUMN_BUFFER,COLUMN_DATA SPI_TRANSMIT RED_DATA SPI_TRANSMIT GREEN_DATA SPI_TRANSMIT SEVEN_LED_DATA SPI_TRANSMIT COLUMN_DATA CALL CLOCK_STORAGE RETURN

6.5 Bài tập a) Xây dựng ứng dụng cho phép số “1234” chạy qua các led 7 đoạn. b) Xây dựng ứng dụng cho phép 1 dòng chữ chạy qua led ma trận.

Page 62: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 58 Thực hành Vi xử lý

Bài 7 : Khảo sát bộ truyền nhận nối tiếp

Nội dung: Khảo sát cổng COM máy PC, các thông số truyền nối tiếp. Khảo sát bộ truyền nối tiếp của PIC. Tìm hiểu cách sử dụng chương trình Hyper Terminal truyền nhận nối tiếp trên

máy PC. Yêu cầu:

Viết chương trình giao tiếp giữa máy tính và vi điều khiển PIC.

7.1 Các bước hiện thực. Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Uart và

chọn chip 18f4520. Ta được hình sau:

Bước 2. Include file p18f4520.inc vào file uart.asm Bước 3. Khởi tạo PortB là output, PORTC.6 là output, PORTC.7 là input.

INIT_PORT CLRF LATB ; Clear PORTB output latches CLRF TRISB ; Config PORTB as all outputs BCF TRISC,6 ; Make RC6 an output

Page 63: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 59 Thực hành Vi xử lý

BSF TRISC,7 RETURN

Bước 4. Khởi tạo các vector ngắt org 00000h ; Reset Vector goto Start org 00008h ; Interrupt vector goto IntVector Start GOTO $ IntVector RETFIE

Bước 5. Khởi tạo cho ngắt UART, tốc độ 9600baud tại tần số 4Mhz.

INIT_UART MOVLW 19h ; 9600 baud @4MHz MOVWF SPBRG BSF TXSTA,TXEN ; Enable transmit BSF TXSTA,BRGH ; Select high baud rate BSF RCSTA,SPEN ; Enable Serial Port BSF RCSTA,CREN ; Enable continuous reception BCF PIR1,RCIF ; Clear RCIF Interrupt Flag BSF PIE1,RCIE ; Set RCIE Interrupt Enable BSF INTCON,PEIE ; Enable peripheral interrupts BSF INTCON,GIE ; Enable global interrupts RETURN

Bước 6. Viết chương trình trong ngắt thực hiện nhiệm vụ nhận một dữ liệu từ máy tính truyền xuống sau đó gởi lại kí tự đó cho máy tình nhận lại.

IntVector btfss PIR1,RCIF ; Did USART cause interrupt? goto ISREnd ; No, some other interrupt movlw 06h ; Mask out unwanted bits andwf RCSTA,W ; Check for errors

Page 64: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 60 Thực hành Vi xử lý

btfss STATUS,Z ; Was either error status bit set? goto RcvError ; Found error, flag it movf RCREG,W ; Get input data movwf LATB ; Display on LEDs movwf TXREG ; Echo character back goto ISREnd ; go to end of ISR, restore context, return RcvError bcf RCSTA,CREN ; Clear receiver status bsf RCSTA,CREN movlw 0FFh ; Light all LEDs movwf PORTB goto ISREnd ; go to end of ISR, restore context, return ISREnd retfie

7.2 Chương trình mẫu ;=====================================; ; Name: uart.asm ; Project: Viết chương trình giao tiếp giữa máy tính và vi điều khiển PIC. ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 8 - 8 - 2009 ;======================================; list p=18F4520 ; set processor type include <P18f4520.INC> ;************************************************************ ; Reset and Interrupt Vectors org 00000h ; Reset Vector goto Start org 00008h ; Interrupt vector goto IntVector ;************************************************************ ; Program begins here

Page 65: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 61 Thực hành Vi xử lý

org 00020h ; Beginning of program EPROM Start CALL INIT_PORT CALL INIT_UART Main goto Main ; loop to self doing nothing INIT_PORT clrf LATB ; Clear PORTB output latches clrf TRISB ; Config PORTB as all outputs bcf TRISC,6 ; Make RC6 an output bsf TRISC,7 ; Make RC7 an input RETURN INIT_UART movlw 19h ; 9600 baud @4MHz movwf SPBRG bsf TXSTA,TXEN ; Enable transmit bsf TXSTA,BRGH ; Select high baud rate bsf RCSTA,SPEN ; Enable Serial Port bsf RCSTA,CREN ; Enable continuous reception bcf PIR1,RCIF ; Clear RCIF Interrupt Flag bsf PIE1,RCIE ; Set RCIE Interrupt Enable bsf INTCON,PEIE ; Enable peripheral interrupts bsf INTCON,GIE ; Enable global interrupts RETURN ;************************************************************ ; Interrupt Service Routine IntVector btfss PIR1,RCIF ; Did USART cause interrupt? goto ISREnd ; No, some other interrupt movlw 06h ; Mask out unwanted bits andwf RCSTA,W ; Check for errors btfss STATUS,Z ; Was either error status bit set?

Page 66: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 62 Thực hành Vi xử lý

goto RcvError ; Found error, flag it movf RCREG,W ; Get input data movwf LATB ; Display on LEDs movwf TXREG ; Echo character back goto ISREnd ; go to end of ISR, restore context, return RcvError bcf RCSTA,CREN ; Clear receiver status bsf RCSTA,CREN movlw 0FFh ; Light all LEDs movwf PORTB goto ISREnd ; go to end of ISR, restore context, return ISREnd retfie end

7.3 Bài tập a) Viết chương trình trên PC, gửi 1 chuỗi string xuống board, dòng chữ này sẽ chạy

qua led ma trận hoặc LCD. b) Khi nhấn 1 phím trên board nhấn, sẽ gửi 1 chuỗi string lên PC qua cổng COM,

viết chương trình trên PC nhận chuỗi string này và in ra giao diện.

Page 67: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 63 Thực hành Vi xử lý

Bài 8 : Khảo sát khối chuyển đổi A-D

Nội dung: Khảo sát hoạt động khối chuyển đổi A-D. Khảo sát các thanh ghi điều khiển hoạt động khối chuyển đổi A-D.

Yêu cầu: Viết chương trình đọc và hiển thị giá trị điện áp thay đổi bởi biến trở.

8.1 Các bước hiện thực Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là a2d và chọn

chip 18f4520. Ta được hình sau:

Bước 2. Include file p18f4520.inc vào file a2d.asm Bước 3. Khởi tạo module ADC để ta có thể sử dụng một cách dễ dàng.

InitializeAD Movlw B'00000100' ; Make RA0,RA1,RA4 analog inputs movwf ADCON1 movlw B'11000001' ; Select RC osc, AN0 selected, movwf ADCON0 ; A/D enabled movlw 0x01 movwf ADCON2 call SetupDelay ; delay for 15 instruction cycles bsf ADCON0,GO ; Start first A/D conversion return

Page 68: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 64 Thực hành Vi xử lý

Để khởi tạo được module ADC ta chỉ cần quan tâm chủ yếu tới các thanh ghi ADCCON1, ADCCON0, ADCON2. Như chương trình khởi tạo trên ta thấy đầu tiên phải cấu hình cho các pin tương ứng phải là chân AN0, mặc định của các chân này có chức năng là Input/Output digital. Sau đó ta phải chọn kênh ADC tương ứng, ở đây ta sử dụng kênh AD0. Và một điểm quan trọng nữa chính là bit GO trong thanh ghi ADCON0, khi bít này được bật lên thì module AD mới bắt đầu chuyển đổi tín hiệu. Bước 4. Tiếp theo là hàm đọc giá trị ADC:

Update_adc bsf ADCON0,GO ;start conversion btfsc ADCON0,GO bra $-2 movf ADRESH,W return Sau khi chuyển đổi tín hiệu A-D, giá trị số sẽ được lưu vào thanh ghi ADRESH. Đến

đây tùy vào ứng dụng cụ thể mà ta có thể biến đổi giá trị này tùy theo yêu cầu mà ta mong muốn.

8.2 Bài tập a) Tích hợp module LCD, lấy giá trị điện thế từ biến trở hiển thị lên LCD. b) Sử dụng module ADC của Pic để đo nhiệt độ trong phòng, dùng LCD để hiển thị

giá trị nhiệt độ.

Page 69: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 65 Thực hành Vi xử lý

Bài 9 : Khảo sát các khối chức năng đặc biệt khác

Nội dung: Khảo sát khối chức năng WDT. Khảo sát khối chức năng PWM . Khảo sát các chế độ hoạt động của vi điều khiển.

Yêu cầu: Viết chương trình sử dụng chức năng WDT. Viết chương trình sử dụng chức năng PWM điều khiển độ sáng của LED. Viết chương trình sử dụng chức năng Power control.

9.1 Các bước hiện thực PWM Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là pwm và

chọn chip 18f4520. Ta được hình sau:

Bước 2. Include file p18f4520.inc vào file pwm.asm. Bước 3. Tích hợp module LCD vào project pwm, tham khảo bài tập về LCD. Bước 4. Khởi tạo module PWM để ta có thể sử dụng một cách dễ dàng.

Init_pwm ;configure CCP1 module for buzzer bcf TRISC,2 movlw 0x80 movwf PR2 ;initialize PWM period

Page 70: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 66 Thực hành Vi xử lý

movlw 0x80 ;initialize PWM duty cycle movwf CCPR1L bcf CCP1CON,CCP1X bcf CCP1CON,CCP1Y ;postscale 1:1, prescaler 4, Timer2 ON movlw 0x05 movwf T2CON movlw 0x0F ;turn buzzer on movwf CCP1CON return

Để khởi tạo chức năng pwm, đầu tiên ta phải cấu hình cho PORTC2 là output. Tiếp

theo khởi tạo chu kì của PWM thông qua việc cấu hình thanh ghi PR2. Sau đó ta khởi tạo duty cycle của xung pwm bằng cách cấu hình thanh ghi CCPR1L.

9.2 Chương trình mẫu ;=====================================; ; Name: pwm.asm ; Project: Su dung Pwm de xuat am thanh ra loa. ; Author: BKIT HARDWARE CLUB ; Homepage: http://www.bkit4u.com/forum ; Creation Date: 20 - 8 - 2009 ;======================================; list p=18f4520 #include "p18f4520.inc" ; vectors org 0x000000 ; reset vector bra START ;************************************************************ ; program START call Init_pwm goto $ Init_pwm bcf TRISC,2

Page 71: Thi Nghiem Vi Xu Ly - Vi Dieu Khien

Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT

Bộ môn Kỹ Thuật Máy Tính 67 Thực hành Vi xử lý

movlw .249 movwf PR2 ;initialize PWM period movlw .125 ;initialize PWM duty cycle movwf CCPR1L bcf CCP1CON,CCP1X bcf CCP1CON,CCP1Y ;postscale 1:1, prescaler 4, Timer2 ON movlw 0x05 movwf T2CON movlw 0x0F ;turn buzzer on movwf CCP1CON return END

9.3 Bài tập a) Tìm hiểu và hiện thực chương trình điều khiển RC Servo.