Bộ hẹn giờ và ngắt (PIC16F84A)
Module Đếm Thời Gian (Timer):
Một Timer là một module đơn giản được bao gồm cùng với hầu hết các vi điều khiển. Một timer có thể được sử dụng như một bộ đếm thời gian/đếm. Kích thước của timer thay đổi từ vi điều khiển này sang vi điều khiển khác. PIC16F84A có một module timer 8 bit. Hoạt động cơ bản nhất của một timer là đếm và không gì khác cả! Trong chế độ timer, module sẽ tự động tăng lên mỗi chu kỳ lệnh (chu kỳ lệnh không giống như chu kỳ xung) và trong chế độ đếm, nó tăng lên mỗi cạnh tăng/giảm của xung được cấp tại chân RA4 (chân thứ 3). Vì nó là một timer 8 bit, nó có thể đếm từ 00h đến FFh (00000000 đến 11111111). Sau FFh, nó thông báo cho vi điều khiển rằng một tràn đã xảy ra (nâng một ngắt) và sau đó quay lại 00h và tiếp tục tiếp tục đếm.
Bộ chia tỷ số (Prescaler):
Bộ chia tỷ số cũng là một bộ đếm 8 bit. Nó không thể đọc hoặc ghi được nhưng nó được thiết lập thông qua các bit cấu hình của thanh ghi OPTION_REG. Nói một cách đơn giản, nó có thể được sử dụng để tỷ lệ module timer như chúng ta tỷ lệ các bảng đồ thị của mình. Ví dụ, timer tăng lên mỗi chu kỳ lệnh và chúng ta biết rằng vi điều khiển có khả năng thực thi một số triệu lệnh mỗi giây. Vì timer là một bộ đếm 8 bit, nó tràn sớm hơn chúng ta nghĩ! Để mục đích này, bộ chia tỷ số được sử dụng, với một bộ chia tỷ số 1:8, timer sẽ tăng lên mỗi 8 chu kỳ lệnh. Vì vậy, timer sẽ tràn chậm hơn so với kịch bản trước đó.
Ngắt Timer:
Hiện nay rõ ràng rằng timer sẽ nâng một ngắt khi đếm từ FFh lên 00h. Để cho biết rằng một tràn đã xảy ra, timer sẽ đặt bit thứ hai của thanh ghi INTCON. Nhưng bit này phải được xóa trong ISR (Interrupt Service Routine) tiếp theo trước khi ngắt có thể được kích hoạt lại.
Ngắt (Interrupts):
Ngắt có thể được coi là một công việc ưu tiên cao đối với vi điều khiển. Nếu vi điều khiển đang thực thi một chương trình và nếu một ngắt xảy ra, thì nó sẽ xử lý ngắt đó và tiếp tục với chương trình. (Tương tự như khi bạn đang xem một bộ phim trên máy tính của mình, và một người đưa thư gọi bạn - bạn làm gì? Dừng phim, đi lấy thư và trở lại và tiếp tục xem phim. Như vậy, bạn có thể nhận được nhiều ngắt.) Ví dụ, giả sử rằng vi điều khiển của bạn đang thực thi một chương trình dài. Nhưng một thiết bị ngoại vi được kết nối với vi điều khiển cần gấp kết quả của một số phép toán phức tạp, bây giờ thiết bị ngoại vi sẽ nâng một ngắt bằng cách cung cấp địa chỉ bắt đầu của vị trí của vấn đề của nó trong bộ nhớ. Vi điều khiển sau đó sẽ thực hiện công việc tính toán đó cho thiết bị ngoại vi (Đây được gọi là ISR - Interrupt Service Routine) và sau đó tiếp tục thực thi chương trình của nó từ nơi nó dừng lại. Bây giờ, làm sao vi điều khiển biết nơi nó dừng chương trình? Ở đây, vi điều khiển của bạn là thông minh! Nó lưu trữ nội dung của bộ đếm lệnh của nó (địa chỉ bộ nhớ của lệnh tiếp theo sẽ được thực thi) vào một ngăn xếp và khi hoàn thành quy trình ngắt dịch vụ mà luôn kết thúc với RETURN, vi điều khiển lấy địa chỉ bộ nhớ của lệnh tiếp theo và tiếp tục thực thi chương trình.
PIC16F84A có bốn nguồn ngắt:
Có một thanh ghi gọi là INTCON để điều khiển (kích hoạt/tắt) và ghi lại các ngắt này.
Ngắt RB0 có thể được kích hoạt/tắt bằng cách đặt/xóa bit thứ tư của thanh ghi INTCON. Khi có một ngắt được kích hoạt theo cạnh trên RB0, sau đó bit đầu tiên của thanh ghi INTCON sẽ được đặt (Điều này phải được xóa trong ISR trước khi kích hoạt lại ngắt này).
Như đã nói trước đó, tràn timer sẽ đặt bit thứ hai của thanh ghi INTCON. Ngắt này có thể được kích hoạt/tắt bằng cách đặt/xóa bit thứ năm của thanh ghi INTCON.
Một sự thay đổi đầu vào tại các chân PortB 7 đến 4 sẽ đặt bit thứ không của thanh ghi INTCON và ngắt này có thể được điều khiển bằng bit thứ ba của thanh ghi INTCON.
Sau khi hoàn thành chu kỳ ghi dữ liệu EEPROM, một cờ ngắt được đặt. Ngắt này được điều khiển bởi bit thứ sáu của thanh ghi INTCON.
Hotline: 0979 466 469