ngắt trong vi điều khiển là gì?
ngắt là quá trình dừng chương trình đang thực thi chính để ưu tiên thực hiện chương trình khác, chương trình này được gọi là chương trình phục vụ ngắt (isr). sau khi thực hiện chương 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ờ. từ atmega8 trở đi có 2 bộ định thời 8 bit và 1 bộ định thời 16 bit. chip atmega2560 trên bo mạch arduino mega có 2 (8 bit) + 4 (16 bit) = 6 bộ định thời. arduino không hỗ trợ thư viện cho các 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: download
chi tiết thư viện: hẹn giờ một libary
tải xuống thư viện ba bộ hẹn giờ
ví dụ:
chia sẻ thêm:
timerone và timerthree cho phép bạn sử dụng các bộ hẹn giờ 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 các chân pwm. trong khi sử dụng các thư viện này, analogwrite () cho các chân đó sẽ không hoạt động bình thường, nhưng bạn có thể sử dụng hàm pwm () của thư viện.
cách sử dụng cơ bản
Bộ hẹn giờ được đặt để đo lặp lại một khoảng thời gian, tính bằng micro giây. vào cuối mỗi khoảng thời gian, một hàm ngắt có thể được thực hiện. các chân pwm cũng có thể được đặt để chuyển đổi trong một phần của khoảng thời gian.
nếu bạn sử dụng timerthree, hãy thay thế “timer1” bằng “timer3”.
cài đặt
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. “Micro giây” là khoảng thời gian mà bộ đếm thời gian thực hiện .timer1.setperiod (micro giây);
đặt khoảng thời gian mới sau khi thư viện đã được khởi chạy.
điều khiển chạy
timer1.start ();
bắt đầu bộ đếm thời gian, 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ờ, từ đầu một khoảng thời gian mới.timer1.resume ();
tiếp tục thực thi bộ hẹn giờ đã dừng. một giai đoạn mới chưa bắt đầu.
đầu ra tín hiệu pwm
timer1.pwm (pin, dịch vụ);
định cấu hình một trong các chân pwm của bộ định thời. “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, duty);
đặt pwm mới mà không cần định cấu hình lại mã pin. đ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 để đặt pin.timer1.disablepwm (pin);
ngừng sử dụng pwm trên một ghim. pin 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 được thực thi như một ngắt, vì vậy cần đặc biệt lưu ý để chia sẻ bất kỳ biến nào giữa hàm ngắt và chương trình chính của nó.timer1.detachinterrupt ();
tắt ngắt để chức năng không chạy nữa.
chương trình mẫu
sự cố về ngữ cảnh ngắt
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ủa bạn.
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 các tối ưu hóa giả định rằng biến không thể thay đổi một cách tự nhiên. bởi vì hàm của bạn có thể thay đổi các biến trong khi chương trình của bạn đang sử dụng chúng, trình biên dịch cần gợi ý này. nhưng chỉ có sự biến động thường là không đủ.
Khi truy cập các biến được chia sẻ, thường phải tắt các ngắt. ngay cả với biến động, nếu ngắt thay đổi một biến nhiều byte giữa một chuỗi các câu lệnh, nó có thể bị đọc sai. nếu dữ liệu của bạn có nhiều biến, chẳng hạn như một mảng và một số lượng, thì thường phải tắt các ngắt đối với toàn bộ chuỗi mã truy cập dữ liệu của bạn.
chi tiết
sự phát triển mới về timerone xảy ra trên trang github này: 1 2