- Видове прекъсвания
- Прекъсвания в Arduino
- Използване на прекъсвания в Arduino
- Необходими компоненти
- Електрическа схема
- Програмиране на Arduino Interrupt
- Демонстрация на Arduino Interrupt
Помислете за бързо движеща се кола, ако внезапно бъде ударена от друга кола в обратна посока, първото нещо, което се случва, е, че сензорът на акселерометъра, присъстващ в автомобила, усеща внезапно намаляване на скоростта и задейства външно прекъсване на микроконтролера, присъстващ в колата. След това въз основа на това прекъсване микроконтролерът произвежда електрически сигнал за незабавно разгръщане на въздушните възглавници. Микроконтролерите, присъстващи в колата, наблюдават едновременно много неща, като например да усещат скоростта на автомобила, да проверяват други сензори, да контролират температурата на климатика и т.н. И така, какво прави внезапно отваряне на въздушната възглавница за секунди? Отговорът е прекъсвания, тук се използва сигнал за прекъсване, който има най-висок приоритет от всички.
Друг прост пример за прекъсвания са мобилните телефони със сензорен екран, които имат най-висок приоритет на усещането за докосване. Почти всяко електронно устройство има някакъв вид прекъсвания, за да „прекъсне“ редовния процес и да направи някои неща с по-висок приоритет за определено събитие. Редовният процес се възобновява след обслужване на прекъсването.
Така че технически прекъсванията са механизъм, чрез който I / O или инструкция може да преустанови нормалното изпълнение на процесора и да се обслужва така, сякаш има по-висок приоритет. Например, процесор, извършващ нормално изпълнение, може да бъде прекъснат от някакъв сензор за изпълнение на определен процес, който присъства в ISR (Interrupt Service Rutine). След изпълнение на процесора ISR може отново да възобнови нормалното изпълнение.
Видове прекъсвания
Има два вида прекъсвания:
Хардуерно прекъсване: Това се случва, когато възникне външно събитие, като външен щифт за прекъсване промени състоянието си от LOW на HIGH или HIGH на LOW.
Прекъсване на софтуера: Това се случва съгласно инструкциите от софтуера. Например таймерните прекъсвания са софтуерни прекъсвания.
Прекъсвания в Arduino
Сега ще видим как да използваме прекъсвания в Arduino Board. Той има два вида прекъсвания:
- Външно прекъсване
- Прекъсване на промяна на ПИН
Външно прекъсване:
Тези прекъсвания се интерпретират от хардуера и са много бързи. Тези прекъсвания могат да бъдат настроени да се задействат в случай на нарастващи или падащи или ниски нива.
Дъска Arduino |
Външни щифтове за прекъсване: |
UNO, NANO |
2,3 |
Мега |
2,3,18,19,20,21 |
Прекъсвания на промяна на ПИН:
Arduinos може да има активирани повече щифтове за прекъсване, като използва прекъсвания за смяна на щифтове. В базирани на ATmega168 / 328 Arduino платки всякакви щифтове или всичките 20 сигнални щифта могат да се използват като щифтове за прекъсване. Те могат да бъдат задействани и с помощта на RISING или FALLING ръбове.
Използване на прекъсвания в Arduino
За да се използват прекъсвания в Arduino, трябва да се разберат следните концепции.
Рутинна услуга за прекъсване (ISR)
Процедура за прекъсване на услугата или манипулатор на прекъсвания е събитие, което съдържа малък набор от инструкции. Когато възникне външно прекъсване, процесорът първо изпълнява този код, който присъства в ISR и се връща обратно в състояние, където е оставил нормалното изпълнение.
ISR има следния синтаксис в Arduino:
attachInterrupt (digitalPinToInterrupt (щифт), ISR, режим);
digitalPinToInterrupt (pin): В Arduino Uno, NANO пиновете, използвани за прекъсване, са 2,3 и в мега 2,3,18,19,20,21. Посочете тук входния щифт, който се използва за външно прекъсване.
ISR: Това е функция, която се извиква, когато се прави външно прекъсване.
Режим: Тип преход за задействане, например падане, издигане и т.н.
- RISING: За задействане на прекъсване, когато щифтът преминава от LOW към HIGH.
- FALLING: за задействане на прекъсване, когато щифтът преминава от HIGH в LOW.
- CHANGE: За задействане на прекъсване, когато щифтът преминава от LOW към HIGH или HIGH до LOW (т.е., когато състоянието на пина се променя).
Някои условия при използване на Прекъсване
- Функцията за рутинно прекъсване (ISR) трябва да бъде възможно най-кратка.
- Функцията Delay () не работи в ISR и трябва да се избягва.
В този урок за прекъсване на Arduino числото се увеличава от 0 и два бутона се използват за задействане на прекъсване, всеки от тях е свързан с D2 и D3. За индикация на прекъсването се използва светодиод. Ако се натисне един бутон, индикаторът се включва и дисплеят показва прекъсване2 и изгасва, а когато се натисне друг бутон, индикаторът се изключва и дисплеят показва прекъсване1 и изгасва.
Необходими компоненти
- Arduino Board (В този урок се използва Arduino NANO)
- Бутон - 2
- LED - 1
- Резистор (10K) - 2
- LCD (16x2) - 1
- Дъска за хляб
- Свързване на проводници
Електрическа схема
Връзка на веригата между Arduino Nano и 16x2 LCD дисплей:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Към ПИН на центъра на потенциометъра За контрол на контраста на LCD дисплея |
RS |
D7 |
RW |
GND |
Е. |
D8 |
D4 |
D9 |
D5 |
D10 |
D6 |
D11 |
D7 |
D12 |
A |
+ 5V |
К |
GND |
Два бутона са свързани към Arduino Nano на щифтове D2 и D3. Те се използват за използване на две външни прекъсвания, едно за включване на LED и друго за изключване на LED. Всеки бутон има падащ резистор от 10k, свързан към земята. Така че, когато бутонът е натиснат, това е логика HIGH (1), а когато не се натиска, това е логика LOW (0). Издърпващият резистор е задължителен, в противен случай на входните щифтове D2 и D3 ще има плаващи стойности.
А LED се използва също и за да покаже, че за прекъсване е била задействана или бутон е натиснат.
Програмиране на Arduino Interrupt
В този урок числото се увеличава от 0, което се показва непрекъснато в (16x2) LCD, свързан към Arduino Nano, при всяко натискане на левия бутон (прекъсващ щифт D3) светодиодът се включва и дисплеят показва Прекъсване2, а когато десният бутон (прекъсващ щифт D2) е натиснат, светодиодът изгасва и дисплеят показва Прекъсване1.
Пълният код с работещо видео е даден в края на този урок.
1. Първо се включва заглавният файл за LCD дисплея и след това се определят щифтовете на LCD, които се използват при свързване с Arduino Nano.
#include
2. Вътре във функцията за настройка на празнотата () първо изведете някакво встъпително съобщение на LCD дисплея. Научете повече за свързването на LCD с Arduino тук.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("ArduinoInterrupt"); забавяне (3000); lcd.clear ();
3. Тогава в същата функция за настройка на празнота () трябва да се посочат входящите и изходните щифтове. Пинът D13 е свързан към анода на светодиода, така че този щифт трябва да бъде дефиниран като изход.
pinMode (13, ИЗХОД);
4. Сега идва основната важна част от програмирането, която е функцията attachInterrupt (), тя също е включена в настройката на void ().
attachInterrupt (digitalPinToInterrupt (2), buttonPress1, RISING); attachInterrupt (digitalPinToInterrupt (3), buttonPress2, RISING);
Тук е посочено, че щифт 2 е за външно прекъсване, а функцията buttonPress1 се извиква, когато има ПОВИШЕН (НИСКО до ВИСОКО) при D2 щифт. И щифт 3 също е за външно прекъсване и се извиква функцията buttonPress2, когато има RISING на D3 щифт.
5. Вътре в празния контур () число (i) се увеличава от нула и се отпечатва на LCD (16x2).
lcd.clear (); lcd.print ("БРОЯЧ:"); lcd.print (i); ++ i; забавяне (1000);
В същия празен цикъл (), digitalWrite () се използва на щифта D13, където е свързан анодът на светодиода. В зависимост от стойността на променливия изход LED ще се включи или изключи
digitalWrite (13, изход);
6. Най-важната част е създаването на функция за манипулатор на прекъсвания според името, което се използва във функцията attachInterrupt () .
Тъй като се използват два щифта за прекъсване 2 и 3, така се изискват две ISR. Тук в това програмиране се използват следните ISR
бутонНатиснат1 ():
бутон voidPress1 () { изход = LOW; lcd.setCursor (0,1); lcd.print ("Прекъсване 1"); }
Тази функция се изпълнява при натискане на бутон на щифта D2 (RISING EDGE). Тази функция променя състоянието на изхода на LOW, което води до изключване на LED и отпечатва “interrupt1” на LCD дисплея.
buttonPress2 ():
бутон voidPress2 () {изход = HIGH; lcd.setCursor (0,1); lcd.print ("Прекъсване2"); }
Тази функция се изпълнява при натискане на бутон на щифта D3. Тази функция променя състоянието на изхода на HIGH, което води до включване на LED и отпечатва “interrupt2” на LCD дисплея.
Демонстрация на Arduino Interrupt
1. Когато се натисне бутон PUSH от лявата страна, светодиодът се включва и LCD показва прекъсване2.
2. Когато се натисне бутонът PUSH от дясната страна, светодиодът изгасва и LCD дисплеят показва Прекъсване1
Ето как прекъсването може да бъде полезно за задействане на всяка важна задача между нормалното изпълнение.