Chia sẻ về ngắt Timer trên Arduino

Chia sẻ về ngắt Timer trên Arduino

Ngắt trong vi điều khiển là gì?

Ngắt là quá trình dừng chương trình chính đang chạy để ưu tiên thực hiện chương trình khác, chương trình này được gọi là Quy trình dịch vụ ngắt (isr). Sau khi thực hiện quy trình dịch vụ ngắt, bộ vi điều khiển sẽ trở lại công việc trước đó.

arduino ngắt

avr có ít nhất 2 bộ hẹn giờ. Bắt đầu từ atmega8, có 2 bộ định thời 8bit và 1 bộ định thời 16bit. Chip atmega2560 trên bo mạch arduino mega có 2 (8bit) + 4 (16bit) = 6 bộ định thời. arduino không hỗ trợ thư viện ngắt bộ hẹn giờ, vì vậy chúng tôi sẽ sử dụng thư viện của bên thứ ba

Tải xuống thư viện tại: Tải xuống

Chi tiết Thư viện: Thư viện Hẹn giờ Một

Tải xuống Thư viện Timer Three

Ví dụ:

Chia sẻ thêm:

timerone và timerthree cho phép bạn sử dụng bộ đếm thời gian 16 bit được tích hợp sẵn.

Yêu cầu phần cứng

Các thư viện này sử dụng timer1 và timer3.

Mỗi bộ hẹn giờ điều khiển chân pwm. Tương tự () của các chân này sẽ không hoạt động khi sử dụng các thư viện này, nhưng bạn có thể sử dụng hàm thư viện pwm ().

Cách sử dụng cơ bản

Bộ hẹn giờ được định cấu hình để lặp lại phép đo trong một khoảng thời gian, tính bằng micro giây. Vào cuối mỗi chu kỳ, một chức năng ngắt có thể được chạy. Pin pwm cũng có thể được định cấu hình để chuyển đổi trong một phần của chu kỳ.

Xem thêm:  Lò xo cuộn là gì? Quy trình để tạo ra một bộ đệm lò xo như thế nào?

Nếu sử dụng timerthree, hãy thay thế “timer1” bằng “timer3”.

Cấu hình

timer1.initialize (micro giây);

Bắt đầu sử dụng bộ hẹn giờ. Chức năng này phải được gọi đầu tiên. “Microseconds” là khoảng thời gian được bộ đếm thời gian sử dụng. timer1.setperiod (micro giây);

Đặt một khoảng thời gian mới sau khi thư viện đã được khởi chạy.

Run Control

timer1.start ();

Bắt đầu hẹn giờ, bắt đầu một khoảng thời gian mới.timer1.stop ();

dừng timer.timer1.restart ();

Khởi động lại bộ hẹn giờ, bắt đầu bằng một khoảng thời gian mới.timer1.resume ();

Tiếp tục chạy bộ hẹn giờ đã dừng. Một thời kỳ mới đã không bắt đầu.

đầu ra tín hiệu pwm

timer1.pwm (pin, nhiệm vụ);

Định cấu hình một trong các chân pwm của bộ hẹn giờ. “duty” là từ 0 đến 1023, trong đó 0 làm cho chân luôn ở mức thấp và 1023 làm cho chân luôn ở mức cao. timer1.setpwmduty (pin, nhiệm vụ);

Đặt pwm mới mà không cần định cấu hình lại các chân. Điều này nhanh hơn một chút so với pwm (), nhưng pwm () phải được sử dụng ít nhất một lần để định cấu hình pin.timer1.disablepwm (pin);

Ngừng sử dụng pwm trên mã pin. Pin trở lại được điều khiển bởi digitalwrite ().

Chức năng ngắt

timer1.attachinterrupt (chức năng);

Chạy một chức năng mỗi khi hết khoảng thời gian. Hàm chạy như một ngắt, vì vậy cần đặc biệt chú ý chia sẻ bất kỳ biến nào giữa hàm ngắt và chương trình chính. timer1.detachinterrupt ();

Xem thêm:  Vận đơn hàng không - AWB là gì?

Tắt ngắt, do đó, chức năng không còn chạy nữa.

Chương trình mẫu

Sự cố về ngữ cảnh gián đoạn

Cần thiết kế đặc biệt để chia sẻ dữ liệu giữa mã ngắt và phần còn lại của chương trình.

Các biến thường phải thuộc loại “dễ bay hơi”. dễ bay hơi nói với trình biên dịch để tránh tối ưu hóa giả định rằng các biến không thể thay đổi một cách tự nhiên. Trình biên dịch cần gợi ý này vì các hàm của bạn có thể thay đổi các biến khi chương trình của bạn sử dụng chúng. Nhưng biến động một mình thường là không đủ.

Các ngắt thường phải được tắt khi truy cập các biến được chia sẻ. Ngay cả với biến động, nếu một ngắt thay đổi một biến multibyte giữa một loạt các lệnh, nó có thể bị đọc không chính xác. Nếu dữ liệu của bạn có nhiều biến, chẳng hạn như mảng và số lượng, thì thường cần phải vô hiệu hóa ngắt cho toàn bộ chuỗi mã truy cập dữ liệu.

Chi tiết

Sự phát triển mới của timerone xuất hiện trên trang github này: 1 2

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *