Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

Tìm hiểu về ngắt trong MSP430

E-mail Print PDF
[​IMG]1,Khái niệm:
- Interrupt (ngắt): Là một sự kiện gây bởi phần cứng (mặc dù được cài đặt bằng phần mềm) và thường cần được xử lý ngay lập tức.Khi phát hiện ngắt, chương trình chính tạm dừng để thực hiện 1 chương ngắt. Khi thực hiện xong trở về chương trình hiện tại.

2,Các loại ngắt:
- Gây ra bởi ngắt trong con chip hoặc ngắt ngoài.
+ ADC, TIMER: Ngắt trong.
+ Nút nhấn.. : ngắt ngoài.
- 3 loại ngắt chính:
+ System reset: reset lại toàn bộ hệ thống
+ (Non)-maskable NMI: Ngắt không khả ngụykhông thể cho ngắt, không biết ngắt xảy ra ở đâu và lúc nào => hạn chế sử dụng.
+ Maskable: Ngắt khả ngụy có quyền cho hoặc không cho ngắt liên quan trực tiếp đến chương trình chính.
++ Thanh ghi cho ngắt PxSEL1 , PxSEL2 và các port có khả năng ngắt: port 1 và port 2.
· Sơ đồ :
[​IMG]
3,Vecto ngắt:
-- Cờ ngắt: là một tín hiệu báo cho CPU biết tín hiệu nào đang gây ra ngắt, đang chờ để được ngắt => cờ ngắt tạo ra khi bit cho phép ngắt bật lên, module đang phát ra 1 yêu cầu ngắt.
- BIT cho phép ngắt: PxIE : thanh ghi cho phép module ngắt hoặc phát ra yêu cầu ngắt hoặc sinh ra ngắt.
BIT1: bật lên
BIT0: xóa đi.
**Chú ý: trước đó chúng ta phải bật BIT ngắt toàn cục GIE lên.
es.png
-- Sơ đồ vecto ngắt:
++Địa chỉ 1 chương trình phục vụ ngắt(ISR) được gán với 1 địa chỉ lưu trong bộ nhớ.Tập hợp vecto ngắt là bảng vecto ngắt.
Sơ đồ
[​IMG]
4,Chương trình phục vụ ngắt.
-Xét độ ưu tiên ngắt: độ ưu tiên cao nhất thì thực hiện trước.

**Quy trình:

++ Lưu lại trạng thái PC, SR.
++ Tìm địa chỉ ISR trong bảng vecto ngắt.
++ Xét độ ưu tiên.
++ Thực hiện chương trình ngắt.
++ Khôi phục lại trạng thái PC,SR.
++ RETI. Tiếp tục chương trình chính.

[​IMG]
-- Vì sao lưu trạng thái PC, SR và khôi phục: đê biết được địa chỉ câu lệnh tiếp theo. Khi thực hiện chương trình ngắt xong quay lại địa chỉ câu lệnh đó để thực hiện tiếp chương trình.
5,Các thah ghi ngắt:
-- Những thanh ghi này mình đã giới thiệu ở bài trước, mình chỉ nói sơ lại thôi.hi
---Mỗi chân của P1 và P2 có thể làm một yêu cầu ngắt. Các chân này được thiết lập với các thanh ghi phụ như:
- Cho phép ngắt ( PxIE) :
+ Thanh ghi này cho phép ngắt trên những chân riêng rẽ.
o Bit = 0: không cho phép ngắt.
o Bit = 1: Cho phép ngắt.

+ Mỗi Bit cho phép ngắt PxIE này được liên kết với cờ ngắt PxIFG tương ứng. Việc ghi vào thanh ghi PxOUT và PxDIR có thể ảnh hưởng đến việc điều chỉnh PxIE.
Ví dụ: Để cho phép ngắt chân P1.1 ta viết như sau:
P1IE |= BIT1;

- Thanh ghi lựa chọn ngắt theo sườn ( PxIES) :
++ Thanh ghi cho phép ta lựa chọn sườn lên hoặc xuống xung clock để điều khiển ngắt. ( Nếu PxIE và GIE được Set)
o Bit = 0: Ngắt theo sườn lên
o Bit = 1: Ngắt sườn xuống xuống

- Thanh ghi cờ ngắt ( PxIFG)
-- Mỗi bit trên thanh ghi PxIFG là một cờ ngắt tương ứng với một chân I/O. Các bit trong thanh ghi này được set lên khi có một xung cạnh lên hoạc xung cạnh xuống vào chân I/O tương ứng
o Bit = 0: Không có ngắt. 
· Bit = 1: Có ngắt.

Chú Ý: bạn bật ngắt toàn cục GIE để cho phép ngắt.
_BIS_SR(GIE); // Enable interrupt.


++Gọi hàm thực hiện ngắt,có bố cục giống nhau giữa các hàm ngắt khác nhau

MÃ:
#pragma vector = (Tên hàm ngắt mặc định) //xem cuối bài  __interruptvoid (Tên hàm ngắt do người dùng đặt)(void)  {  //Thực hiện chương trình ngắt  //Hàm xóa cờ ngắt  }
Ví dụ:
MÃ:
#include <msp430g2553.h> long i=0;  void main(void) {     WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer      P1SEL &= ~0x08;                    // Select Port 1 P1.3 (push button)      P1DIR &= ~0x08;                    // Port 1 P1.3 (push button) as input, 0 is input     P1REN |= 0x08;                        // Enable Port P1.3 (push button) pull-up resistor      P1IE |= 0x08;                        // Port 1 Interrupt Enable P1.3 (push button)      P1IFG &= ~0x08;                    // Clear interrupt flag      _BIS_SR(GIE);                           // Enable interrupts      while(1) i++;                          // Execute some useful computation }                                     // Port 1 interrupt service routine #pragma vector=PORT1_VECTOR       __interrupt void Port_1(void) {      P1IFG &= ~0x08;                     // P1.3 Interrupt Flag cleared      i = 0;                             // Reset count }

6, Ngắt trong ngắt.
- Trong ngắt xảy ra một ngắt khác.
++ Thực hiện xong ngắt => thực hiện tiếp tới ngắt có độ ưu tiên cao nhất.
-- Khai báo: Có bao nhiêu ngắt thì có bấy nhiêu ISR.
-- Độ trễ của một ngắt: Khoảng thời gian đưa ra yêu cầu ngắt đến thời gian thực hiện xong ngắt ( khoảng thời gian đợi).

Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương1000 usd

hãy đến với ngành vi mạch tại SEMICON

     HotLine: 0972 800 931 Ms Duyên

 

 

Related Articles

Chat Zalo