THIẾT KẾ CHƯƠNG TRÌNH DÙNG CÁC NGẮT:

Một phần của tài liệu Đồ án thiết bị báo cháy và điều khiển tự động báo cháy qua điện thoại bằng vi điều khiển (Trang 34 - 36)

Các ví dụ trong các mục trưĩc đã khơng sử dụng các ngắt nhưng đã cĩ vịng lặp đợi để kiểm tra các cờ báo tràn (TFO hoặc TF1) hoặc các cờ thu và cờ phát Port nối tiếp (TI và RI). Vấn đề trong phương pháp này là thời gian thực thi cĩ gía trị của CPU hồn tồn khơng bị tiêu tốn trong việc đợi các cờ. Điều này hồn tồn khơng thích hợp với các ứng dụng của vi điều khiển, trong đĩ bộ vi điều khiển phải tương tác với nhiều thiết bị xuất nhập đồng thời.

Trong phần này ta sẽ khảo sát cách phát triển chương trình dùng vi điều khiển.

Khung đề nghị cho một chương trình phục vụ ngắt như sau: ORS 0000H ; điểm vào Reset.

Ljmp main; các điểm vào ISR.

Main: chương trình chính bắt đầu.

Lệnh thứ nhất nhảy tới địa chỉ 0030H, vừa trên các vị trí mà các ISR bắt đầu. Như được vẽ hình sau, chương trình chính bắt đầu ở địa chỉ 0030H.

1.Chương trình phục vụ ngắt cĩ kích thước nhỏ :

Các chương trình phục vụ ngắt phải bắt đầu ở gần phần đầu của bộ nhớ chương trình ở các địa chỉ trong bảng các vectơr ngắt. Mặt dù cĩ 8 byte ở các điểm vào ngắt, thường đủ bộ nhớ để thực hiện các hoạt động mong muốn và quay về chương trình chính từ IRS.

Nếu chỉ cĩ một nguồn ngắt được sử dụng, ví dụ timer 0, thì cĩ thể sử dụng khung sau:

ORS 000H; Reset LJMP MAIN

ORG 000BH; điểm vào time 0 TOIRS: ; ISR cho time 0 bắt đầu. RETI; quay về chương trình chính. MAIN: Chương trình chính.

Nếu sử dụng nhiều ngắt phải đảm bảo là chúng phải bắt đầu từ vị trí đúng và khơng chạy qua ISR kế. Vì chỉ cĩ một ngắt được sử dụng trong ví dụ trên, chương trình chính cĩ thể bắt ngay sau lệnh RETI.

Chương trình chính Các điểm vào Reset và ngắt LJMP main FFFFH 0030H 0029H 0000H Hình : Tổ chức bộ nhớ khi dùng các ngắt

2. Các chương trình phục vụ ngắt cĩ kích thước lớn:

Nếu ISR dài hơn 8 byte, cĩ thể cần chuyển nĩ tới một nơi nào đĩ trong bộ nhớ chương trình hoặc cĩ thể để nĩ đi lố qua điểm vào của ngắt kế. Tiêu biểu là ISR bắt đầu với lệnh nhảy đến vùng nhớ khác ở đĩ cĩ thể mở rộng chiều dài các ISR. Ví dụ lúc này chỉ xét timer 0, cĩ thể sử dụng khung sau:

ORS 000H; Reset LJMP MAIN

ORG 000BH; các vector ngắt tiếp theo. MAIN:

TOISR: ; ISR cho time 0.

RETI: ; quay về chương trình chính.

Để đơn giản chương trình chỉ làm vệc một lúc ban đầu. Chương trình khởi động Timer, Port nối tiếp và các thanh ghi ngắt cho thích hợp và rồi khơng làm gì cả. Cơng vệc được hồn tồn làm trong ISR. Sau các khởi động, chương trình chứa các lệnh sau:

HERE: SJMP HERE Hay dạng viết gắn gọn:

SJMP

Khi ngắt xảy ra, chương trình chính bị ngắt quảng tạm thời trong khi ISR thực thi. Lệnh RETIở cuối ISR trả điều khiển về chương trình chính và nĩ tiếp tục khơng làm gì cả. Trong nhiều ứng dụng điều khiển, nhiều cơng việc thật ra được thực hiện hồn tồn trong ISR.

Vì sử dụng ngắt, nên lệnh SJMP (HERE: SJMP HERE) cĩ thể được thay thế bằng các lệnh thực hiện cơng việc khác trong ứng dụng.

Một phần của tài liệu Đồ án thiết bị báo cháy và điều khiển tự động báo cháy qua điện thoại bằng vi điều khiển (Trang 34 - 36)