Ushbu qo'llanmada biz uchta 7 ta segmentli umumiy katodli displeylardan foydalanamiz. Bizga bir vaqtning o'zida barcha ko'rsatkichlarga ulangan bitta smenali registr kerak. Bir vaqtning o'zida bitta indikatorni yoqish uchun biz uchta dala effektli tranzistordan foydalanamiz, ular katodni kerakli vaqtda erga ulaydi. Aytgancha, uchta alohida indikator o'rniga bitta uchta raqamli ko'rsatkichdan foydalanish yaxshiroqdir. Zanjirning mohiyati bundan o'zgarmaydi, lekin simlar kamroq bo'ladi! Sxematik diagramma
Elektron kalit sifatida biz TO92 paketidagi tranzistorlardan foydalanishni tavsiya qilamiz, masalan 2N7000. Har bir tranzistorni ulash uchun sizga ikkita rezistor kerak bo'ladi: 100-150 Ohm va 2,2-10 kOm. Birinchi qarshilik, maydonni yaratish paytida, darvoza oldida paydo bo'ladigan oqim kuchlanishidan nazoratchi chiqishini himoya qilish uchun mo'ljallangan. Ikkinchi rezistor, nazorat moslamasining mos keladigan terminaliga past darajani qo'llaganimizda, kalitni tezda o'chirishga yordam beradi (u orqali eshikning qoldiq zaryadi erga qo'shiladi). Registrdan indikatorgacha bo'lgan har bir satrda indikatordagi LEDlar yonib ketmasligi uchun 200-300 Ohm tokni sozlash rezistori talab qilinadi. Biz LEDlar bilan ishlashning ushbu nuansini ko'rib chiqdik. Biz sxemani diqqat bilan yig'amiz va dasturga o'tamiz. Dinamik ko'rsatish dasturi const bayt digit_pins = (5,6,7); const bayt data_pin = 2; const bayt sh_pin = 4; const bayt st_pin = 3; imzosiz uzun tm, next_flick; const unsigned int to_flick = 1; bayt raqami = 0; imzosiz int hisoblagich = 125; const bayt raqamlari = (B11101110, B10000010, B11011100, B11010110, B10110010, B01110110, B01111110, B11000010, B11111110, B11110110); void fill (bayt d) (for (char i = 0; i <8; i ++) {digitalWrite (sh_pin, LOW); digitalWrite (data_pin, raqamlar [d] & (1 Dinamik displeyli hisoblagich dasturi Oldingi misolda o'zgarmaydigan 125 raqamiga qarshi o'rnatdi. Endi dasturga soniya hisoblagichini qo'shishga harakat qilaylik, shunda hisoblagich har soniyada 999 taga ko'payadi. Const bayt digit_pins = (5,6 , 7); const bayt data_pin = 2; const bayt sh_pin = 4; const bayt st_pin = 3; imzosiz uzun tm, next_sec, next_flick; const unsigned int to_sec = 1000; const unsigned int to_flick = 1; imzosiz int taymer = 0; bayt raqami = 0; const bayt raqamlari = (B11101110, B10000010, B11011100, B11010110, B10110010, B01110110, B01111110, B11000010, B11111110, B11110110); void fill (bayt d) (for (char i = 0; i <8; i ++) {digitalWrite (sh_pin, LOW); digitalWrite (data_pin, raqamlar [d] & (1 keyingi_flick) (keyingi_flick = tm +to_flick; raqam ++; agar (raqam == 3) raqam = 0; setDigit (raqam, hisoblagich);)) Dasturni Arduino -ga yuklang va hisoblagichni kuzating!
Vazifalar
Raqamli sekundomer. Diagrammani uch xonali ko'rsatkich bilan yig'ing. Sxemaga qo'shing. Tugmani bosganingizda, soniya hisoblagichi hisoblashni boshlashi kerak. Qayta bosilganda to'xtating. Bundan tashqari, sekundomerga kasrli qism qo'shilishi mumkin, u uchinchi ko'rsatkichda nuqta orqali ko'rsatiladi.
0 dan 10 voltgacha bo'lgan kuchlanish uchun raqamli voltmetr. Diagrammani uch xonali ko'rsatkich bilan yig'ing. Arduino analog kirishiga ulangan kontaktlarning zanglashiga 10 kΩ ikkita rezistorli kuchlanish bo'luvchi qo'shing. Har 100 msda analog kirishda qiymat o'qiladigan, uni voltga aylantiradigan va indikatorda ko'rsatadigan dastur yozing. Kesirli qismni to'g'ri ko'rsatish uchun sakkizinchi segmentni - nuqtani ulash lozim.
Xulosa
Aslida, dinamik ko'rsatkich unchalik qiyin emas. Bizning ro'yxatga olingan eski sxemamizga faqat uchta tranzistor qo'shildi, ular tushunarli mantiq bilan boshqariladi. Keyingi darslarda biz LED matritsasini boshqarish uchun dinamik ko'rsatkichlardan foydalanishga harakat qilamiz, shuningdek, bizning dasturimizni ancha soddalashtiradigan maxsus mikrosxemalar bilan ishlashni o'rganamiz.
Batareya bilan ishlaydigan uskunalar uchun LCD indikatorlaridan foydalanish, qoida tariqasida, yorug'lik chiqaruvchi diodli (LED) indikatorlarga qaraganda afzalroq hisoblanadi, chunki ularning yuqori sarflanishi. Bu postulat menga quyidagi sabablarga ko'ra unchalik ravshan emasdek tuyuladi: 1) zamonaviy LCD-indikatorlarda 100 mAgacha bo'lgan orqa yorug'lik bor; 2) ular nisbatan mo'rt va quyoshning to'g'ridan -to'g'ri nurlaridan qo'rqishadi; 3) zamonaviy LED ko'rsatkichlari (ayniqsa, superRED va ultraRED), agar ular orqali 1 mA tok bo'lsa ham, etarli darajada yorqinlikka ega va yorug'lik sharoitiga qarab, operatsion nashrida nazorat qilish bilan 4 xonali indikatorning o'rtacha iste'mol oqimi 30 mA dan oshmaydi. hatto ochiq havoda ham, bu LCD orqa nuri sarflanishidan kam.
Tarmoqda dinamik ko'rsatgichli zanjirlar ko'pligiga qaramay, men PIC16da dasturiy ta'minotning yorqinligini boshqaruvchi sxemani ko'rmadim. Ushbu maqola mening bunday vazifani amalga oshirish haqidagi kamtarona nuqtai nazarimni ko'rsatadi. U asosan radio havaskorlari uchun dizaynni takrorlashdan o'z-o'zini dasturlash mikrokontrollerigacha birinchi qadamlarni qo'yishga mo'ljallangan.
Maqolada TMR0 va TMR2 taymerlarining uzilishlari yordamida o'rtacha oiladagi PIC mikrokontrollerining LED matritsasini boshqarish usuli muhokama qilinadi. TMR2 taymeri PWM yoqilgan segmentlar orqali o'rtacha oqimni boshqarish uchun ishlatiladi. Ishni tashkil qilish algoritmi quyidagicha:
1. Boshlanish. Biz mikrokontroller portlarini indikatorli ulanish sxemasiga muvofiq sozlaymiz. Taymerlar 1 va 2 ichki soat o'lchagichi 16 ta oldindan hisoblagich bilan jihozlangan. Periferik uzilishlarga ruxsat beriladi.
2. Biz indikatorda raqamlar va ba'zi (asosan lotin) harflari va belgilarini ko'rsatish uchun jadval xarakterli generator yaratamiz.
3. Biz ikkita to'rt xonali o'zgaruvchini zaxiralab qo'yamiz. Birida biz 2 -banddagi jadvalga muvofiq ko'rsatish uchun zarur bo'lgan raqamli kodni (raqamlar uchun - faqat raqam) ketma -ket kiritamiz. ko'rsatkich.
4. TMR0 dan uzilishda belgi raqamlari jadvalga muvofiq ketma -ket ko'rsatiladi. Raqamlarni o'zgartirishdan oldin indikator o'chadi. Har bir uzilishda bitta bit ajratilgan. Shundan so'ng, TMR2 taymeri tiklanadi, TMR2 uzilish bayrog'i tozalanadi va undan uzilishlar yoqiladi.
5. TMR2 dan uzilishda indikator o'chadi va TMR2 dan uzilish taqiqlanadi.
6. Asosiy dasturda X (n + 1) = 2 * X formulasidan foydalanib, PR2 registriga 7 dan 255 gacha o'nli raqamlarni kiritish orqali TMR2 dan uzilish davri va shuning uchun indikatorning yoqish vaqti moslashtiriladi. (n) +1. Ma'lum bo'lishicha, yorug'likning oltita gradatsiyasi, ular orasidagi farq 2 marta. PR2 = 255 bilan, maksimal vaqt (4ms dan 4ms), PR2 = 7 bilan, davomiyligi taxminan 0,25ms.
Bu nazorat tamoyilini namoyish qilish uchun quyida arzon PIC16F628A diagrammasi va Assembler -dagi sinov dasturi ko'rsatilgan bo'lib, u indikatorda "test" so'zini aks ettiradi. Tugmani bosganingizda indikator yorqinlikni yoqadi (odatda 0 dan 5 gacha raqamlarda). Keyingi bosish bilan yorqinlik aylanada o'zgaradi va bu darhol indikatorda ko'rinadi. Men darhol yangi boshlanuvchilarni ogohlantirmoqchiman: zanjirni Proteus kabi simulyatorda modellashtirish sizga ushbu dasturning o'ziga xos xususiyatlari tufayli yorug'likning o'zgarishini ko'rishga imkon bermaydi (Proteus). Sinov va tajribalar uchun sxemaning sxemasi qo'shimcha qurilmalarda yig'ilishi kerak bo'ladi. Biroq, dinamik indikatsiyaning haqiqiy tashkil etilishini kuzatish uchun (yorqinligini o'zgartirishdan tashqari) Proteus modeli biriktirilgan.
Minimal nashrida sxemaning iste'moli 4 mA dan kam, maksimal nashrida - taxminan 80 mA.
Arxivda Assembler MPASMda test dasturi mavjud.
Zanjirni soddalashtirish va har xil harakatlar uchun "oyoqlarni" bo'shatish uchun ichki generatorli konfiguratsiya va ichki reset qo'llaniladi. Shu bilan birga, Uppdan oldin MCLR signalini etkazib bera olmaydigan uy dasturchisidan foydalanadiganlar keyingi tekshirish, o'qish va o'chirish bilan bog'liq muammolarga duch kelishi mumkin. O'z dasturchisiga ishonmaydiganlar uchun, shuningdek, agar osilatorning yuqori barqarorligi talab qilinsa, siz "OSC_XT" konfiguratsiyasida tanlovi bo'lgan 4 MGtsli kristalni odatdagi sxema bo'yicha o'rnatishingiz mumkin. Agar yakuniy sxemada INT0 (RB0) pinidan uzilishlar kerak bo'lsa, vergulni RA4 pin orqali boshqarish mumkin; OA bilan indikator uchun indikator ochiq bo'lishiga qaramay, to'g'ridan -to'g'ri shu pinga ulanadi. Bo'shatilgan RB0 pinidan maqsadga muvofiq foydalanish mumkin. Dasturda TMR0 uzilishida, bu holda kod "movwf PORTB" dan keyin qo'shiladi:
Andlw b "00000001" bsf PORTA, 4 btfsc STATUS, Z vergulini o'chiring, biz Wda teskari qiymat ekanligini hisobga olamiz. bcf PORTA, 4 - 0 -bit = 0 bo'lsa, engil vergul
Dastur uchun kichik tushuntirishlar:
Chiqarilgan raqam bitga muvofiq OUT_ - OUT + 3 o'zgaruvchilariga joylashtiriladi va undan konvertatsiya qilinganidan keyin out__ kichik dasturiga OUT_LED ga joylashtiriladi. Albatta, OUT_ o'zgaruvchisiz qilish mumkin va chiqish uchun hamma joyga yozish mumkin:
Movlw X Table_s movwf OUT_LED ni chaqiradi
Ammo, asl ko'rinishida, hamma narsa ancha sodda va tushunarli (men uni OUT_ ga qo'yib, unutganman), shuningdek, dasturning turli joylaridan bir nechta chiqish bilan, kodni tejashga erishiladi (1 chiqish uchun 4 so'z) - I qo'shimcha 4 bayt RAM uchun yaxshi kompensatsiya o'ylab ko'ring.
Xuddi shu narsa comma_ o'zgaruvchisi orqali vergul chiqishi uchun ham amal qiladi.
Table_s jadval dasturida, u 256 baytli bloklar kesishmasida cheklovlarsiz, dastur xotirasining istalgan joyiga joylashtirilganda, to'g'ri ishlashi uchun choralar ko'rilgan.
TMR0 uzilishidagi pause_ o'zgaruvchisi 4ms vaqt oralig'ini o'rnatish uchun ishlatiladi.
Qolganlari, menimcha, algoritm va sharhlardan aniq.
P.S. Dasturda 2 yoki 3 ta raqam uchun minimal o'zgarishlar talab qilinadi, menimcha, hatto yangi boshlanuvchilar uchun ham. Raqamlar soni 5 dan 8 gacha bo'lgan indikatorni boshqarish uchun ko'p sonli chiqadigan kontrollerdan foydalanish yoki raqamlarni boshqarish uchun 3 dan 8 gacha dekoderdan foydalanish kerak.
Birinchi holda, dasturdagi o'zgarishlar ham minimal (A porti o'rniga boshqa portdan foydalanish va boshqalar). Agar dekoder ishlatilsa, TMR0 dan uzilish dasturi jiddiy o'zgaradi.
Portc = & B00000100
Select Case N2
Case 0: Portd = & B11000000
Case 1: Portd = & B11111001
Case 2: Portd = & B10100100
Case 3: Portd = & B10110000
Case 4: Portd = & B10011001
Case 5: Portd = & B10010010
Case 6: Portd = & B10000010
Case 7: Portd = & B11111000
Case 8: Portd = & B10000000
Case 9: Portd = & B10010000
End Select
Waitms 5
Portc = & B00000010
Select Case N3
Case 0: Portd = & B11000000
Case 1: Portd = & B11111001
Case 2: Portd = & B10100100
Case 3: Portd = & B10110000
Case 4: Portd = & B10011001
Case 5: Portd = & B10010010
Case 6: Portd = & B10000010
Case 7: Portd = & B11111000
Case 8: Portd = & B10000000
Case 9: Portd = & B10010000
End Select
Waitms 5
Portc = & B00000001
Select Case N4
Case 0: Portd = & B11000000
Case 1: Portd = & B11111001
Case 2: Portd = & B10100100
Case 3: Portd = & B10110000
Case 4: Portd = & B10011001
Case 5: Portd = & B10010010
Case 6: Portd = & B10000010
Case 7: Portd = & B11111000
Case 8: Portd = & B10000000
Case 9: Portd = & B10010000
End Select
Do'stlaringiz bilan baham: |