Сур.6. Батырмамен жұмыстын қосылу сызбасы
Ескерту. Сызбада кӛрсетілгендей, батырманы бір аяғын жерге кӛк
сыммен макетті платаның шеткі ұзын кӛк рельсіне таратып, сол ұзын жолдың
кез келген бойынан жерге қосылатын пинге жалғадық. Былай етіп жалғау,
макетті платамен жұмыс жасағанда басқа да сыдбалар бойынша жерге жалғау
керек болғанда, ыңғайлы болады.
Кӛбінесе, тактілі батырмалар, әр жағынан екі байланысқа ие. Бұған қоса,
батырманың пішіні шаршыға ұқсас. Қосу кезінде қандай байланыстар бір-біріне
жалғанған, ал қайсылары батырманы басқан кезде тұйықталатынын
шатастырып алмау маңызды.
Батырманы, керісінше, тартушы кедергі арқылы қуатқа және батырма
арқылы жерге де қосуға болады. Онда, кірістен HIGH, ал батырманы басқан
кезде LOW оқылатын болады.
Егер, кірісті қоспай тастап кетсек, онда кірісте кездейсоқ түрде HIGH
немесе LOW оқылатын болады. Сол себептен, батырма басылмаған жағдайда
мәнін беру үшін тартушы кедергіні пайдаланамыз.
Скетч
/* Жарықдиодты батырманы басу арқылы жағып, сӛндіреміз.*/
// константтар береміз
const int buttonPin = 3; // батырмаға қосылған кіріс нӛмірі
сonst int ledPin = 13; // жарықдиод шығысының нӛмірі
// айнымалылар
int buttonState = 0; // батырма күйін сақтайтын айнымалы
void setup() {
// жарықдиодқа шығыс болып қосылған пинді жүктейміз
pinMode(ledPin, OUTPUT);
// батырмаға кіріс болып қосылған пинді жүктейміз
pinMode(buttonPin, INPUT);
}
void loop(){
// батырмаға берілген мәндерді оқимыз
buttonState = digitalRead(buttonPin);
// батырма басулы тұрғанын тексереміз
25
// егер басылып тұрса, онда buttonState HIGH болады:
if (buttonState == HIGH) {
// жарық диодын қосамыз
digitalWrite(ledPin, HIGH);
}
else {
// жарық диодын ӛшіреміз
digitalWrite(ledPin, LOW);
}
}
Өз бетінше орындауға арналған тапсырмалар:
1. Сызбаға тағы бір батырма қосып скетч кодын жарық диоды екі батырма да
басылған кезде ғана жанып тұратын етіп ӛзгертіңіз.
Үзілістер
Әдетте, микроконтроллерде жобалармен жұмыс кезінде фондық
функцияны бірдей аралықтағы уақыт сайын іске қосып тұру қажет. Бұл кӛбіне
аппараттық таймерді құру арқылы үзілістер жасау үшін жүзеге асырылады. Бұл
үзіліс кезеңдік үзілістерді басқару үшін үзілістерді ӛңдеу бағдарламасын
(Interrupt Service Routine, ISR) іске қосады.
Arduino микроконтроллерінде бірнеше кіріс-шығыс жүйелері бар, бұл
жүйелер Arduino қолданушысының әрбіреуіне қол жетімді, себебі Arduino
кітапханасы олардың қолданылуын жеңілдетеді. Мысалы, сандық кіріс-
шығыстар, ЕИМ, аналогтық-сандық кірістер және жүйелік порт. ATMega168-де
үш ішкі аппараттық таймер бар. Алайда, Arduino кітапханасы таймердің кейбір
қасиеттерін қолдануға мүмкіндік бергенімен, кезеңдік үзілістерді шығару үшін
таймерлерді тікелей қолдануға болмайды.
Атауынан белгілі болып отырғандай, үзілістер – бағдарламаның қалыпты
ағымын тоқтатын дабылдар. Үзілістер, әдетте, жағдайлардың пайда болуына
байланысты жылдам әсер етуді талап ететін аппараттық құрылғылар үшін
қолданылады. Мысалы, жүйелі порт немесе UART (асинхронды әмбебап
қабылдау таратқышы) микроконтроллері жүйесі жаңа белгі алғанда қызмет
кӛрсетілуі тиіс. Егер мұны жылдам жасамаса, жаңа белгі жоғалып кетуі мүмкін.
Жаңа белгі түскен кезде UART үзілістерді ендіреді. Микроконтроллер
негізгі бағдарламаның орындалуын тоқтатады (сіздің қосымшаңыздың) және
сол үзілістерге арналған (ISR) үзілістерді ӛңдеу бағдарламасына секіріп кетеді.
Осы жағдайда бұл – түскен белгі бойынша үзіліс. Бұл ISR UART-тан жаңа
белгіні алып қалады, оны буферге орналастырады, кейін үзілістерді тазартады
және қайтуды жүзеге асырады. ISR қайтаруды жүзеге асырған кезде
микроконтроллер негізгі бағдарламаға қайтадан оралады және оны шақыру
нүктесінен жалғастырады. Осының барлығы фондық режимде орындалады
және сіздің қосымшаңыздың негізгі кодына тікелей әсер етпейді.
26
Егер бағдарламада үзілістер кӛп болса немесе үзілістер тез әрекет ететін
таймерді ӛңдесе, негізгі бағдарлама айтарлықтай баяу жұмыс істейді, себебі
микроконтроллердің машиналық уақыты негізгі бағдарлама және үзілістерді
ӛңдеудің барлық функциялары арасында бӛлінеді.
Үзілістердің қаншалықты маңызды екенін кӛруге мысалды қарастырамыз.
Сізде, деректерді 9600 бод жылдамдықпен жібере алатын жүйелі порты бар
делік. Бұл, символдың әрбір биты 9600 Гц немесе шамамен 10 кГц жиілігімен
жіберіледі дегенді білдіреді. Әрбір битке 100 мкс кетеді. Бір символды жіберу
үшін шамамен 10 бит қажет болады, сондықтан біз бір толық символды әрбір
миллисекундта немесе шамамен сондай уақыт ішінде аламыз. Егер біздің
UARТ буферленген болса, келесі символды қабылдап болғанша, біз соңғы
символды алып тастауымыз керек, барлық жұмыстың орындалуына 1 мс
беріледі. Егер біздің UART буферленбеген болса, біз 1 бит немесе 1 мкс
болатын символдан арылуымыз қажет.
Қозғалтқыштарды басқару
Достарыңызбен бөлісу: |