B ảng 2.4: Tóm tắc các lệnh trong vi xử lý
2.6.4. Thiết kế chương trình sử dụng các ngắt
Các lỗi thường xảy ra trong thiết kế hệ thống thường liên quan đến các ngắt. Vì chúng ta đang sử dụng các ngắt các ví dụ sẽ hoàn chỉnh và được thực thi độc lập. Mỗi 1 chương trình bắt đầu ởđịa chỉ 0000H với giả thiết là chương trình bắt đầu được thực thi sau khi hệ thống reset. Ý tưởng cuối cùng là các chương trình này phát triển cho các ứng dụng chính thức, chúng được thường trú tong ROM hoặc EPROM.
Khuôn mẫu:
LJMP MAIN
…. ; các điểm nhập của ISR
ORG 0030H ; điểm nhập của chương trình chính MAIN: ; chương trình chính bắt đầu
…
Lệnh đầu tiên nhảy đến địa chỉ 0030H ngay trên các vecto ngắt nơi các ISR bắt đầu, như được trình bày bảng vecto ngắt
Nếu chỉ có 1 nguyên nhân ngăt được dùng ví dụ ngắt do bộ định thời 0 thì khuôn mẫu trình bày dưới đây:
ORG 0000H ; reset LJMP MAIN
ORG 000BH ; điểm nhập của ngắt do bộđịnh thời 0 TOISR: ; bắt đầu ISR cho bộđịnh thời 0
RETI ; trở về chương trình chính MAIN: ; chương trình chính
Nếu có nhiều ngắt được sử dụng ta phải cẩn thận để bảo đảm các ISR được bắt đầu đúng vị trí và không tràn sang ISR kế. Vì chỉ có 1 ngắt được sử dụng trong ví dụ trên, chương trình chính có thể bắt đầu ngay sau lênh RETI.
Các trình phục vụ ngắt kích thước lớn
Nếu 1 trình phục vụ ngắt dài hơn 8 byte được cần đến, ta phải di chuyển chương trình này đến 1 nơi khác trong bộ nhớ chương trình hoặc ta có thể cho lấn qua điểm nhập của ISR kế. Điển hình ISR bắt đầu với 1 lệnh nhảy đến 1 vùng khác của bộ nhớ chương trình, ở đó ISR được trãi rộng nếu cần. Nếu chỉ khảo sát bộđịnh thời không, khuôn mẫu sau đây có thể được sử dụng:
ORG 0000H ; reset LJMP MAIN
ORG 000BH ; điểm nhập của ngắt do bộđịnh thời 0 LJMP T0ISR
ORG 0030H ; phía trên các vecto ngắt MAIN: ; chương trình chính
…
RETI ; trở về chương trình chính
Ví dụ 6.1: tạo sóng vuông sử dụng các ngắt do bộ định thời. viết chương trình tạo ra sóng vuông 10kHz trên P1.0 sử dụng định thời 0.
Các ngắt do bộ định thời xuất hiện khi các thanh ghi định thời (TLx/THx) tràn và set cờ tràn TFx = 1.
ORG 0 ; điểm nhập reset
LJMP MAIN ; nhảy qua khỏi các vecto ngắt
ORG 000BH ; vecto ngắt của bộđịnh thời 0 T0ISR: CPL P1.0 ; lấy bù RETI ORG 0030H ; điểm nhập của chương trình chính MAIN : MOV TMOD, #02H ; chếđộ 2 của bộđịnh thời 0 MOV TH0, #-50 ; trì hoãn 50μs SETB TR0 ; bộđịnh thời hoạt động
MOV IE, #82H ; cho phép ngắt do bộđịnh thời 0
SJMP $ ; không làm gì