- Tại sao chúng ta cần gián đoạn?
- Các loại ngắt trong MSP430
- Điều khiển chương trình ngắt trong MSP430
- Mạch MSP430 để kiểm tra ngắt GPIO
- Lập trình MSP430 cho ngắt
- Tải chương trình lên MSP430 từ CCS
- Chương trình ngắt trên MSP430
Hãy xem xét một chiếc đồng hồ kỹ thuật số đơn giản được lập trình để chỉ hiển thị thời gian cho bạn, bây giờ hãy tưởng tượng bạn muốn thay đổi múi giờ của nó. Bạn sẽ làm gì? Bạn chỉ cần nhấn vào một nút thay đổi trên menu cho phép bạn thay đổi múi giờ. Ở đây, hệ thống không thể dự đoán sự gián đoạn bên ngoài của bạn đối với các quy trình giữ thời gian của nó và không thể yêu cầu bạn đợi vì nó đang bận tăng giá trị giây trên đồng hồ của bạn. Đây là nơi mà các ngắt trở nên hữu ích.
Ngắt không cần phải luôn luôn ở bên ngoài; nó cũng có thể là nội bộ. Hầu hết các lần trong một ngắt nhúng cũng tạo điều kiện giao tiếp giữa hai thiết bị ngoại vi của CPU. Xem xét một bộ hẹn giờ đặt trước được đặt lại và một ngắt được kích hoạt khi thời gian đạt đến giá trị trong thanh ghi bộ định thời. Bộ xử lý ngắt có thể được sử dụng để khởi tạo các thiết bị ngoại vi khác như DMA.
Trong hướng dẫn này, chúng tôi đã sử dụng các ngắt bên ngoài trên MSP430 để chuyển đổi các đèn LED khác nhau. Khi ngắt bên ngoài được đưa ra bởi sự thay đổi trạng thái bằng cách sử dụng một nút nhấn, điều khiển sẽ được chuyển (được sử dụng trước) đến ISR và nó thực hiện những điều cần thiết. Để biết những điều cơ bản như thiết lập môi trường CCS cho bệ khởi chạy MSP430G2, hãy nhấp vào liên kết này để bắt đầu với MSP430 bằng CCS vì chúng tôi sẽ không đi sâu vào chi tiết trong hướng dẫn này. Ngoài ra, hãy xem các hướng dẫn khác dựa trên MSP430 bằng cách sử dụng Energia IDE và CCS bằng cách nhấp vào liên kết.
Tại sao chúng ta cần gián đoạn?
Cần ngắt để tiết kiệm chi phí bỏ phiếu trong một hệ thống nhúng. Chúng được gọi khi các tác vụ có mức độ ưu tiên cao hơn cần được thực thi bằng cách xóa trước tác vụ đang chạy hiện tại. Nó cũng có thể được sử dụng để đánh thức CPU từ chế độ Nguồn điện thấp. Khi nó được đánh thức bởi quá trình chuyển đổi cạnh của tín hiệu bên ngoài qua cổng GPIO, ISR sẽ được thực thi và CPU lại quay trở lại Chế độ Nguồn điện Thấp.
Các loại ngắt trong MSP430
Các ngắt trong MSP430 thuộc các loại sau:
- Thiết lập lại hệ thống
- Ngắt không che được
- Ngắt có thể che
- Các ngắt có Vectored và Non Vectored
Thiết lập lại hệ thống:
Nó có thể xảy ra do điện áp cung cấp (Vcc) và do tín hiệu thấp trong chân RST / NMI với chế độ Đặt lại được chọn và cũng có thể xảy ra do các lý do như tràn bộ đếm thời gian giám sát và vi phạm khóa bảo mật.
Ngắt không che được:
Các ngắt này không thể bị che bởi các lệnh của CPU. Khi đã bật Ngắt chung, ngắt không thể che được sẽ không thể chuyển hướng khỏi quá trình xử lý. Điều này được tạo ra bởi các nguồn như lỗi Bộ tạo dao động và một cạnh được cấp theo cách thủ công cho RST / NMI (ở chế độ NMI).
Ngắt có thể che:
Khi một ngắt xảy ra và nếu nó có thể bị che bởi một lệnh CPU, thì nó là Ngắt có thể che được. Họ không cần phải luôn luôn bên ngoài. Chúng cũng phụ thuộc vào thiết bị ngoại vi và chức năng của chúng. Các ngắt cổng bên ngoài được sử dụng ở đây thuộc loại này.
Ngắt Vectored và Ngắt không Vectored:
Vectored: Trong trường hợp này, các thiết bị ngắt cung cấp cho chúng ta nguồn của ngắt bằng cách chuyển địa chỉ vector ngắt. Ở đây địa chỉ của ISR được cố định và điều khiển được chuyển đến địa chỉ đó và ISR sẽ lo phần còn lại.
Non-Vectored: Ở đây tất cả các ngắt đều có ISR chung. Khi một ngắt xảy ra từ một nguồn không có vectơ, điều khiển được chuyển đến địa chỉ chung, nơi mà tất cả các ngắt Không có vectơ cùng chia sẻ.
Điều khiển chương trình ngắt trong MSP430
Khi ngắt xảy ra, MCLK được BẬT và CPU được gọi trở lại từ trạng thái TẮT. Khi điều khiển chương trình được chuyển đến địa chỉ ISR sau khi xảy ra ngắt, các giá trị trong bộ đếm chương trình và thanh ghi trạng thái được chuyển vào ngăn xếp.
Liên tục, thanh ghi trạng thái được xóa, do đó xóa GIE và chấm dứt chế độ năng lượng thấp. Ngắt có mức ưu tiên cao nhất được chọn và thực hiện bằng cách đặt địa chỉ vectơ ngắt vào bộ đếm chương trình. Trước khi chúng ta đến với Mã ví dụ ngắt GPIO MSP430 của mình , điều quan trọng là phải hiểu hoạt động của các thanh ghi Cổng liên quan đến nó.
Đăng ký cổng cho điều khiển GPIO trên MSP430:
PxDIR: Nó là một thanh ghi điều khiển hướng cổng. Nó cho phép người lập trình chọn cụ thể chức năng của nó bằng cách viết 0 hoặc 1. Nếu một chân được chọn là 1, thì nó sẽ hoạt động như một đầu ra. Coi cổng 1 là một cổng 8 bit, và nếu các chân 2 và 3 được gán làm cổng ra, thì thanh ghi P1DIR phải được đặt với giá trị 0x0C.
PxIN: Nó là một thanh ghi chỉ đọc và các giá trị hiện tại trong cổng có thể được đọc bằng cách sử dụng thanh ghi này.
PxOUT: Thanh ghi cụ thể này có thể được sử dụng để ghi trực tiếp các giá trị vào các cổng. Điều này chỉ khả thi khi thanh ghi kéo lên / kéo xuống bị vô hiệu hóa.
PxREN: Nó là một thanh ghi 8 bit được sử dụng để bật hoặc tắt thanh ghi pullup / pulldown. Khi một chân được đặt là 1 trong cả thanh ghi PxREN và PxOUT, thì chân cụ thể sẽ được kéo lên.
PxDIR |
PxREN |
PxOUT |
Cấu hình I / O |
0 |
0 |
X |
Đầu vào với điện trở bị tắt |
0 |
1 |
0 |
Nhập liệu có bật tính năng kéo xuống bên trong |
0 |
1 |
1 |
Đầu vào có bật kéo nội bộ |
1 |
X |
X |
Đầu ra - PxREN không có tác dụng |
PxSEL và PxSEL2: Vì tất cả các chân trong MSP430 đều được ghép kênh, nên phải chọn chức năng cụ thể trước khi sử dụng nó. Khi cả hai thanh ghi PxSEL và PxSEL2 được đặt là 0 cho một chân cụ thể, thì mục đích I / O chung được chọn. Khi PxSEL được đặt là 1, chức năng ngoại vi chính được chọn, v.v.
PxIE: Nó cho phép hoặc vô hiệu hóa ngắt cho một chân cụ thể trong một cổng x.
PxIES: Nó chọn cạnh mà tại đó ngắt được tạo ra. Đối với 0, cạnh lên được chọn và đối với 1, cạnh xuống được chọn.
Mạch MSP430 để kiểm tra ngắt GPIO
Mạch MSP430 được sử dụng để kiểm tra mã Ví dụ về ngắt MSP430 của chúng tôi được hiển thị bên dưới.
Tiếp đất của bảng được sử dụng để nối đất cho cả đèn LED và nút. Các cạnh đối diện theo đường chéo của nút nhấn là các thiết bị đầu cuối thường mở và được kết nối khi nhấn nút nhấn xuống. Một điện trở được kết nối trước đèn LED để tránh đèn LED tiêu thụ dòng điện cao. Thông thường, người ta sử dụng điện trở thấp trong khoảng 100ohm - 220ohm.
Chúng tôi sử dụng 3 mã khác nhau để hiểu rõ hơn về các ngắt cổng. Hai mã đầu tiên sử dụng cùng một mạch như trong Sơ đồ mạch 1. Chúng ta hãy đi sâu vào mã. Sau khi kết nối được thực hiện, thiết lập của tôi trông như thế này.
Lập trình MSP430 cho ngắt
Chương trình ngắt MSP430 hoàn chỉnh có thể được tìm thấy ở cuối trang này, giải thích về mã như sau.
Dòng dưới đây dừng hoạt động của bộ đếm thời gian cơ quan giám sát. Bộ đếm thời gian của cơ quan giám sát thường thực hiện hai hoạt động. Một là ngăn bộ điều khiển khỏi các vòng lặp vô hạn bằng cách đặt lại bộ điều khiển và cách khác là nó kích hoạt các sự kiện định kỳ bằng cách sử dụng bộ đếm thời gian có sẵn. Khi một bộ vi điều khiển được đặt lại (hoặc được cấp nguồn), bộ vi điều khiển sẽ ở chế độ hẹn giờ và có xu hướng đặt lại MCU sau 32 mili giây. Dòng này ngăn bộ điều khiển làm điều đó.
WDTCTL = WDTPW + WDTHOLD;
Đặt thanh ghi P1DIR thành giá trị 0x07 sẽ đặt hướng của pin0, pin1 và pin2 làm đầu ra. Đặt P1OUT thành 0x30 định cấu hình nó là một đầu vào với các điện trở kéo lên bên trong được bật trên pin4 và pin5. Đặt P1REN thành 0x30 cho phép kéo lên bên trong trên các chân này. P1IE cho phép ngắt, trong đó P1IES chọn chuyển tiếp cao xuống thấp làm cạnh ngắt trên các chân này.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Dòng tiếp theo cho phép chế độ nguồn thấp và bật GIE trong thanh ghi trạng thái để có thể nhận các ngắt.
__bis_SR_register (LPM4bits + GIE)
Bộ đếm chương trình được thiết lập với địa chỉ của vector cổng 1 bằng cách sử dụng macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Đoạn mã dưới đây chuyển đổi từng đèn LED được kết nối với pin0, pin1, pin2 từng cái một.
if (đếm% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; tính ++; } else if (đếm% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; tính ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; tính ++; }
Sơ đồ mạch 2:
Tương tự, hãy thử một mã pin khác để hiểu khái niệm tốt hơn nhiều. Vì vậy, ở đây nút nhấn được kết nối với chân 2.0 thay vì chân 1.5. mạch được sửa đổi như sau. Một lần nữa mạch này được sử dụng để kiểm tra chương trình ngắt nút MSP430.
Ở đây cổng 2 được sử dụng cho đầu vào. Vì vậy, vectơ ngắt khác nhau phải được sử dụng. P1.4 và P2.0 lấy đầu vào.
Vì cổng 2 chỉ được sử dụng cho đầu vào, P2DIR được đặt là 0. Để đặt chân0 của cổng 2 làm đầu vào có bật điện trở kéo lên bên trong, các thanh ghi P2OUT và P2REN phải được đặt với giá trị 1. Để bật ngắt trên chân0 của cổng 2 và cũng để chọn cạnh của ngắt, P2IE và P2IES được đặt với giá trị là 1. Để đặt lại cờ trong cổng 2, P2IFG sẽ bị xóa, để cờ có thể được đặt lại trên sự xuất hiện của ngắt.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Khi nguồn ngắt là từ cổng 1, thì đèn LED kết nối với chân1 của cổng 1 phát sáng. Khi nguồn ngắt thuộc cổng 2, khi đó đèn LED kết nối với chân2 của cổng 1 phát sáng.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; for (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; for (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Tải chương trình lên MSP430 từ CCS
Để tải dự án vào bảng khởi chạy và gỡ lỗi, hãy chọn dự án và nhấp vào biểu tượng gỡ lỗi trên thanh công cụ. Ngoài ra, nhấn F11 hoặc nhấp vào RunàDebug để vào chế độ gỡ lỗi.
Khi đã vào chế độ gỡ lỗi, hãy nhấn nút chạy màu xanh lục để chạy tự do mã đã tải trong MCU. Bây giờ, khi nhấn nút nhấn xuống, ngắt được kích hoạt bởi sự thay đổi về cạnh, do đó dẫn đến sự thay đổi trạng thái của đèn LED.
Chương trình ngắt trên MSP430
Sau khi mã được tải lên thành công, chúng tôi có thể kiểm tra nó bằng cách sử dụng nút nhấn. Mẫu đèn LED sẽ thay đổi theo chương trình của chúng tôi bất cứ khi nào có ngắt bằng cách sử dụng nút nhấn.
Hoạt động hoàn chỉnh có thể được tìm thấy trong video được liên kết bên dưới. Hy vọng bạn thích hướng dẫn và học được điều gì đó hữu ích. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại chúng trong phần bình luận hoặc sử dụng diễn đàn của chúng tôi cho các câu hỏi kỹ thuật khác.