Използване на прекъсвания на Arduino

Оптимизирайте вашите Arduino програми с прекъсвания - лесен начин да реагирате на събития в реално време!

Ние прекъсваме предаването си.

Както се оказва, във всички Arduinos има вграден страхотен (но недостатъчно използван) механизъм, който е идеален за проследяване на събития в реално време. Този механизъм се нарича прекъсване. Работата на прекъсването е да гарантира, че процесорът реагира бързо на важни събития. Когато се открие определен сигнал, прекъсването (както подсказва името) прекъсва всичко, което процесорът е правил и изпълнява някакъв код, предназначен да реагира на външната причина, която го е причинила, засягайки Arduino. След като този код се изпълни, процесорът се връща към това, което първоначално е правил, сякаш нищо не се е случило.!

Невероятното в това е, че прекъсванията ви позволяват да организирате програмата си, за да реагирате бързо и ефективно на важни събития, които не са лесно предвидими в програмния цикъл. И най-хубавото е, че прекъсванията позволяват на процесора да прави други неща и губи време в очакване на събитие.

Прекъсва чрез бутон

Нека започнем с прост пример: използване на прекъсване за проследяване на щракване на бутон. Първо ще вземем скица, която вероятно вече сте виждали: примерът „Бутон“, включен в IDE на Arduino (можете да го намерите в директорията „Примери“, проверете менюто Файл → Примери → 02. Цифров → Бутон ).

Няма нищо шокиращо или изненадващо в това, което виждате тук: всичко, което програмата прави отново и отново, е да премине през цикъла () и да прочете стойността на buttonPin. Да предположим за секунда, че бихте искали да направите нещо друго в цикъл (), повече от просто четене на изходното състояние. Тук прекъсването е полезно. Вместо непрекъснато да наблюдаваме състоянието на изхода, можем да делегираме тази работа на прекъсване и безплатен цикъл (), за да направим това, от което се нуждаем по това време! Новият код ще изглежда така:

Цикли и режими на прекъсване

Тук ще забележите няколко промени. Първият и най-очевиден е, че loop () вече не съдържа никакви инструкции! Можем да се справим и без тях, тъй като цялата работа, която преди беше извършена в оператора if/else, вече е извършена в новата функция pin_ISR (). Този тип функция се нарича манипулатор на прекъсвания: неговата работа е да се изпълни бързо, да се справи с прекъсването и да остави процесора да се върне обратно към основната програма (т.е. съдържанието на цикъл ()). Има няколко важни момента, които трябва да имате предвид, когато пишете манипулатор на прекъсвания, които можете да видите отразени в горния код: