Mavzu: Timer funksiyasi bilan tanishish ,ishlash.
kutubxonasi.
Bugungi darsimizni boshlashdan oldin quyidagi topshiriqni bajarishga harakat qilib ko’raylik: 2 ta zummer oling va bu zummerlar bir aytda 2 xil musiqa chalsin.!!!
Biz dasturning void loop() qismida yozilgan buyruqlar ketma-ket bajarilishini va buyruqlari tugagach yana boshidan takrorlanishini bilamiz.Har bir datchikni o’zining o’lchash vaqti bo’ladi. Biz bir nechta datchikdan ma’lumot qabul qilmoqchi bo’lsak , har birining o’lchash vaqti yig’indisicha vaqt kutishimizga to’g’ri keladi.Misol uchun namlik datchigining o’lchash davri o’rtacha 1s. Bunga o’xshash datchiklardan bir qanchasi anchagina vaqtni oladi,ya’ni har bir datchikning yangi o’lchash natijasini olishga vaqt sarflanadi.Misol uchun biz dastur orqali haroratni va namlikni 2ta datchik bilan o’lchamoqchimiz. Bunday holda ham dastur o’lchashni birin- ketin bajaradi, ya’ni oldiniga haroratni keyin namlikni o’lchaydi,yoki aksincha.Bundan xulosa shuki, bu holatda bir paytda faqat bitta operatsiya bajariladi, qachon temperaturani o’lchab bo’lsa keyin namlikni o’lchashga o’tadi(yoki aksincha ).Bu degani har siklda harorat yoki namlikning yangi qiymati haqidagi informatsiyani qabul qilish uchun vaqt kerak bo’ladi .Shunday jarayonlar bo’ladiki, kutish biz uchun qimmatga tushadi.Misol uchun biror bir zavodda harorat bir meyorda ushlab turilishi kerak bo’lsa, avariya holatida signalizatsiya ishlashi kerak bo’lsa, kutib qolish orqali signalizatsiya o’z vaqtida ishlamasligi yoki boshqa jarayonlarda ham shunga o’xshash muammolar vujudga kelishi mumkin.
Unga yana bir misol qilib o’tgan darsimizdagi DHT datchigidan kelgan ma’lumotni segmentga chiqarishni olishimiz mumkin. Bunda DHT temperatura va namlikni o’lchaydi(ikkalasini ham bir paytda o’lchaydi, chunki, DHT datchigida namlik va temperaturani o’lchash uchun alohida sezgir elementlari bor ). Bu datchikning o’lchash vaqti o’rtacha 1 s. 1 s kutib keyin yangi ma’lumotni segmentga chiqarish buyrug’i bajariladi. Natijada segment o’chib-yonib ishlaydi(buni o’tgan darsda bajarib ko’rdingiz). Bunga sabab , void loop() qismidagi buyruqlarni mikrokontroller ketma-ket bajaradi.
Ana shunday muammolarning oldini olish uchun Timer funksiyasidan foydalanamiz. Timer yordamida biz bir vaqtning o’zida kutishlarsiz, bir nechta o’lchashlarni, buyruqlarni ketma-ket emas,balki parallel bajarishimiz mumkin bo’ladi.
Bu funksiyadan foydalanish uchun o’zininng maxsus kutubxonasini Arduino kutubxonasiga qo’shishimiz va uni ishga tushirishimiz kerak. Bu kutubxona #include
1-topshiriq: MsTimer2 orqali svetodiod 0.5s yonib, 0.5s o’chib turishini ta’minlang.
Buning uchun boolean ,ya’ni mantiqiy o’zgaruvchini kiritamiz. Uning qiymatlar sohasi rost-true-1va yolg’on-false-0bo’ladi.
Bu yerda,
MsTimer2:: set(500,funk);- MsTimer2 har 500ms da funk nomli funksiyaga murojaat qiladi va shu funksiyaning ichidagi buyruqlarni bir marta bajaradi.
MsTimer2 :: start();- MsTimer2 ga start berildi.
void funk(){ digitalWrite(2,output); output=!output; } - MsTimer2 bajarishi kerak bo’lgan buyruq
output=!output- outputning qiymati har bir siklda inkoriga teng bo’ladi ,ya’ni 1-0-1-0-1-0…….
Shu tariqa svetodiod 0.5s yonib, 0.5s o’chib turadi.
MsTimer2 delay()ni qabul qilmaydi , ya’ni funksiyaga yozilgan delay()ga to’xtamaydi.
2-topshiriq. Endi bir paytda ikkita svetodiodning biri 1sda 1marta ikkinchisi 10marta yonib o’chsin.
Bunda voidloop()ga yozilgan buyruq o’z ketma-ketligida bajarilaveradi va o’sha paytda unga parallel ravishda voidfunk ()dagi buyruq ham bajarilaveradi.
3-topshiriq: O’tgan darsizmizdagi DHT datchigi va segmen to’rtasidagi muammoni Timer orqali yeching , ya’ni segmentdagi o’chib – yonish bartaraf bo’lsin.
Bunda navbat bilan emas, parallel ravishda DHT datchigi o’lchab, segment esa qiymatni ko’rsatib turibdi. Timerning funksiyaga murojaat qilish vaqti 2ms bo’lgani uchun uning o’chib –yonayotganini ko’zimiz sezmaydi.
Demak, biz MsTimer2 yordamida 2 ta jarayonni parallel bajarilishini ta’minladik. Endi savol tug’iladi, bu parallel jarayonlar soni 2 tadan ko’p qilish mumkinmi??? Mumkin bo’lsa qanday qilib???
Endi bir paytda 2tadan ko’p jarayonlarning bajarilishini ta’minlaymiz.
4-topshiriq. Birinchi svetodiod 1s, 2-sveto 0.5s , 3-sveto 0.25s davr bilan o’chib yonishini ta’minlang.
MsTimer2 ma’lum bir vaqtda faqat bitta funksiyaga murojaat qiladi, ya’ni bu masalani funksiyalar sonini ko’paytirish yo’li bilan bajarib bo’lmaydi, MsTimer2 murojaat qilishi uchun faqat bitta funksiya yozish mumkin.
Bu masalani yechish uchun 3ta boolean o’zgaruvchi kiritamiz(1,2-masaladagi output ga o’xshagan). Misol uchun ularni out1,out2,out3 deb nomlaymiz . Ularning qiymati 0 va1 bo’lishi mumkin. Keyin 3ta integer o’zgaruvchi kiritamiz-a1,a2,a3.
Va dasturiy qism quyidagicha bo’ladi:
a1ning qiymati 125msda 1ga teng bo’ladi,ya’ni 1ta sikl
a2ning qiymati 250msda 2ga teng bo’ladi,ya’ni 2ta sikl
a3ning qiymati 500msda 4ga teng bo’ladi,ya’ni 4ta sikl
shu tariqa 1-sveto 250ms,2-sveto 500ms,3-sveto 1000ms davr bilan yonib o’chadi.
Demak, MsTimer2 orqali bir nechta jarayonlarni bemalol parallel bajara olishimiz mumkin ekan, ya’ni uning yordamida juda ko’p muammolarni hal qilishimiz mumkin!!!!!
5-topshiriq: 8ta svetodiodni 4ta 4tadan bo’lib oling . Ikkala 4liklar ham ketma-ket yonib o’chsin.Birinchi 4taliknig yonib o’chish tezligi ikkinchi to’rttaliknig yonib-o’chish tezligidan 3 marta katta bo’lsin.
Do'stlaringiz bilan baham: |