- BRR TBCK RBCK SPD SRC
4. Thiết kế chương trình dùng ngắt Các bước khi thực hiện một ngắt.
4.1 Các trình phục vụ ngắt kích thước nhỏ.
Các trình phục vụ ngắt phải được bắt đầu ở gần đáy của bộ nhớ chương trình tại các địa chỉ qui định. Mặc dù chỉ có 8 byte giữa các điểm nhập của các trình phục vụ ngắt, dung lượng này thường đủ để thực hiện các công việc được u cầu và quay trở về chương thình chính từ một trình phục vụ ngắt. Điều này có nghĩa là trình phục vụ ngắt cho các ngắt tương ứng thường khơng dài q 8 byte.
Nếu có nhiều ngắt được dùng ta phải cẩn thận để đảm bảo các ISR được bắt đầu đúng vị trí mà khơng tràn sang ISR kế.
Ví dụ:
ORG 0000H ; điểm nhập reset LJMP MAIN
ORG 000BH ; điểm nhập ngắt bộ định thời 0 T0_ISR : ; bắt đầu ISR cho bộ định thời 0 MOV P2,#00001111B RETI ; trở về chương trình chính MAIN : ; chương trình chính . . END ; kết thúc chương trình 4.2 Các trình phục vụ ngắt kích thước lớn.
Nếu một trình phục vụ ngắt dài hơn 8 byte được cần đến, ta phải di chuyển phương trình này đến một 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 là ISR bắt đầu với một lệnh nhảy đến một vùng khác của bộ nhớ chương trình, ở đó ISR được trải rộng nếu cần.
Ví dụ 1:
ORG 0000H ; điểm nhập reset LJMP MAIN
ORG 000BH ; điểm nhập ngắt do timer 0 LJMP T0_ISR
; điểm nhập các ngắt khác ( nếu có ) ORG 0030H ; địa chỉ phía trên các vector ngắt MAIN: ; chương trình chính
T0_ISR: ; chương trình con phụ vụ ngắt ; do bộ định thời 0
RETI ; quay về chương trình chính END
Ví dụ 2:
Viết chương trình tạo sóng vng có tần số 10KHz trên chân P1.0 sử dụng bộ định thời 0 và ngắt do bộ định thời 0.
ORG 0000H ; điểm nhập reset LJMP MAIN
ORG 000BH ; điểm nhập ngắt timer 0 T0_ISR: ; ISR timer 0
CPL P1.0 ; đảo bit P1.0 RETI ; trở về chương trình chính MAIN:
MOV TMOD,#00000010B; timer 0 hoạt động ở chế độ 2 (8 bit) MOV TH0,#-50 ; giá trị nạp lại tương ứng với 50us
MOV IE,#10000010B ; cho phép ngắt do bộ định thời 0 SETB TR0 ; bật timer 0
SJMP $ ; nhảy tại chổ END
Ví dụ 3: Viết chương trình sử dụng các ngắt để tạo ra đồng thời các dạng sóng vng có tần số là 10KHz trên chân P1.0 và 500Hz trên chân P1.1
ORG 0000H LJMP MAIN ORG 000BH LJMP NGAT_T0 ORG 001BH LJMP NGAT_T1 ORG 0030H MAIN:
MOV TMOD,#00010010B; timer 1 chế độ 1, timer 0 chế độ 2 MOV TH0,#-50 MOV TH1,#HIGH(-1000) MOV TL1,#LOW(-1000) MOV IE,#10001010B SETB TR0 SETB TR1 SJMP $ NGAT_T0: CPL P1.0 RETI NGAT_T1: CLR TR1 MOV TH1,#HIGH(-1000) MOV TL1,#LOW(-1000) SETB TR1 CPL P1.1 RETI END 5. Luyện tập
Viết chương trình điều khiển sóng vng tuần hồn có tần số 10Hz (sử dụng ngắt Timer) tại chân P0.0 và hiển thị mức logic tại chân này lên LED0 (LED0 được nối với P0.0).
Trình tự tiến hành thí nghiệm:
Bước 2: Tắt nguồn cấp cho kít thí nghiệm. Bước 3: Dùng dây bus 8 nối
Bước 4: Dùng dây bus
Bước 5: Vẽ lưu đồ giải thuật và viết chương trình điều khiển ORG 0000H ;DIEM NHAP RESET
DJMP MAIN
ORG 0BH ;DIEM NHAP ISR TIMER0 T0ISR:
CPL P0.0 ;DAO TRANG THAI P0.0 (TAO XUNG) RETI
ORG 30H ;DIEM NHAP CHUONG TRINH CHINH MAIN:
MOV TMOD,#01H;TIMER0 LA TIMER 16 BIT
MOV TH0,#(-50000);THỜI GIAN TRE -50MS (THOI GIAN XUNG O MUC THAP HOAC MUC CAO) MOV TL0,#CHU KY -2x50 =100 MS LA F = 10Hz
SETB TR0 ;CHO TIMER BAT DAU CHAY
MOV IE,#82H ;CHO PHEP NGAT TIMER0 HOAT DONG SJMP $ ;DUNG YEN
END
Bước 6: Lưu chương trình và biên dịch chương trình. Bước 7: Kiểm tra lỗi và hiệu chỉnh lỗi nếu có.
Bước 8: Gắn chip vi điều khiển thí nghiệm vào socket tương ứng trên khối nạp chip và bật nguồn cho khối nạp chip hoạt động.
Bước 9: Nạp chương trình vào vi điều khiển.
Bước 10: Sử dụng vi điều khiển vừa nạp gắn vào socket tương ứng tren khối vi điều khiển.
Bước 11: Bật nguồn cho mơ hình thí nghiệm. Quan sát kết quả hoạt động, nếu kết quả hoạt động khơng đúng u cầu của đề bài thì phải quay lại kiểm tra việc kết nối mạch, hiệu chỉnh chương trình và làm lại các bước từ bước 3 đến bước 9.