- Vật liệu thiết yếu:
- Ngắt là gì và sử dụng chúng ở đâu:
- Sơ đồ mạch và giải thích:
- Mô phỏng các ngắt trong Vi điều khiển PIC:
- Giải thích mã:
- Hoạt động của ngắt PIC16F877A:
Trong hướng dẫn này, chúng ta sẽ học cách sử dụng Ngắt ngoài trong Vi điều khiển PIC và tại sao / ở đâu chúng ta sẽ cần chúng. Đây là một phần của chuỗi Hướng dẫn PIC trong đó chúng ta bắt đầu học Vi điều khiển PIC từ đầu; do đó, hướng dẫn này giả định rằng bạn đã quen với cách lập trình MCU PIC bằng MPLABX và cách giao tiếp màn hình LCD với PIC. Nếu không, vui lòng quay trở lại các liên kết tương ứng của họ và đọc hết chúng, vì tôi sẽ bỏ qua hầu hết thông tin đã được đề cập ở đó.
Vật liệu thiết yếu:
- PIC16F877A Bảng hoàn hảo
- Màn hình LCD 16x2
- Nút ấn
- Kết nối dây
- Bảng bánh mì
- PicKit 3
Ngắt là gì và sử dụng chúng ở đâu:
Trước khi tìm hiểu cách lập trình ngắt vi điều khiển PIC, chúng ta hãy hiểu Ngắt thực sự là gì và chúng ta cần sử dụng chúng ở đâu. Hơn nữa, có rất nhiều loại ngắt trong Vi điều khiển và PIC16F877A có khoảng 15 loại trong số đó. Bây giờ chúng ta đừng nhầm lẫn tất cả chúng trong đầu.
Vì thế! ngắt trong Vi điều khiển là gì?
Như chúng ta đã biết vi điều khiển được sử dụng để thực hiện một tập hợp các kích hoạt được xác định trước (được lập trình) để kích hoạt các đầu ra cần thiết dựa trên đầu vào. Tuy nhiên, trong khi Bộ vi điều khiển của bạn đang bận thực thi một đoạn mã, có thể xảy ra tình huống khẩn cấp mà đoạn mã khác của bạn cần được chú ý ngay lập tức. Đoạn mã khác cần được chú ý ngay lập tức này sẽ được coi là một đoạn mã ngắt.
Ví dụ: Hãy để chúng tôi xem xét rằng bạn đang chơi trò chơi yêu thích của mình trên thiết bị di động và bộ điều khiển (giả định) bên trong điện thoại của bạn đang bận rộn ném tất cả đồ họa cần thiết để bạn thưởng thức trò chơi. Nhưng, đột nhiên bạn gái của bạn gọi đến số của bạn. Bây giờ, điều tồi tệ nhất có thể xảy ra là bộ điều khiển điện thoại của bạn bỏ qua cuộc gọi của bạn gái vì bạn đang bận chơi game. Để ngăn cơn ác mộng này xảy ra, chúng tôi sử dụng một thứ gọi là ngắt.
Các ngắt này sẽ luôn là danh sách hoạt động cho một số hành động cụ thể xảy ra và khi chúng xảy ra, chúng thực thi một đoạn mã và sau đó trở lại chức năng bình thường. Đoạn mã này được gọi là quy trình dịch vụ ngắt (ISR). Một dự án thực tế trong đó bắt buộc phải ngắt là “Mạch đồng hồ tốc độ kỹ thuật số và đồng hồ đo tốc độ sử dụng vi điều khiển PIC”
Trong Vi điều khiển có hai loại ngắt chính. Chúng là Ngắt ngoài và Ngắt trong. Các ngắt bên trong xảy ra bên trong Microntroller để thực hiện một tác vụ, ví dụ như Ngắt bộ hẹn giờ, Ngắt bộ ADC, v.v.. Những ngắt này được phần mềm kích hoạt để hoàn thành hoạt động Bộ định thời hoặc hoạt động ADC tương ứng.
Ngắt bên ngoài là ngắt có thể được kích hoạt bởi người dùng. Trong chương trình này, chúng ta sẽ học cách sử dụng Ngắt ngoài bằng cách sử dụng một nút nhấn để kích hoạt ngắt. Chúng tôi sẽ sử dụng màn hình LCD để hiển thị các số tăng dần từ 0 đến 1000 và khi một ngắt được kích hoạt, chúng tôi nên thông báo về điều đó từ ISR của Quy trình Dịch vụ Ngắt và sau đó tiếp tục quay lại để tăng các số.
Sơ đồ mạch và giải thích:
Sơ đồ mạch sử dụng ngắt PIC16F877 được cho trong hình trên. Bạn chỉ cần kết nối LCD với PIC như chúng tôi đã làm trong hướng dẫn giao tiếp LCD.
Bây giờ để kết nối chân ngắt, chúng ta nên nhìn vào biểu dữ liệu để biết chân nào của PIC được sử dụng cho ngắt ngoài. Trong trường hợp của chúng ta, tôi n PIC16F877A, chân thứ 33 RBO / INT được sử dụng cho ngắt bên ngoài. Bạn không thể sử dụng bất kỳ ghim nào khác ngoài ghim này. Kết nối chân cho sơ đồ mạch này được hiển thị trong bảng dưới đây.
S.Không: |
Số PIN |
Tên ghim |
Kết nối với |
1 |
21 |
RD2 |
RS của LCD |
2 |
22 |
RD3 |
E của LCD |
3 |
27 |
RD4 |
D4 của LCD |
4 |
28 |
RD5 |
D5 của LCD |
5 |
29 |
RD6 |
D6 của LCD |
6 |
30 |
RD7 |
D7 của LCD |
7 |
33 |
RBO / INT |
Nút ấn |
Chúng tôi đã bật điện trở kéo lên bên trong trên Cổng B, do đó chúng tôi có thể kết nối trực tiếp chân RB0 với đất thông qua một nút Đẩy. Vì vậy, bất cứ khi nào chân này bị THẤP, một ngắt sẽ được kích hoạt.
Các kết nối có thể được thực hiện trên bảng bánh mì như hình dưới đây.
Nếu bạn đã theo dõi các hướng dẫn của chúng tôi, bạn nên làm quen với bảng Perf này mà tôi đã sử dụng ở đây. Nếu không, bạn không cần phải suy nghĩ nhiều về nó chỉ cần làm theo sơ đồ mạch và bạn sẽ có được mọi thứ hoạt động.
Mô phỏng các ngắt trong Vi điều khiển PIC:
Mô phỏng cho dự án này được thực hiện bằng Proteus.
Khi bạn mô phỏng dự án, bạn sẽ thấy một dãy số được tăng dần trên màn hình LCD. Điều này xảy ra bên trong vòng lặp chính và bất cứ khi nào nhấn nút nhấn, màn hình LCD sẽ hiển thị rằng nó đã vào ISR. Bạn có thể thực hiện các sửa đổi của mình trong mã và thử kiểm tra nó tại đây.
Giải thích mã:
Mã hoàn chỉnh cho dự án này có thể được tìm thấy ở cuối hướng dẫn này. Tuy nhiên, chương trình được chia thành các phần quan trọng và được giải thích bên dưới để bạn hiểu rõ hơn.
Giống như tất cả các chương trình, chúng ta phải bắt đầu mã bằng cách xác định cấu hình chân cho các chân mà chúng ta sử dụng trong chương trình của mình. Ngoài ra ở đây chúng ta cần xác định rằng chúng ta đang sử dụng RB0 / INT làm chân ngắt bên ngoài chứ không phải là chân đầu vào hoặc đầu ra. Dòng mã dưới đây kích hoạt điện trở kéo lên bên trong trên portB bằng cách đặt bit thứ 7 là 0.
OPTION_REG = 0b00000000;
Sau đó, chúng tôi kích hoạt các ngắt Toàn cầu / Ngoại vi và khai báo rằng chúng tôi đang sử dụng RB0 làm chân ngắt bên ngoài.
GIE = 1; // Bật ngắt toàn cục PEIE = 1; // Bật ngắt ngoại vi INTE = 1; // Bật RB0 làm chân ngắt bên ngoài
Khi chân RB0 được xác định là chân ngắt bên ngoài, mỗi khi nó xuống mức thấp, cờ ngắt bên ngoài INTF sẽ trở thành 1 và mã bên trong hàm ngắt void sẽ được thực thi vì Quy trình dịch vụ ngắt (ISR) sẽ được gọi.
void ngắt ISR_example () {if (INTF == 1) // Đã phát hiện ngắt ngoài {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR đã nhập"); INTF = 0; // xóa cờ ngắt sau khi thực hiện xong __delay_ms (2000); Lcd_Clear (); }}
Như bạn thấy, tôi đã đặt tên cho hàm ngắt là ISR_example. Bạn có thể đặt tên cho nó theo ý muốn của bạn. Bên trong hàm ngắt, chúng ta sẽ kiểm tra xem cờ INTF có cao hay không và thực hiện các hành động cần thiết. Điều rất quan trọng là phải xóa cờ ngắt khi bạn đã hoàn tất quy trình. Chỉ sau đó chương trình sẽ quay trở lại chức năng chính void. Việc xóa này phải được thực hiện bằng phần mềm sử dụng dòng
INTF = 0; // xóa cờ ngắt sau khi thực hiện xong
Bên trong chức năng chính, chúng tôi chỉ tăng một số cho mỗi 500 ms và hiển thị nó trên màn hình LCD. Chúng tôi không có bất kỳ dòng cụ thể nào để kiểm tra trạng thái của chân RB0. Ngắt sẽ luôn hoạt động và bất cứ khi nào nhấn nút nhấn, nó sẽ nhảy ra khỏi void main và thực hiện các dòng trong ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Vòng lặp chính bên trong"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Số:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); số ++;
Hoạt động của ngắt PIC16F877A:
Khi bạn đã hiểu cách hoạt động của ngắt, bạn có thể thử nó trên phần cứng và tìm hiểu xung quanh nó. Chương trình này được đưa ra ở đây là một ví dụ rất cơ bản về ngắt bên ngoài, nơi nó chỉ thay đổi hiển thị của màn hình LCD khi phát hiện ngắt.
Hoạt động hoàn chỉnh của dự án có thể được tìm thấy trong video dưới đây, hy vọng bạn đã hiểu về các ngắt và nơi / cách sử dụng chúng. Nếu bạn có bất kỳ nghi ngờ nào, bạn có thể liên hệ với tôi thông qua các diễn đàn hoặc thông qua phần bình luận.