Bài giảng Vi xử lý - Phần 1

4. Viết chương trình đèn chạy đuổi (8 led) dung PORTB điều khiển 8 led. 5. Viết chương trình đèn sang dần (8 led) dung portB điều khiển 8 led. 6. Viết chương trình đèn tắt dần (8 led) dung portB điều khiển 8 led. 7. Viết chương trình đèn chạy 2 bìa vào ra (8 led) dung portB điều khiển 8 led. 8. Viết chương trình tạo sóng vuông có tần số 100Khz ở chân RB0 dùng các lệnh BSF, BCF, NOP và GOTO (không dung timer 0). 9. Viết chương trình tạo thời gian trễ 1 giây dung TMR0

pdf99 trang | Chia sẻ: truongthinh92 | Lượt xem: 2006 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Vi xử lý - Phần 1, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
theå laø 1 nhaõn, 1 ñòa chæ . Leänh RETURN thöôøng khoâng coù toaùn haïng keøm theo, RETLW có trả về số. Khi CPU thöïc hieän leänh call thì ñòa chæ keá tieáp cuûa chöông trình ñöôïc gôûi caát vaøo ngaên xeáp (stack). Neáu khoâng laøm nhö vaäy thì CPU khoâng bieát quay veà ñaâu trong chöông trình chính. Leänh call seõ ñaåy noäi dung ñang hieän dieän trong con troû leänh PC vaøo ngaên xeáp, tieáp theo CPU seõ ñöa ñòa chæ nhôù cuûa chöông trình con vaøo con troû leänh PC. Quaù trình xaûy ra nhö sau : - Leänh call ñöôïc CPU ñoïc vaø giaûi maõ - Con troû leänh ñöôïc taêng leân ñeå chæ vaøo leänh keá tieáp trong chöông trình chính - Tieáp theo noäi dung cuûa con troû leänh ñöôïc ñaåy vaøo trong ngaên xeáp - Ñòa chæ xuaát phaùt cuûa chöông trình con ñöôïc naïp vaøo con troû leänh 63 - Chöông trình con ñöôïc thöïc hieän - Leänh retlw/RETURN laø leänh cuoái trong chöông trình con seõ ñaåy baät ñòa chæ quay veà cuûa chöông trình chính ra khoûi ngaên xeáp - Ñòa chæ quay veà ñöôïc naïp vaøo con troû leänh vaø chöông trình chính ñöôïc tieáp tuïc Ví duï : Call Delay ; goïi chöông trình con delay Ñònh nghóa chöông trình con Delay : Delay: clrf tmr0; bắt đầu timer 0 Loopa movf tmr0,w; đọc tmr0 vào w Sublw .32;time-32 Btfss 3,2; kiểm tra time-32=0 Goto loopa; time không bằng 32 Retlw 0; time là 32 , trở về Chöông trình con weight: Chöông trình traïm caân xe 3 thang ño : hình 3.5 start ñònh nghóa döõ lieäu ñaët max_wt call naïp data_in1 ngaét baùo ñoäng weight call weight call ret baùo ñoäng naïp data_in2 ret call weight call ret naïp data_in3 call weight call jump ret Hình 3.5 IV.Tổng kết bài: -Tóm tắt các ý chính trong bài. -Chuẩn bị bài mới. V. Câu hỏi và bài tập về nhà: Chương 3: Tập lệnh của PIC 16F877A và 16F84 64 1.Chương trình là gì? Nêu đặc điểm của ngôn ngữ máy, hợp ngữ và ngôn ngữ cấp cao. 2. Quá trình biên dịch : cách tạo dự án dung MPLAB. 3. Trình bày các bước (qui trình) xây dựng chương trình. 4. Một lệnh hợp ngữ đầy đủ gồm các bộ phận nào? 5. Phương pháp xác định vị trí của một toán hạng được gọi là gì? 6.Trình bày các phương thức địa chỉ hóa. Cho ví dụ. 7.TẬp lệnh của PIC được chia làm mấy nhóm. Kể tên. 8. Giải thích ý nghĩa của lệnh MOVF 12,W. 9. Chỉ thị EQU dung để làm gì. 10. Cho một thí dụ về ngôn ngữ lập trình máy tính bậc cao. 11. Ngôn ngữ lập trình máy tính bậc cao dung. Để dịch các lệnh ra mã máy. 12. Assember là gì? Phần mềm MPLAB (ở Windows) hay MPASM (ở DOS) dung để làm gì? 13. Nêu các lệnh bit và cho ví dụ. 14. Nêu cá lệnh về byte và cho ví dụ. 15. Nêu các lệnh về điều khiển và số. Cho ví dụ. 16. Viết cương trình cộng 4H vào 3H dùng thanh ghi W, ô nhớ 20H (giữ giá trị 4H) và 21H (giữ giá trị 3H). Nạp kết quả vào địa chỉ nhớ 22H mang nhãn STORE (HD: STORE EQU 22H). 17.Viết chương trình tính 1+2+3+4 dùng lệnh ADDWF và INCF dung thanh ghi W và ô nhớ 20H. Kết quả lưu ở W. 18. Viết chương trình để tính Z=A.B+(not)C trong đó dung ô nhớ 20H cho lưu giá trị A, ô nhớ 21H lưu giá trị B, ô nhớ 22H lưu giá trị C. Lưu kết quả của Z trong vị trí nhớ 23H mang nhãn STORE. 19. Viết chương trình nhân hai số nhị phân 8 bit. Ô nhớ 20H chứa số bị nhân, ô nhớ 21H chứa số nhân. Kết quả tích số 16 bit chứa trong 2 ô nhớ 22H (byte thấp) và 23H (byte cao). 20. Lệnh COMF 12 cho kết quả như thế nào nếu ô nhớ 12 chúa nội dung FFH. 21. Trình bày các chỉ thị assembler. 22. Viết chương trình phát âm thanh báo động khi nhiệt độ của môt tủ lạnh vượt quá 50 độ F. Vẽ lưu đồ đối với chương trình và giải thích chương trình đang làm gì bằng các chú giải. Bảo đảm có cả các chỉ thị assembler cần thiết. 23. Viết chương trình cho bài toán trạm cân xe. 24. Sự khác nhau giữa lệnh và chỉ thị assembler. 25. Định nghĩa chương trình con. 26. Moät coâng taéc DIP 4 bit vaø 1 LED 7 ñoaïn anode chung ñöôïc noái vôùi PIC 16F877A nhö hình veõ. Vieát 1 chöông trình ñoïc lieân tuïc maõ 4 bit töø coâng taéc DIP vaø caäp nhaät caùc led ñeå hieån thò kyù töï hexa thích hôïp. Thí duï, neáu maõ 1100B ñöôïc ñoïc vaøo, kyù töï hexa “C” seõ xuaát hieän. Nhö vaäy, caùc segment (ñoaïn) a ñeán g, töông öùng seõ laø ON, OFF, OFF, ON, ON, ON, vaø OFF . Chuù yù raèng ñaët 1 chaân port pic 16f877a leân “1” laøm LED töông öùng “ON”. (xem hình veõ) 65 PIC 16F877A 74LS244 LED 7 ñoaïn +5V a b c d e f g h 8x220 ohm Hình : Giao tieáp vôùi coâng taéc DIP vaø LED 7 ñoaïn 27.Thiết kế một mạch mà đếm và hiển thị trên led 7 đoạn (loại catốt chung), số lần một nút nhấn được ấn tới 10. Mã nhị phân để lái led 7 đoạn như sau: Số PORTB B7 B6 B5 B4 B3 B2 B1 B0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 2 0 0 1 1 1 0 1 1 3 0 1 1 0 1 0 1 1 4 0 1 0 0 1 1 0 1 5 0 1 1 0 1 1 1 0 6 0 1 1 1 1 1 0 0 7 0 1 0 0 0 0 1 1 8 0 1 1 1 1 1 1 1 9 0 1 0 0 1 1 1 1 Xét mạch điện như sau: Hình: Sơ đồ mạch của điều khiển led 7 đoạn. RA0 RB0 RA1 RB1 RA2 RB2 RA3 RB3 RB4 RB5 RB6 RB7 A F b G E c D 66 Mở rộng chương trình cho PIC 16F877A. 28.Haõy vieát chöông trình ngoân ngöõ assembly ñeå thöïc hieän chöùc naêng logic trong 8 laàn X0 Y0 W0 Z0 . . . x7 y7 z7 W0 với X=x7..x0 Y=y7..y0 Z=z7..z0 W=w7..w0 29.Vieát caùc chöông trình ñeå thöïc hieän caùc pheùp toaùn logic chæ ôû hình : RB0 RB4 RB1 RB5 RB7 RC7 RB6 RB7 Hình : Caùc vaán ñeà laäp trình coång logic: (a) NOR 3 ngoõ vaøo (b) NAND 8 ngoõ vaøo 30. Viết chương trình xóa 20 ô nhớ RAM nội có địa chỉ bắt đầu là 30H. 31.Neâu boán leänh chuyeån döõ lieäu vaø cho ví dụ ñoái vôùi moãi loaïi 32.Neâu moät ví duï veà vieäc söû duïng leänh soá hoïc a. mode ñòa chæ gián tiếp b.mode ñòa chæ trực tiếp c.mode ñòa chæ töùc thôøi 67 68 Bài giảng số 4: Vào ra. Bộ định thời. Lập trình vi điều khiển PIC ( Số tiết: 5) I.Ổn định lớp: . II.Kiểm tra bài cũ: .. .. .. III.Tên bài giảng: : Vào ra. Định thời. Lập trình vi điều khiển PIC. III.1. Mục tiêu: -Vào ra của vi điều khiển(I/O) - Định thời với vi điều khiển:timer 0, timer 1, và timer 2 -Lập trình vi điều khiển: nhập dữ liệu, tiêu đề cho 16F84 và 16F877A,thí dụ chương trình, lưu và biên dịch chương trình: giới thiệu phần mềm MPLAB, mạch nạp vi điều khiển PIC và chương trình WinPIC800, lưu đồ lập trình, và bài toán: chớp tắt hai led đơn, tập tin tiêu đề cho PIC 16F877A III.2. Đồ dung và phương tiện dạy học: -Phấn trắng, bảng, khăn, bút long, micro có dây(hay không dây), máy tính, và đèn chiếu (hay máy chiếu). III.3. Giáo trình và tài liệu tham khảo: Giáo trình Vi xử lí của trường Đại học công nghiệp Tp. HCM. D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006. Trương Trác, Chip đơn 16C84 và ứng dụng của chúng. Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003. Tài liệu về vi điều khiển PIC của bọ môn Điện tử công nghiệp. Datasheet c ủa PIC 16F84 v à 16F877A. Website: Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition, Tab Electronics, McGrawHill, 2008(Ebook). Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd ed., Macmillan/McGraw-Hill, 1992. III.4.Nội dung bài giảng: Nội dung chi tiết : xem bài giảng chi tiết. Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh viên. Chương 4: Vào ra. Định thời. Lập trình vi điều khiển PIC. 4.1. Vào/ra của vi điều khiển: Vi điều khiển là một chip rất linh hoạt và có thể được lập trình để hoạt động trong một số cấu hình khác nhau. 16F84 có 13 thiết bị I/O, mà nghĩa là nó có 13 ngõ vào và ngõ ra. I/O có thể được cấu hình trong bất kì kết hợp nào, nghĩa là 1 ngõ vào 12 ngõ ra, 6 ngõ vào 7 ngõ ra, 13 ngõ ra tùy thuộc vào ứng dụng của bạn. Những I/O này được nối với hế giới bên ngoài thông qua thanh ghi được gọi là port. 16F84 có 2 port, PORTA và PORTB. PortA là port 5 bit, nó có 5 đường I/O và port B có 8 I/O. 16F877A có 33 thiết bị I/O. 16F877A có 5 port port A là port 6 bit nó có 6 đường I/O, port B có 8 I/O, port C có 8 I/O, port D có 8 I/O, và port E có 3 I/O. 4.1.1.PortA và thanh ghi TRISA 69 PortA là port 2 chiều , 6 bit. Thanh ghi định hướng dữ liệu tương ứng và TRISA. Bật bit TRISA (=1) sẽ làm cho các chân portA tương ứng là ngõ vào (input)( nghĩa là đặt bộ điều khiển (driver) ngõ tương ứng trong chế độ tổng trở cao Hi-Z). Xóa bit TRISA (=0) sẽ làm cho chân portA tương ứng là ngõ ra (output) (nghĩa là đặt nội dung của mạch cài ngõ ra trên chân được chọn). Việc đọc thanh ghi portA là đọc trạng thái của các chân, trong khi ghi ra nó sẽ ghi ra mạch cài port. Tất cả tác vụ ghi là tác vụ đọc -hiệu chỉnh ghi. Vì thế, một sự ghi ra port ám chỉ rằng chân port là đọc, giá trị được hiệu chỉnh và sau đó được ghi ra mạch cài dữ liệu port. Chân RA4 được hợp kênh với ngõ vào clock môđun timer 0 để trở thành chân RA4/T0CKI. Chân RA 4/T0CKI là ngõ vào Smith-trigơ (Schmitt-trigger) và ngõa ra cưc mán để hở. Tất cả chân khác của port A có mức TTL và bộ lái ngõ ra CMOS đầyđủ. Chân khác của portA là hợp kênh với ngõ vào analog và ngõ vào Vref analog cho cả bộ chuyển đổi A/D (tương tự-số) và bộ so sánh. Tác vụ của mỗi chân được chọn bởi xóa/bật bit điều khiển phù hợp trong thanh ghi ADCON1 và CMCON. Chú ý: Khi power on reset, các chân này được cấu hình như ngõ vào analog và đọc là’0’. Bộ so sánh là ở off (tắt) (trạng thái). Thanh ghi TRISA điều khiển hướng của cácchân port thậm chí khi chúng được dùng là ngõ vào analog. Người sử dụng phải đảm bảo các bit trong thanh ghi TRISA là bảo trì (giữ nguyên) khi dùng chúng như là ngõ vào analog. Thí dụ: khởi động portA BCF STATUS,RP0; BCF STATUS,RP1; bank 0 CLRF PORTA; khởi động PORTA bằng cách xóa mạch cài dữ liệu ngõ ra BSF STATUS,RP0 ; chọn bank 1 MOVLW 0x06; cấu hình tất cả các chân như là ngõ vào số MOVWF ADCON1 MOVLW 0xCF; giá trị được dùng hởi động hướng dữ liệu MOVWF TRISA; bật RA như là ngõ vào, RA như là ngõ ra ; RA luôn đọc là 0. 5.1.2. PORTB và thanh ghi TRISB PortB là port 2 chiều, 8 bit. Thanh ghi định hướng dữ liệu tương ứng là TRISB. Bật bit TRISB (=’1’) sẽ làm cho các chân portB tương ứng là ngõ vào (nghĩa là đặt bộ lái ngõ ra tương ứng ở chế độ tổng trở cao Hi-Z). Xóa bit TRISB (=’0’) sẽ làm cho các chân portB tương ứng là ngõ ra (nghĩa là đặt nội dung của mạch cài ngõ ra trên chân được chọn). Ba chân của port B được hợp kênh với gỡ rối trong mạch (in-circuit debugger) và chức năng lập trình điện áp thấp (low-voltage programming): RB3/PGM, RB6/PGC và RB7/PGD. Chức năng của các chân này được mô tả sau. Mỗi chân của portB có thể được kéo lên bên trong yếu. Một bit điều khiển có thể bật (turn on) tất cả kéo lên. Điều này có thể thực hiện bằng cách xóa bit /RBPU (thanh ghi OPTION). Kéo lên yếu tự động bị tắt (turn off) khi các chân port được cấu hình như ngõ ra. Các kéo lên bị cấm khi reset lúc bật điện (power on reset). Bốn chân port B, RB7-RB4, có đặc điểm ngắt trên thay đổi (interrupt on change). Chỉ có chân được cấu hình như ngõ vào có thể gây ra ngắt (nghĩa là bất cứ chân RB7:RB4 được cấu hình như là ngõ ra thì rút khỏi so sánh ngắt trên thay đổi). Chân ngõ vào (của RB7:RB4) được so sánh với giá trị cũ cài trên việc đọc cuối của portB. Ngõ ra “không khớp” (mismatch) của RB7:RB4 là OR (hoặc) với nhau để tạo ra ngắt thay đổi port RB với bit cờ RBIF (INTCON). 70 Ngắt này có thể đánh thức thiết bị từ chế độ nghỉ SLEEP. Người sử dụng, trong chương trình phục vụ ngắt ISR, có thể xóa ngắt theo cách sau: a) bất kì việc đọc hay ghi của portB. Điều này sẽ kết thúc điều kiện không khớp. b)xóa bit cờ RBIF. Điều kiện không khớp sẽ tiếp tục để bật cờ RBIF. Đọc portB sẽ kết thúc điều kiện không khớp và cho phép bit RBIF bị xóa. Đặc điểm ngắt trên thay đổi được khuyến cáo cho làm thức dậy trên hoạt động nhấn phím và hoạt động ở đó portB chỉ được dùng cho đặc điểm ngắt trên thay đổi. Việc hỏi vòng (polling) của portB thì không được khuyến cáo trong khi sử dụng đặc điểm ngắt trên thay đổi. Đặc điểm ngắt trên thay đổi này, cùng với các kéo lên cấu hình bằng phần mềm trên 4 chân này, cho phép giao tiếp dễ dàng với bàn phím và làm nó có thể dùng đánh thức trên nhấn phím. RB0/INT là chân ngõ vào ngắt ngoài và được cấu hình sử dụng INTEDG bit (thanh ghi OPTION ). RB0/INT được thảo luận kỹ ở chương ngắt. 4.1.3. PortC và thanh ghi TRISC PortC là port 2 chiều, 8 bit. Thanh ghi định hướng dữ liệu tương ứng là TRISC. Bật bit TRISC (=’1’) sẽ làm cho các chân portC tương ứng là ngõ vào (nghĩa là đặt bộ lái ngõ ra tương ứng ở chế độ tổng trở cao Hi-Z). Xóa bit TRISC (=’0’) sẽ làm cho các chân portB tương ứng là ngõ ra (nghĩa là đặt nội dung của mạch cài ngõ ra trên chân được chọn). PortC được hợp kênh với nhiều chức năng ngọai vi (bảng 1). Chân portC có đệm ngõ vào Schmitt-trigger. Khi môđun I2C được cho phép, chân portC được cấu hình với mức I2C chuẩn (thông thường) hay với mức SMBus, bằng cách dùng bit CKE (SSPSTAT). Khi cho phép chức năng ngọai vi, điều cẩn trọng lưu ý là định nghĩa bit TRIS cho mỗi chân portC. Một số ngọai vi đè lên bit TRIS để làm cho chân (pin) là ngõ ra, trong khi ngoại vi khác đè lên bit TRIS để làm cho chân là ngõ vào. Vì việc đè lên bit TRIS là trong ảnh hưởng trong khi ngoại vi được cho phép, lệnh đọc- hiệu chỉnh- ghi (BSF, BCF, XORWF) với TRISC như là đích đến, nên bị cấm (tránh). Người sử dụng nên tham khảo tới phần ngoại vi tương ứng để thiết lập bit TRIS đúng đắn. 4.1.4. PortD và thanh ghi TRISD PortD là port 8 bit với đệm ngõ vào Schmitt-trigger. Mỗi chân đượ cấu hình riêng biệt như là ngõ vào hay ngõ ra. PortD có thể được cấu hình như một port vi xử lí 8 bit (port phụ(tớ) song song) bằng cách bật bit điều khiển PSPMODE (TRISE). Trong mode (chế độ) này, bộ đệm ngõ vào là TTL. Chú ý: PortD và TRISD không được hiện thực trên thiết bị 28 chân. 4.1.5. PortE và thanh ghi TRISE Chú ý: PortE và TRISE không được hiện thực trên thiết bị 28 chân. PortE CÓ 3 CHÂN (RE0/RD/AN5, RE1/WR/AN6, RE2/CS/AN7) mà có thể được cấu hình riêng biệt như là ngõ vào hay ngõ ra. Chân port E trở thành ngõ vào điều khiển I/O cho port vi xử lí khi bit PSMODE (TRISE) được bật (=’1’). Trong chế độ này, người sử dụng phải đảm bảo rằng bit TRISE được bật (=’1’) và rằng các chân được cấu hình như ngõ vào số. Cũng vậy, đảm bảo rằng ADCON1 được cấu hình cho I/O số. Trong chế độ này, bộ đệm ngõ vào là TTL. 71 Thanh ghi TRISE được minh họa và cũng điều khiển tác vụ port tớ song song (xem ở dưới). Chân portE là đa hợp với ngõ vào analog, khi chọn cho ngõ vào analog, những chân này sẽ đọc là ‘0’. TRISE điều khiển hướng của các chân RE, thậm cnhí khi chúng được dùng như ngõ vào analog. Người sử dụng phải đảm bảo giữ các chân được cấu hình ngư ngõ vào khi sử dụng chúng như là ngõ vào analog. Chú ý: khi reset lúc bật điện, những chân này được cấu hình như ngõ vào analog và đọc là ‘0’. Thanh ghi TRISE (địa chỉ 89H) Bit 7 6 5 4 3 2 1 bit 0 R-0 R-0 R/W-0 R/W-0 U-0 R/W-1 R/W-1 R/W-1 Bit điều khiển /trạng thái port tớ song song: Bit 7: IBF: bit trạng thái bộ đệm ngõ vào đầy 1=một từ được nhận và đang đợi để đọc bởi CPU. 0=không có từ nào được nhận. Bit 6: OBF: bit trạng thái bộ đệm ngõ ra đầy. 1=bộ đệm ngõ ra vẫn giữ từ được ghi trước đó. 0=bộ đệm ngõ ra đã được đọc. Bit 5: IBOV: bit dò tìm bộ đệm ngõ vào tràn. 1=việc ghi diễn ra khi 1 từ ngõ vào trước đó chưa được đọc (phải bị xóa bằng phần mềm). 0=không có tràn xảy ra. Bit 4: PSPMODE: bit chọn chế độ port tớ song song. 1=portD có chức năng (làm việc) trong chế độ port tớ song song. 0=portD làm việc trong chế độ I/O đa năng. Bit 3: không hiện thực, đọc là ‘0’. Bit định hướng dữ liệu: Bit 2: bit điều khiển hướng cho chân RE2/CS/AN7: 1=ngõ vào (input) 0=ngõ ra (output) Bit 1: bit điều khiển hướng cho chân RE1/WR/AN6 1=ngõ vào. 0=ngõ ra. Bit 0: bit điều khiển hướng cho chân RE0/RD/AN5 1=ngõ vào. 0=ngõ ra. Chú thích: R=bit có thể đọc W=bit có thể ghi -n=giá trị cho port ‘1’=bit được bật ‘0’=bit bị xóa x=bit chưa biết U=bit không hiện thực, đọc là ‘0’. 4.2. Định thời với vi điều khiển: Tất cả vi điều khiển có mạch định thời trên chip; một số có 4 timer khác nhau. Vi điều khiển 16F84 có một thanh ghi timer gọi là timer 0. Các timer này chạy ở tốc độ ¼ cua IBF OBF IBOV PSPMODE - R/W-1 R/W-1 R/W-1 72 xung đồng hồ hệ thống. Như vậy nếu chúng ta sử dụng thạch anh 32,768 Khz, timer bên trong sẽ chạy ở 8192 4 768,32 = Hz. Nếu chúng ta muốn bật led sáng trong 1 giây chẳng hạn thì chúng ta cần đếm 8192 xung. Đây là rất nhiều xung . Thật là may mắn bên trong vi điều khiển có 1 thanh ghi gọi là thanh ghi OPTION, mà cho phép chúng ta làm giảm (chậm) những xung này bằng các hệ số 2, 4, 8, 16, 32, 128 và 256. Thanh ghi OPTION được thảo luận trong phần tập lệnh . Thiết lập bộ tỉ lệ trước , như là nó được gọi để chia 256 trong thanh ghi OPTION nghĩa là xung định thì của chúng ta bây giờ là 8192/256=32 Hz, nghĩa là 32 xung trong 1 giây. Như vậy để bật led sáng trong 1 giây, chúng ta chỉ cần đếm 32 xung trong timer 0 hay 16 cho 0,5 giây, hay 160 cho 5 gis6y (sec),vv... Thanh ghi OPTION: Lệnh option: nội dung của W được nạp vào thanh ghi OPTION. Lệnh này được dùng để chia tỉ lệ trước, nghĩa là bật tốc độ định thời TMR0 như hình sau: Bit 7 6 5 4 3 2 1 0 Giá trị bộ chia tỉ lệ trước * PS2 PS1 PS0 tốc độ TMR0 tốc độ WDT 0 0 0 1:2 1:1 0 0 1 1:4 1:2 0 1 0 1:8 1:4 0 1 1 1:16 1:8 1 0 0 1:32 1:16 1 0 1 1:64 1:32 1 1 0 1:128 1:64 1 1 1 1:256 1:128 * PSA : bit gán bộ chia hệ số tỉ lệ trước: 0=TMR0 1=WDT *TOSE: cạnh tín hiệu TMR0 0=cạnh lên trên chuyển đổi từ thấp Æcao ở chân TOCKI. 1=cạnh xuống trên chuyển đổi từ cao Æ thấp. *TOCS: nguồn tín hiệu TMR0 0=clock chu kì lệnh ở chân CLKOUT (dùng clock bên trong). 1=chuyển đổi ở chân TOCKI (dùng clock bên ngoài ở chân TOCKI). */RBPU: bit cho phép kéo lên ở port B. 1=kéo lên bị cấm. 0=kéo lên được cho phép. Bit 6, bit 7: luôn là 00 Bit 6 INTEDG: bit chọn cạnh ngắt 1=ngắt ở cạnh lên của chân INT. 0=ngắt ở cạnh xuống của chân INT. Để đặt 1 số vào thanh ghi OPTION, trước tiên bạn phải nạp số đó vào thanh ghi W, và sau đó viết lệnh OPTION. Lệnh này tự động lấy số từ thanh ghi W và chuyển nó vào thanh ghi file OPTION. Thí dụ: Số nào nên được di chuyển vào thanh ghi OPTION để có thể dùng TMR0 hiệu quả để đếm tuần tự số đếm của giây mà được chuyển. /RPBU INTEDG TOCS TOSE PSA PS2 PS1 PSO 73 Giải: Bit 7 , bit 6 luôn là 00. TMR0 là đếm lên bên trong, vậy bit 5 (TOCS) là 0. TMR0 là kích cạnh lên hay cạnh xuống: tùy ý nên chọn TOSE=’0’ (cạnh lên). Hệ số tỉ lệ trước cho TMR0 được yêu cầu, vậy bit 3 (PSA) là 0. Tỉ lệ trước cực đại là 256, vậy bit 2 tới bit 0 (PS2-PS0) là 111. Vậy số cần chuyển vào thanh ghi OPTION là 00000111. Lệnh như sau: Movlw b’00000111’; thiết lập TMR0 để đếm Option; đếm bên trong, tỉ lệ trước bởi 256 Thí dụ: Tạo thời gian trễ 1 giây, 0,5 giây, 0,1 giây và 5 giây. Status equ 3 Tmr0 equ 1 Zerobit equ 2 Option_r equ 81h Bsf status,5;bank 1 Movlw b’00000111’ Movwf option_r;thiết lập bộ chia tỉ lệ trước là 1/256 cho tmr0 Delay5 clrf tmr0;khởi động timer 0 Loop movf tmr0,w; đọc tmr0 vào w Sublw .160; 160-w Btfss status,zerobit; wkhông bắng 160 Goto loop Retlw 0 Thí dụ : Viết chương trình tạo sóng vuông có chu kì T=10 sec ở chân PORTB,0 (RB0) dùng timer 0. ;phần tương đương Status equ 3 Tmr0 equ 1 Zerobit equ 2 Option_r equ 81h Portb equ 6 Trisb equ 86h ;************************ list p=16f877a; chúng ta dùng PIC 16F877A org 0; địa chỉ đầu là 0 goto start;nhảy đến start ;bit cấu hình __config h’3ff0’; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm ;phần chương trình con Delay5 clrf tmr0;khởi động timer 0 Loop movf tmr0,w; đọc tmr0 vào w Sublw .160; 160-w Btfss status,zerobit; wkhông bắng 160 Goto loop Retlw 0 ;phần cấu hình start Bsf status,5;bank 1 Movlw b’00000000’ Movwf trisb;portb là xuất 74 Movlw b’00000111’ Movwf option_r;thiết lập bộ chia tỉ lệ trước là 1/256 cho tmr0 Bcf status,5;bank 0 Clrf portb;xóa portb ;chương trình chính bắt đầu Main bsf portb,0 Call delay5 Bcf portb,0 Call delay5 Goto main End Bộ timer 1: Bộ timer 1 có thể là bộ đếm hoặc bộ định thời với ưu điểm sau: +16 bit cho bộ đếm hoặc định thời (gồm hai thanh ghi TMR1H và TMR1L). +có khả năng đọc và viết. +có thể chọn xung đồng hồ bên trong hoặc đồng hồ bên ngoài. +có thể ngắt khi tràn FFFFh về 0000h. Timer 1 có 1thanh ghi điều khiển, đó là thanh ghi T1CON. Bộ timer 1 có hoạt động hay không hoạt động là nhờ việc đặt xóa bit TMR1ON (T1CON). Hoạt động của bộ timer 1: Nó có thể hoạt động ở một trong các chế độ sau: + là 1 bộ định thời 16 bit. +là một bộ đếm có đồng bộ. +là môt5 bộ đếm không có đồng bộ. Phương thức hoạt động của bộ này được xác định bởi việc chọn xung vào timer 1. Nguồn xung đồng hồ được chọn bởi việc đặt hoặc xóa bit TMR1CS(T1CON). Ở chế độ định thời , đầu vào là clock trong fosc/4, bit đồng bộ T1SYNC (T1CON) không có tác dụng vì clock trong luôn đồng bộ. Chế độ bộ đếm hoạt động hai chế độ: có đồng bộ xung vào xoá bit T1SYNX (T1CON), không đồng bộ xung vào set bit T1SYNC(T1CON), timer 1 tăng ở sườn lên xung đầu vào. Khi bộ dao động timer 1 cho phép hoạt động thì các chân RC1/T1OSI/CCP2, RC0/T1OSO/T1Cki trở thành đầu vào. Ở chế độ đếm có đồng bộ bộ đếm tăng mỗim khi sườn lên của chân RC0 hoặc ở chân RC1 nếu bit T1OSCEN xóa và xung vào phải đồng bộ với clock trong, ở chế độ này bộ đếm không tăng trong trạng thái SLEEP. Ở chế độ đếm không đồng bộ timer 1tăng mỗi khi sườn lên ở chân RC0 hoặc ở chân RC1 nếu bit T1OSCEN xóa, ở chế độ này bộ đếm tiếp tục tăng trong trạng thái SLEEP và có khả năng tràn gây ra ngắt khi đó bộ xử lí được đánh thức. Dao động của timer 1: Mạch dao động thạch anh được xây dựng giữa 2 chân T1OSI và T1OSO. Khi dao động được cung cấp ở chế độ công suất thấp thì tần số cực đại của nó sẽ là 200 Khz và trong khi nó ở chế độ SLEEP nó cung cấp ở tần số 32 Khz. Ngắt của bộ timer 1: Cặp thanh ghi TMR1H và TMR1L tăng từ giá trị 0000h đến FFFFh, đến giá trị này tiếp tục tăng thì tràn và quay lại 0000h, và ngắt xuất hiện khi tràn quá giá trị FFFFh, khi này cờ ngắt TMR1F sẽ được bật (đặt lên 1). Ngắt có thể hoạt động hoặc không hoạt động nhờ việc đặt hoặc xóa bit TMR1IE. *Thanh ghi điều khiển T1CON: T1CON: timer 1 control register (địa chỉ 10h) 75 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 Bit 7 6 5 4 3 2 1 0 -bit 7,6: không sử dụng. -bit 5,4: T1CKPS1: T1CKPS0 : lựa chọn hệ số chia xung vào. T1CKPS1 T1CKPS0 Hệ số chia 0 0 1:1 0 1 1:2 1 0 1:4 1 1 1:8 -bit 3: T1OSCEN bit điều khiển bộ dao động timer 1. 1= bộ dao động hoạt động. 0=bộ dao động không hoạt động. -bit 2: bit điều khiển xung clock ngoài đồng bộ khi TMR1CS=1 Bit 2=0 :có đồng bộ clock ngoài. 1= không đồng bộ clock ngoài. Khi TMR1CS=0 bit này không có tác dụng. -bit 1: TMR1Cs bit lựa chọn nguồn xung clock vào. TMR1CS=1 clock từ chân RC0/T1OSO/T1CKI (sườn lên). TMR1CS=0 clock trong fosc/4. -bit 0: bit bật tắt timer. 1= cho phép timer. 0=cấm timer. Thí dụ: Thiết lập timer 1 để: -Cho phép timer 1 hoạt độngÆT1OSCEN=1. -Hệ số tỉ lệ trước: 1/8Æ T1CKPS1:T1CKPS0=11. -Clock bên trong là fosc/4ÆTMR1CS=0. Bit T1SYNC không có tác dụng -Bật timer 1: TMR1ON=1 Giá trị ở thanh ghi T1CON là 00111101 Lệnh: T1CON_R equ 10h Movlw b’00111101’ Movwf T1CON_R Bộ timer 2: Bộ timer 2 có những đặc tính sau đây: + 8 bit cho bỘ đỊnh thỜi +8 bit vòng lặp (thanh ghi PR2). +có khả năng đọc và viết ở cả 2 thanh ghi nói trên. +có khả năng lập trình bằng phần mềm tỉ lệ trước. +có khả năng lập trình bằng phần mềm tỉ lệ sau. Chế độ SSP dùng đầu ra của TMR2 để tạo clock. Timer 2 có một thanh ghi điều khiển đó là thanh ghi T2CON. Timer 2 có thể viết tắt bằng việc xóa bit TMR2CON của thanh ghi T2CON. Hoạt động của bộ timer 2: Timer 2 được dùng chủ yếu ở phần điều chế độ rộng xung của bộ CCP, thanh ghi TMR2 có khả năng đọc và viết, nó có thể xóa bằng việc reset lại thiết bị. Đầu vào của - - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON 76 xung có thể chọn các tỉ lệ sau: 1:1, 1:2, 1:16, việc chọn các tỉ lệ này có thể điều khiển các bit sau T2CKPS1 và bit T2CKPS0. Ngắt của bộ timer 2: Bộ timer 2 có thanh ghi 8 bit PR2. Timer 2 tăng từ giá trị 00h cho đến khớp với PR2 và tiếp theo nó sẽ reset lại giá trị 00h và lệnh kế tiếp thực hiện. Thanh ghi PR2 là một thanh ghi có khả năng đọc và khả năng viết. Thanh ghi PR2 bắt đầu từ giá trị FFh đầu ra của TMR2 là đường dẫn của cổng truyền thông đồng bộ, nó được dùng để phát các xung đồng hồ. *Thanh ghi T2CON: T2CoN: timer 2 control register (địa chỉ 12h) U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 Bit 7 6 5 4 3 2 1 0 -Bit 7: không sử dụng. -bit 6÷3: TOUTPS3÷TOUTPS0 bit lựa chọn hệ số đầu ra timer 2. TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 Hệ số đầu ra 0 0 0 0 1:1 0 0 0 1 1:2 0 0 1 0 1:3 0 0 1 1 1:4 0 1 0 0 1:5 0 1 0 1 1:6 0 1 1 0 1:7 0 1 1 1 1:8 1 0 0 0 1:9 1 0 0 1 1:10 1 0 1 0 1:11 1 0 1 1 1:12 1 1 0 0 1:13 1 1 0 1 1:14 1 1 1 0 1:15 1 1 1 1 1:16 -bit 2: TMR2ON bit bật tắt hoạt động timer 2. 1=cho phép (enable). 0= cấm (disable). -bit 1÷0:T2CKSP1÷T2CKSP0 chọn hệ số chia đầu vào T2CKSP1 T2CKSP0 Hệ số chia đầu vào 0 0 1:1 0 1 1:4 1 X 1:16 - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 77 4.3. Lập trình với vi điều khiển: Để lập trình vi điều khiển chúng ta cần: . viết lệnh trong một chương trình. . Chuyển đổi văn bản thành mã lệnh mà vi điều khiển hiểu được sử dụng một công cụ phần mềm được gọi là bộ biên dịch (thí dụ MPASM, MPLAB, CCS,vv...). . Đưa dữ liệu vào bộ nhớ Flash /EPROM của vi điều khiển sử dụng bộ nạp (thí dụ mạch nạp PIC qua cổng COM loại JDM Programmer hay mạch nạp qua cổng USB). Chúng ta hãy xem xét nhiệm vụ đầu, viết chương trình. Công việc này được thực hiện ở bất kì phần mềm soạn thảo nào, thí dụ Notepad của Windows. Tôi thích sử dụng bộ soạn thảo được cung cấp bởi nhà chế tạo vi điều khiển ‘Microchip’. Phần mềm này được gọi là MPLAB và có thể tải miễn phí ở website Như bạn đã thấy ở trên , chúng ta cần cấu hình I/O và thiết lập bộ hệ số tỉ lệ trước cho định thời. Nếu chúng ta không thiết lập chúng thì điều kiện mặc nhiên là tất cả các bit PORT là ngõ vào. Vi điều khiển không có ngõ ra thì không sử dụng được nhiều. Mặc định cho bộ chia tỉ lệ trước là tốc độ clock được chia bởi 2. Chương trình cũng cần biết thiết bị gì mà nó dự định dùng và địa chỉ bắt đầu trong bộ nhớ là gì. Nếu điều này bắt đầu có vẻ bối rối-xin đừng lo lắng. Tôi viết một chương trình tiêu đề (header program), mà thiết lập tất cả điều kiện trên cho bạn sử dụng. Các điều kiện này có thể thay đổi sau này khi bạn hiểu nhiều về những gì bạn làm. Tiêu đề cho PIC 16F84 thiết lập 5 bit của portA như là ngõ vào và 8 bit của portB như là ngõ ra. Nó cũng thiết lập bộ chia hệ số tỉ lệ trước để chia cho 256. Chúng ta sử dụng thạch anh 32,768 Khz, như vậy định thời của chúng ta là 32 xung trên 1 giây. Lệnh chương trình sẽ chạy ở ¼ của 32,768 KHz, nghĩa là 8192 lệnh trên giây (1 chu kì máy=4xchu kì clock). Tiêu đề cũng thêm vào 2 chương trình con định thì để bạn sử dụng chúng là DELAY1-trì hoãn 1 giây và DELAY5-trì hoãn 0,5 giây. Chương trình con là một phần đoạn mã mà có thể gọi khi cần, để tiết kiệm viết nó lần nữa. Đối với úc này, đừng lo về làm sao bộ tiêu đề hay chương trình con làm việc. Chúng ta sẽ làm việc thông qua chúng ở sau. 4.4. Nhập dữ liệu: Xem xét số thập phân 37, số này có giá trị thập lục phân (hex) là 25 hay giá trị nhị phân là 00100101. Bộ biên dịch sẽ chấp nhận điều này là .37 ở dạng thập phân (chú ý dấu . không là dấu chấm thập phân) hay 25H ở dạng số hex hay B’00100101’ ở dạng số nhị phân . Số 181 thập phân được nhập như là .181 ở dạng thập phân hay 0B5H ở dạng số hex hay B’10110101’ ở dạng nhị phân. Nếu số hex bắt đầu là chữ thì ta ghi 0B5h, chứ không là B5h. Chú ý: cơ số mặc định của chương trình biên dịch MPASM/MPLAB là số hex. Vi điều khiển PIC là vi điều khiển 8 bit. Điều này có nghĩa là vị trí bộ nhớ, nghĩa là file của người sử dụng và thanh ghi chứa 8 bit. Như vậy số nhỏ nhất 8 bit là 00000000, mà tương đương số 0 thập phân. Số lớn nhất 8 bit là 11111111 mà tương đương số 255 thập phân. Để sử dụng số lớn hơn 255 chúng ta phải kết hợp ô nhớ. Hai ô nhớ kết hợp cho ra 16 bit với số lên tới 65536. Ba ô nhớ kết hợp cho ra số lên tới 16777215,vv Những số lớn này được giới thiệu sau. 4.5. Tập tin tiêu đề cho 16F84, tập tin Header84.asm 78 Chương trình dưới đây minh họa cho vi điều khiển 16F84. Tôi đề nghị cho bạn bắt đầu tất cả các chương trình ,với chip này 16F84, bằng tiêu đề này, hay phiên bản hiệu chỉnh. Giải thích đầy đủ sẽ được trình bày sau. ; Header84.asm điều này thiết lập portA là ngõ vào (1 là vào), portB là ngõ ra ( 0 là ra) ;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây. ;trì hoãn 1 giây và 0,5 giây được đưa vào chương trình con ;*************************************** ;phần tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ô nhớ 1) STATUS EQU 3; nghĩa là STATUS là ô nhớ 3. PORTA EQU 5;nghĩa là portA là ô nhớ 5. PORTB EQU 6;nghĩa là portB là ô nhớ 6. TRISA EQU 85H; TRISA (chọn I/O portA) là ô nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ô nhớ 86H OPTION_R EQU 81h; thanh ghi OPTION là ô nhớ 81h. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. COUNT EQU 0Ch; COUNT là ô nhớ 0Ch, thanh ghi để đếm sự kiện. ;*************************************** LIST P=16F84 ; chúng ta đang dùng 16F84 ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START ;*************************************** ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hoãn 1 giây DELAY1 CLRF TMR0; bắt đầu TMR0 LOOPA MOVF TMR0,W; đọc TMR0 vào W SUBLW .32; TIME-32 BTFSS STATUS, ZEROBIT; kiểm tra TIME-W=0 GOTO LOOPA; time không bằng 32 RETLW 0; time là 32, trở về. ;trì hoãn 0,5 giây. DELAY5 CLRF TMR0 ; khởi động TMR0 LOOPB MOVF TMR0,W ; đọc TMR0 vào W SUBLW .16 ;TIME-16 BTFSS STATUS,ZEROBIT;kiểm tra TIME-W=0 GOTO LOOPB ; TIME không bằng 16 RETLW 0; time là 16, trở về. ;Phần cấu hình. START BSF STATUS,5; trở lại bank 1 MOVLW B’00011111’; 5 bit của port A là I/R (ngõ vào) MOVWF TRISA MOVLW B’00000000’ MOVWF TRISB ; PortB là output (ngõ ra) MOVLW B’00000111’;bộ chia tỉ lệ trước là /256 MOVWF OPTION_R; timer là 1/32sec, có thể dùng lệnh OPTION BCF STATUS,5 ;trở lại bank 0 CLRF PORTA ; xóa PORTA CLRF PORTB ;xóa PORTB 79 16F84 B0 V+ 16 MCLR TOCKI 15 0V ;chương trình chính bắt đầu END; dòng này luôn luôn đặt ở cuối chương trình. Chú ý: dấu ; theo sau là lời chú thích. Chương trình dịch sẽ bỏ qua. Phần này được lưu là Header84.asm. Bạn có thể dùng nó để bắt đầu tất cả chương trình 16F84 của bạn. Header84 là phần tên và ASM là phần mở rộng. 4.6. Thí dụ chương trình Cách tốt nhất để hiểu cách sử dụng vi điều khiển là bắt đầu với ví dụ đơn giản và xây dựng trên nó. Xem xét mạch điện sau: 6 +5V 14 68 pF 4 3 32 Khz 0.1 µF 68pF 5 Hình 4.1: Mạch vi điều khiển Xét chương trình chớp tắt led (led on và off) trong khoảng 0,5 giây. Dùng Notepad soạn thảo và lưu lại tên CH51.ASM. CHúng ta có thể dung MPLAB để soạn chương trình nguồn. Chương trình CH51.ASM ; Header84.asm điều này thiết lập portA là ngõ vào (1 là vào), portB là ngõ ra ( 0 là ra) ;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây. ;trì hoãn 1 giây và 0,5 giây được đưa vào chương trình con ;*************************************** ;phần tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ô nhớ 1) STATUS EQU 3; nghĩa là STATUS là ô nhớ 3. PORTA EQU 5;nghĩa là portA là ô nhớ 5. PORTB EQU 6;nghĩa là portB là ô nhớ 6. TRISA EQU 85H; TRISA (chọn I/O portA) là ô nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ô nhớ 86H OPTION_R EQU 81h; thanh ghi OPTION là ô nhớ 81h. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. COUNT EQU 0Ch; COUNT là ô nhớ 0Ch, thanh ghi để đếm sự kiện. ;*************************************** LIST P=16F84 ; chúng ta đang dùng 16F84 ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START 80 ;*************************************** ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hoãn 1 giây DELAY1 CLRF TMR0; bắt đầu TMR0 LOOPA MOVF TMR0,W; đọc TMR0 vào W SUBLW .32; TIME-32 BTFSS STATUS, ZEROBIT; kiểm tra TIME-W=0 GOTO LOOPA; time không bằng 32 RETLW 0; time là 32, trở về. ;trì hoãn 0,5 giây. DELAYP5 CLRF TMR0 ; khởi động TMR0 LOOPB MOVF TMR0,W ; đọc TMR0 vào W SUBLW .16 ;TIME-16 BTFSS STATUS,ZEROBIT;kiểm tra TIME-W=0 GOTO LOOPB ; TIME không bằng 16 RETLW 0; time là 16, trở về. ;Phần cấu hình. START BSF STATUS,5; trở lại bank 1 MOVLW B’00011111’; 5 bit của port A là I/R (ngõ vào) MOVWF TRISA MOVLW B’00000000’ MOVWF TRISB ; PortB là output (ngõ ra) MOVLW B’00000111’;bộ chia tỉ lệ trước là /256 MOVWF OPTION_R; timer là 1/32sec, có thể dùng lệnh OPTION BCF STATUS,5 ;trở lại bank 0 CLRF PORTA ; xóa PORTA CLRF PORTB ;xóa PORTB ;chương trình chính bắt đầu BEGIN BSF PORTB,0 ; bật bit B0=’1’ CALL DELAYP5 ; đợi 0,5 s BCF PORTB,0 ; tắt B0=’0’ CALL DELAYP5; đợi 0,5 s GOTO BEGIN END; bạn phải kết thúc. Giải thích: . Chương trình gồm 5 dòng bắt đầu từ BEGIN (là nhãn) để chớp tắt led. BEGIN là nhãn (label), nhãn được dùng như địa chỉ ô nhớ để chương trình nhảy tới . . Dòng 1 là lệnh BSF và dữ liệu là PORTB, 0: nghĩa là bật bit trong file PORTB, ở đó bit 0 là bit được chọn và led sáng. Chú ý: không có khoảng trắng ở nhãn, lệnh hay dữ liệu. .Dòng 2: call delayp5: lệnh gọi chương trình con tên là delayp5 và tạo trì hoãn (delay) 0,5 giây. . Dòng 3 BCF PORTB,0 là ngược lại dòng 1, nghĩa là xóa bit trong file PORTB, ở bit 0. CHân 6 ở hình 4.1 là 0V làm led tắt. .Dòng 4: call delayp5 là trì hoãn 0,5 giây. .Dòng 5 goto begin: gửi chương trình trở ngược lại nhãn BEGIN để lặp lại quá trình chớp tắt led on và off. Bất kì 8 ngõ ra có thể được bật (ON) hay tắt (OFF) sử dụng 2 lệnh BSF và BCF. 81 THí dụ: BSF PORTB,3; làm bit 3 của PORTB (chân 9) lên 5V (logic 1) BCF PORTB,7 ; làm bit 7 của PORTB xóa về 0 , 0V (logic 0). Bài tập: 1/Chương trình tiêu đề HEADER877A.ASM và bài toán chớp tắt led:sinh viên tự viết. Thí dụ: Điều khiển led dung portA và portE: Soạn tập tin led.asm dung NotePad. Hoặc dung MPLAB như sau: ;*********************************************************** ; Tập tin: led.asm ; Mô tả : Mô tả hoạt động cơ bản của Port A and E ; MCU : PIC16F877(A) ;************************************************************ LIST P=16F877,W=-302 __CONFIG 0x3D32 ; HS MODE,WDT OFF PORTA EQU 0x05 ;Bank0 PORTE EQU 0x09 TRISA EQU 0x85 ; Bank1 TRISE EQU 0x89 ADCON1 EQU 0x9F X EQU 0x70 ; RAM Y EQU 0x71 Z EQU 0x72 ROUND EQU 0x73 ;************************************************************ ORG 0x0000 BANKSEL ADCON1 ; Select ADCON1 MOVLW B'00000111' ; PORTA,PORTE = digital port ; MOVLW B'00000000' ; PORTA,PORTE = analog port MOVWF ADCON1 MOVLW B'00110000' ; RA3:RA0 MOVWF TRISA MOVLW B'00000000' ; PORTE = output MOVWF TRISE BANKSEL PORTA ; Select PORTA START CLRF PORTA ; Clear PORTA CLRF PORTE ; Clear PORTE MOVLW .3 MOVWF ROUND BSF PORTA,3 CALL DELAY LOOP1 RRF PORTA,1 CALL DELAY DECFSZ ROUND,1 GOTO LOOP1 CLRF PORTA 82 MOVLW .2 MOVWF ROUND BSF PORTE,2 CALL DELAY LOOP2 RRF PORTE,1 CALL DELAY DECFSZ ROUND,1 GOTO LOOP2 GOTO START DELAY CLRF X ; Delay ~500 ms CLRF Y MOVLW .13 MOVWF Z DECFSZ X,1 GOTO $-1 DECFSZ Y,1 GOTO $-3 DECFSZ Z,1 GOTO $-5 RETURN END 4.7.Lưu và biên dịch mã: Tập tin ở trên được lưu lại với tên led.asm Cài đặt MPLAB: Vào thư mục D:\MPLAB660, nhấp đúp chuột vào tập tin MPLABV~1.exe và quá trình cài đặt diễn ra. Kết thúc cài đặt MPLAB V6.60 thành công và shortcut được tạo ra trên desktop. Hình 4.2 83 Khởi động MPLAB: nhấp đúp chuột vào biểu tượng MPLAB IDE. Chương trình trên được lưu là led.asm. Bước kế tiếp là biên dịch mã văn bản này thành tập tin .hex mà vi điều khiển hiểu được. Bước 1: Mở MPLAB. Bước 2: Ta Mở file led.asm dung menu File, Open. Trường hợp tạo tập tin mới ta chọn File, New. Gõ nội dung vào như sau: Hình 4.3 -Lưu tập tin Untitled thành tên mới là led.asm dung lệnh File, Save hay File, Save As. Hình 4.4 Từ menu Configure, Select device chọn PIC 16F877A và nhấp Ok. 84 Hình 4.5 Tùy chọn Configure, Configure Bit như hình 4.6 Hình 4.6 Cấu hình bit của chúng ta, chọn dao động HS, tắt Watch dog timer (off), bật Power up Timer (on), và tắt Code protect (off). Chú ý giá trị cấu hình này là 3FF2h. Mã là __CONFIG 0x3FF2 ; HS mode, WDT off, power up timer on, code protect off. Chuyển sang file .hex: led.hex. Chọn Project, Quickbuild led.asm như hình 4.7 85 Hình 4.7 Nếu có lỗi MPLAB sẽ báo. Nếu không có lỗi, MPLAB báo Quickbuild succeeded như hình 4.8. Hình 4.8 Chương trình báo lỗi lở dòng START CLRF PORT; select PORTA . Chương trình không hiểu PORT là gì. Đúng là PORTA 86 Hình 4.9 Xem quá trình dịch chọn View, program memory. Hình 4.10 4.8.Mạch nạp vi điều khiển PIC và phần mềm WinPIC800 Giới thiệu Bộ nạp PIC GTP-USB Chúng ta sử dụng bộ nạp GTP-USB PIC programmer , nạp qua cổng USB để nạp tập tin .hex (nhị phân) vào bộ nhớ chương trình Flash hay EPROM của vi điều khiển PIC. Bộ nạp này hỗ trợ tất cả các PIC có bởi phần mềm nạp WinPIC800, chạy trên máy tính có cài Windows 95/98/2000/ME/Xp. Xét mạch nạp PIC qua cổng COM, loại JDM Programmer ( bo mạch nạp của RIXIN, tham khảo: sạp N6 chợ Điện tử Nhật Tảo, Nguyễn Kim, Quận 10, Tp. HCM) -Kết nối phần cứng mạch nạp với máy tính qua cổng COM. Bật điện. -Chạy chương trình WinPic800.Vào thư mục D:\WinPic800_V359, nhấp đúp chuột vào tập tin WinPic800_V3_59.exe, quá trình cài đặt diễn ra. Màn hình như sau (hình 4.16): 87 Hình 4.11 Nhấp đúp chuột vào biểu tượng WinPic800 trên desktop để khởi động. Hình 4.12 -Chọn IC : loại PIC F và chọn PIC 16F877A. -Chọn Settings, Hardware để chọn phần cứng là JDM Programmer, sau đó nhấp vào Apply Edits. -Chọn Device, Haedware test để kiểm tra phần cứng. -Chọn tập tin .hex để nạp : menu File, Open và chọn tập tin cần nạp, thí dụ led.hex, nhấn Open. Nhấn nút Program All để nạp hay menu Device, Program All. Nếu nạp thành công , máy báo OK , còn có lỗi sẽ thong báo lỗi. 88 Muốn xóa nội dung chọn Device, Erase All. Đọc nội dung chọn Device, Read All. Kiểm tra chọn Device, Verify All. Khi nạp file.hex thành công, vi điều khiển sẵn sang sử dụng. Nhưng sử dụng tưởng tượng của bạn. Có 35 lệnh trong ngôn ngữ vi điều khiển của bạn. Tầm vi điều khiển PIC bao gồm thiết bị với 64KB bộ nhớ chương trình EPROM, 3938 byte RAM bộ nhớ dữ liệu, 1024 byte bộ nhớ EEPROM, 72 chân vào ra, 11 ngắt, bộ A/D 10 bit có 15 kênh vào, xung clock 20 Mhz, tập lệnh 55 từ. Xem phụ lục 2 để biết chi tiết. Xét mạch nạp PICSTARTPLUS: Nếu bạn không có mạch nạp thì tôi khuyến cáo bộ nạp PICSTARTPLUS của Arizona Microchip. Khi Arizona mang đến một bộ vi điều khiển mới như họ thường làm, phần mềm điều khiển được cập nhật và có thể download miễn phí trên internet ở Một khi được cài trên máy tính PC của bạn, nó được mở từ MPLAB chuyển qua bộ nạp PICSTARTPLUS. Chọn Programmer, Select Programmer, PICSTART Plus như hình 1. Hình 1: Chọn bộ nạp PICSTART Plus. Chọn Enable Programmer từ Programmer Box như hình 1. Giai đoạn cuối là lập trình đoạn mã của chúng ta vào chip. Để làm điều này ta nhấp chuột vào biểu tượng lập trình như hình 2 hay thong qua menu trên Programmer, Program. 89 Hình 2: Biểu tượng lập trình. Sau một lúc thì thong báo thành công xuất hiện trên màn hình. Mã được nạp thành công vào chip và sẵn sang để sử dụng. Nếu quá trình nạp thất bại, bạn hãy kiểm tra chip được gắn đúng vào socket (đế cắm) chưa, nếu có thể thử lại một lần nữa. Bây giờ chúng ta có thể sử dụng vi điều khiển để bật led và tắt led. Mạch nạp Microchip MPLAB ICD 2 LE (In Circuit Debugger) Chọn Programmer, Select Programmer, MPLAB ICD 2 như hình 3. Hình 3 Qu á tr ình c ài đ ặt MPLAB ICD 2 di ễn ra 90 H ình 4. Nh ấp chu ột v ào Next Ch ọn c ổng COM 1 v à t ốc đ ộ baud l à 19200 baud. H ình 5 Nh ấp chu ột v ào Next. C ấp ngu ồn cho MPLAB ICD 2. Ch ọn ngu ồn cung c ấp ri êng hay t ừ MPLAB ICD 2 91 H ình 6 Ch ọn cho ph ép k ết n ối t ự đ ộng . c ó th ể kh ông d ùng n ếu b ạn c ó s ử d ụng m ạch n ạp kh ác ngo ài ICD 2. H ình 7 Nh ấp chu ột v ào Next. Ch ọn cho ph ép t ự đ ộng n ạp h ệ đi ều h ành. 92 H ình 8 Nh ấp v ào Next. Hi ện ra b ảng t óm t ắt H ình 9. Nh ấp v ào Finish đ ể k ết th úc. N ếu ch ưa g ắn v ới chip PIC 16F877A th ì MPLAB hi ện ra th ông b áo: 93 H ình 10. H ình 11 Tiếp theo chúng ta lập trình đoạn mã của chúng ta vào chip. Để làm điều này ta nhấp chuột vào biểu tượng lập trình như hình 2 hay thong qua menu trên Programmer, Program. 94 B1 16F84 B0 V+ 16 MCLR T0CKI 15 0V 4.9. Lưu đồ lập trình. Đ Tạo có lỗi? S Hình 4.18 4.10. Bài toán: chớp tắt 2 led Xem xét mạch điện sau: 7 680 6 680 +5V 14 68 pF 4 3 32 Khz 0.1 µF 68pF 5 Mở MPLAB Tạp tập tin CH51.ASM Quickbuild CH51.ASM Lập trình (nạp) vi điều khiển SỬa lỗi 95 Hình 4.19: Mạch điện chớp tắt 2 led. Bài tập: Viết chương trình mà sẽ chớp tắt 2 led (on và off) luân phiên nhau. Đặt led 1 ở B1 và led 0 ở B0. Chú ý: Bạn có thể dung chương trình CH51.asm và chỉ them 2 dòng. Sau đó lưu lại với tên CH52.ASM. Cố gắng đứng nhìn vào đáp án bên dưới trước khi bạn cố gắng tìm ra lời giải. Đáp án như sau: ; phần tiêu đề (đã trình bày). ;Chương trình chính bắt đầu. BEGIN BSF PORTB,0 ; bật B0, led 0 sáng. BCF PORTB,1 ; tắt B1, led 1 tắt CALL DELAYP5 ; trì hoãn 0,5 giây. BCF PORTB,0 ;tắt B0, led 0 tắt. BSF PORTB,1 ; bật B1, led 1 sáng CALL DELAYP5; trì hoãn 0,5 giây GOTO BEGIN END Bài tập: 1/ Viết chương trình chớp tắt 4 led, 2 led sang (on) và 2 led tắt (off). 2/Viết chương trình 8 led chạy đuổi: 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 4.11.Tập tin tiêu đề của PIC 16F877A: HEADER877.ASM. ; Header877.asm điều này thiết lập portA là ngõ vào (1 là vào), portB là ngõ ra ( 0 là ra), ;portC là ngõ vào, portE ngõ vào, portD ngõ ra. ;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây. ;trì hoãn 1 giây và 0,5 giây được đưa vào chương trình con ;*************************************** ;phần tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ô nhớ 1) OPTION_R EQU 81h; thanh ghi OPTION là ô nhớ 81h. PORTA EQU 5;nghĩa là portA là ô nhớ 5. PORTB EQU 6;nghĩa là portB là ô nhớ 6. PORTC EQU 7 PORTD EQU 8 PORTE EQU 9 TRISA EQU 85H; TRISA (chọn I/O portA) là ô nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ô nhớ 86H TRISC EQU 87H TRISD EQU 88H TRISE EQU 89H STATUS EQU 3; nghĩa là STATUS là ô nhớ 3. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. CARRY EQU 0 96 EEADR EQU 10Dh EEDATA EQU 10Ch EECON1 EQU 18Ch EECON2 EQU 18Dh RD EQU 0 WR EQU 1 WREN EQU 2 ADCON0 EQU 1Fh ADCON1 EQU 9FH ADRES EQU 1EH ADRESL EQU 9EH CHS0 EQU 3 GODONE EQU 2 COUNT EQU 20; COUNT là ô nhớ 20H, thanh ghi để đếm sự kiện. ;*************************************** LIST P=16F87A ; chúng ta đang dùng 16F877A ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START ;*************************************** ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hoãn 1 giây DELAY1 CLRF TMR0; bắt đầu TMR0 LOOPA MOVF TMR0,W; đọc TMR0 vào W SUBLW .32; TIME-W BTFSS STATUS, ZEROBIT; kiểm tra TIME-W=0 (32-W=0) GOTO LOOPA; time không bằng 32 RETLW 0; trở về sau khi time là 32 (TMR0=32). ;trì hoãn 0,5 giây. DELAY5 CLRF TMR0 ; khởi động TMR0 LOOPB MOVF TMR0,W ; đọc TMR0 vào W SUBLW .16 ;TIME-W BTFSS STATUS,ZEROBIT;kiểm tra TIME-W=0 GOTO LOOPB ; TIME không bằng 16 RETLW 0; trở về sau khi time là 16 (TMR0=16). ;Phần cấu hình. START BSF STATUS,5; trở lại bank 1 MOVLW B’11111111’; 6 bit của port A là I/P (ngõ vào) MOVWF TRISA MOVLW B’00000000’ MOVWF TRISB ; PortB là output (ngõ ra) MOVLW B’11111111’ MOVWF TRISC; portC l à ngõ vào MOVLW B’00000000’ MOVWF TRISD; PortD là output (ngõ ra) MOVLW B’11111111’; 3 bit của port E là I/P (ngõ vào) MOVWF TRISE MOVLW B’00000111’;bộ chia tỉ lệ trước là /256 MOVWF OPTION_R; timer là 1/32sec, có thể dùng lệnh OPTION 97 MOVLW B’00000000’ MOVWF ADCON1; portA bit 0,1,2,3, v à 5 là analog BSF STATUS,6; bank 3 BCF EECON1,7; bộ nhớ dữ liệu EEPROM on BCF STATUS,5 ;trở lại bank 0 BCF STATUS,6 BSF ADCON0,0; bật A/D CLRF PORTA ; xóa PORTA CLRF PORTB ;xóa PORTB CLRF PORTC ;xóa PORTC CLRF PORTD ;xóa PORTD CLRF PORTE ;xóa PORTE ;chương trình chính bắt đầu END; dòng này luôn luôn đặt ở cuối chương trình. Giải thích của HEADER877.ASM *Phần tương đương: . CHúng ta có 5 port. PortC là ô nhớ 7 và ô nhớ TRIS tương ứng, TRISC ô nhớ 87H ở bank 1. Ơ nhớ TRIS thiết lập hướng I/O của các bit port. . Địa chỉ ô nhớ dữ liệu EEPROM được them vào. EEADR là ô nhớ 10Dh ở bank 2, EEDATA là 10Ch ở bank2, EECON1 là ô nhớ 18Ch ở bank 3, EECON2 là ô nhớ 18Dh ở bank 3. . Bit dữ liệu EEPROM được thêm vào, bit đọc RD là bit 0, bit ghi WR là bit 1, WREN ,bit cho phép ghi là bit 2. . Ô nhớ analog ADRES, ADCON0, và ADCON1 được them vào như đã có bit tương ứng CHS0, bit chọn kênh 0, bit 3 và bit GODONE, bit 2. *Phần liệt kê: . Phần này dĩ nhiên chỉ ra vi điều khiển đang được dung , 16F877A và vị trí nhớ đầu tiên là 0. trong địa chỉ 0, lệnh GOTO START hướng dẫn vi điều khiển bỏ qua phần chương trình con và nhảy tới phần cấu hình tại nhãn START. *Phần chương trình con: . Phần này bao gồm chương trình con trì hoãn DELAY1 và DELAYP5 như trước đây (1 giây và 0,5 giây). *Phần cấu hình: . Như trước đây, chúng ta cần chuyển sang bank 1 để định vị ô nhớ TRIS để cấu hình I/O. Port A được thiết lập như ngõ vào với 2 lệnh: MOVLW B’11111111’ MOVWF TRISA portB, portC, portD, và portE được cấu hình theo cách tương tự sử dụng TRISB, TRISC, TRISD và TRISE. . Thanh ghi OPTION được cấu hình với lệnh sau: MOVLW B’00000111’ MOVWF OPTION_R Hay lệnh sau: MOVLW B’00000111’ Option . Thanh ghi A/D được cấu hình với lệnh: MOVLW B’00000000’ MOVWF ADCON1 thiết lập portA bit 0,1,2,3 và 5 như là gõ vào analog. 98 .Chúng ta trở về bank 3 bằng cách chọn bit BSF STATUS,6 (bit 5 vẫn còn là 1) để mà chúng ta có thể định vị EECON1, thanh ghi điều khiển dữ liệu EEPROM. BSF EECON1 sẽ cho phép truy xuất bộ nhớ chương trình EEPROM khi yêu cầu. . Chúng ta sau đó trở lại bank 0 bằng cách xóa bit 5 và bit 6 của thanh ghi trạng thái (STATUS) và xóa các port A, B, C, D, E. Ứng dụng của 16F877A: Điều khiển ngôi nhà xanh. IV.Tổng kết bài: -Tóm tắt các ý chính trong bài. -Chuẩn bị bài mới. V. Câu hỏi và bài tập về nhà: Chương 4: Vào ra. Hoạt động bộ định thời. Lập trình cho vi điều khiển PIC. 1.Viết chương trình chớp tắt 1 led. Hình: kết nối 1 led với vi điều khiển dung chân RB0. Logic 1: led sang. Logic 0: led tắt. 2. Viết chương trình chớp tắt 2 led. 3. Viết chương trình chớp tắt 4 led. Hình: kết nối 4 led với vi điều khiển dung RB0Æ RB3. 4. Viết chương trình đèn chạy đuổi (8 led) dung PORTB điều khiển 8 led. 5. Viết chương trình đèn sang dần (8 led) dung portB điều khiển 8 led. 6. Viết chương trình đèn tắt dần (8 led) dung portB điều khiển 8 led. 7. Viết chương trình đèn chạy 2 bìa vào ra (8 led) dung portB điều khiển 8 led. 8. Viết chương trình tạo sóng vuông có tần số 100Khz ở chân RB0 dùng các lệnh BSF, BCF, NOP và GOTO (không dung timer 0). 9. Viết chương trình tạo thời gian trễ 1 giây dung TMR0. 99 10. Viết chương trình tạo thời gian trễ 0,5 giây. 11. Viết chương trình tạo song vuông có tần số 10 Khz ở chân RB0 dùng timer 0. 12. Viết chương trình tạo song vuông có tần số 1 Khz ở chân RB0 dùng timer 0. 13. Viết chương trình tạo xung vuông có chu kì 2 sec (giây) ở chân RB1 dùng timer 0. 14. Viết chương trình tạo song vuông có tần số 500 Hz ở RB1 với chu kì bổn phận D=30 % dùng timer 0 . Chu kì bổn phận offon onon TT T T TD +== 15.Vieát chöông trình 8051 ñeå taïo soùng vuoâng 12 Khz ôû P1.2 duøng timer 0. 16.Thieát keá öùng duïng “turnstile” duøng timer 0 ñeå xaùc ñònh khi ngöôøi thöù 250 ñi vaøo 1 saân. Giaû söû (a) caûm bieán turnstile noái vaøo T0 vaø taïo ra 1 xung moãi laàn turnstile quay, vaø (b) ñeøn ñöôïc noái vaøo chaân RB7 (PORTB, 7) maø seõ saùng khi RB7=1 vaø taét neáu ngöôïc laïi. Ñeám caùc “söï kieän “ ôû T0 vaø laøm saùng ñeøn ôû RB7 khi ngöôøi thöù 250 ñi vaøo saân (xem hình veõ) PIC 16F877A turnstile (1 xung/ 1 laàn quay) 0=off Ñeøn 1=on VI. Rút kinh nghiệm: (về thời gian, nội dung, phương pháp, chuẩn bị) Ngày .tháng..năm 2011 Ngày .tháng..năm 2011 Bộ môn Giảng viên soạn T0 RB7 (RA4/T0CKI)

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_vi_xu_ly_p1_6891.pdf