Mundarija:

BloodBowl hisoblagichi 7 segmentli LEDlar yordamida: 5 qadam
BloodBowl hisoblagichi 7 segmentli LEDlar yordamida: 5 qadam

Video: BloodBowl hisoblagichi 7 segmentli LEDlar yordamida: 5 qadam

Video: BloodBowl hisoblagichi 7 segmentli LEDlar yordamida: 5 qadam
Video: TourPlay Review | Bonehead Podcast #97 Clip (30/7/22) 2024, Noyabr
Anonim
BloodBowl hisoblagichi 7 segmentli LEDlar yordamida
BloodBowl hisoblagichi 7 segmentli LEDlar yordamida

Bu loyiha oltita Charlieplexed 7-segmentli LEDlardan foydalangan holda BloodBowl o'yini hisoblagichi uchun mo'ljallangan edi.

1 -qadam: Kontseptsiya

Kontseptsiya
Kontseptsiya

Bir do'stim mendan o'zining taxt o'yini uchun Bloodbowl Turn taymerini yaratish g'oyalari haqida so'radi. Bu nima ekanligini va nima istayotganini bilmasam ham, men buni qanday qilishim kerakligi haqida bir oz vaqt qaror qabul qildim, avvaliga u nimani xohlashi haqida tasavvurga ega bo'lishim kerak edi, shuning uchun men kontsept -artdan boshladim (rasm). Asosiy g'oya - har birida 3 ta LEDni boshqaradigan 3 ta tugmachaning bo'lishi va u maxsus qurilgan minora ichiga joylashtirilishi kerak edi. Bitta katta talab - 4 ta eng yaxshi 4 displeyni 0 dan 8 gacha sanash va pastdan 2 ni o'rnatish. displeylar 8 dan 0 gacha orqaga qaytadi va men orqaga qaytaman, men zanjirni tugatardim, u esa minorani tugatardi.

2 -qadam: Dizayn va ehtiyot qismlar ro'yxati

Dizayn va ehtiyot qismlar ro'yxati
Dizayn va ehtiyot qismlar ro'yxati

Kontseptsiya 6 ta 7-segmentli LEDni talab qilgani uchun va menda 8-bitli Microchip PIC-lar bor edi, men LEDlarni boshqarish uchun PIC-dan foydalanish usullarini o'rganib chiqdim. /picbook/7_08chapter.htm "Har bir displeyning yorqinligiga ta'sir qilmasdan, 6 tagacha displeyga shu tarzda kirish mumkin" deb aytilgan. Men buni o'z loyihamning bir qismi sifatida tekshirib ko'rishni qiyin deb bildim, birinchi navbatda, 7-segmentli akkor displeylarni qutisidan olib, ular qanday ishlashini ko'rdim. Yomon xabar. Men tanlagan qismlar men xohlagandek emas edi. Segment kerak bo'lganda, taxtada yonadi, lekin oqish oqimi qolgan 6 segmentga taqsimlangan. Men akkor displeylar to'g'ri yo'l bo'lmasligini tushundim yoki ularni boshqacha ishlatishim kerak edi. Men 7-segmentli LED-larning non panelida ishlashini tasdiqladim va oddiy anodli displeylarga buyurtma berdim, ikkinchisi-dizaynni tuzish va kod ustida ishlashni boshlash edi. Rasmda mening davram ko'rsatilgan. Bu unchalik muhim emas, chunki PIC kodi multipleksatsiyaga g'amxo'rlik qiladi … Charlieplexing xato. Eslatma: ALL 6 displeyda IC drayveridan bir xil satrlar mavjud. IC tanlagichi har bir displeyni bittadan bittadan ishga tushiradi va 7 segmentli chiziqlar shunga mos ravishda PIC tomonidan yangilanadi. Juda oddiy g'oya, shundan keyingina kod va apparatni to'ldirishning o'zi kifoya edi. Qismlar ro'yxati Digi-Key-dan 3 ta kichik buyurtmalardan so'ng, men o'zimga kerak bo'lgan hamma narsaga ega bo'ldim (ba'zi narsalar qo'lda); 1 ~ 3 "x4 "PCB6 kichik tugmachali tugmachalari (NO) 1 74LS47, 7-segmentli displey IC1 PIC16F627 1 CD4028, 10 ta selektorning 1 tasi IC 6 10KOhm rezistorlar1 470Ohm rezistor 1 simli g'altak. Men turli xil ranglar va ko'rsatmalarni ishlatardim, lekin bu faqat men edi. 78L05 5V regulyator 1 9V batareya qisqichi 1 9V batareya1 kichik kalit (quvvatni yoqish/o'chirish uchun) Men buni o'rtacha murakkab loyiha deb hisoblayman; 1) Mikroprosessor kodi 2) Lehimlash va 3) Dizaynni optimallashtirish. Bu masalalarning hech biri o'z -o'zidan murakkab emas, lekin ularning barchasini tajribasiz qabul qilish yangi boshlovchi uchun juda qiyin bo'lishi mumkin. Qurilmani, lehim stantsiyasini va boshqalarni yoqish uchun dasturchi kerak bo'ladi. Kimdir 7-segmentli LEDlarning ketma-ket (oqim cheklovli) rezistorlariga ega emasligini bilishi mumkin. Menga o'zimning original dizaynim borligini aytib, buni tezda hal qilishga ruxsat bering … lekin tushuntirish uchun keyingi qadamni o'qing!

3 -qadam: Breadboard va mikro kod

Breadboard va mikro kod
Breadboard va mikro kod

Buning uchun non paneli kerak edi. Mening umumiy taxtam ko'rsatiladi, lekin bu loyihaning o'lchamlari uchun men bir va undan kichikroq taxtadan foydalandim, chunki ajratish kerak bo'lgan ko'plab simlar bor edi. Birinchidan, men 7 kodli bitta LEDni dastlabki kod yordamida sinab ko'rdim. Bu 3 narsani tasdiqladi; 1) IC -ning simlari yaxshi tekshirildi! 2) meni kodimni optimallashtirish va yakunlashga undadi.3) Menga hozirgi cheklovli rezistorlar kerak emasligini tushuntirdim! mening kodim bilan ishlash uchun, chunki LED bitta tugmachali kalit yordamida raqamlar bo'ylab aylanadi, bu mening kodimni va tartibimni tasdiqladi. Ko'p narsa talab qilinmadi, lekin non taxtasi mening yaxshi holatda ekanligimni tasdiqladi.2 CODEI dastlab tugmachalarni qidirish uchun asosiy tartib bilan kodimni o'rnatgan va ISR (Interrupt Service Routine) raqamlarni ko'rsatadi. Breadboard testlaridan so'ng, men tartiblarni o'zgartirdim, shuning uchun ko'p hollarda tugmachalarni tekshirish uchun doimo raqamlar va ISR ko'rsatiladi. Buni qilishimning sababi, doimiy displeyga ega bo'lish edi, chunki PIC ichki 4MGts soat bilan ishlayotgani uchun men tugmalarni skanerlashga juda oz vaqt yo'qotayapman. Hech qanday muhim narsa yo'q … faqat siz kodni qanday qilishni xohlayotganingizga va har bir dastur uchun eng ma'noga bog'liq. Buning uchun displey juda muhim, shuning uchun men buni asosiy rejimga qo'ydim, birinchi qismlarim kelganida (hammasi 6 displey!) Men taxta simini tugatdim va boshqa muammoni topdim. Tugmani bosganimda, mening kodim o'chirilmaydigan ba'zi registrlarga ega edi va ISR displeyda kichik xatolarga olib keldi.; ======================== ================================================= =====; Burilish hisoblagichi;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Tugma1 B0 | 6 13 | B7; B1 | 7 12 | B6; B2 | 8 11 | B5; B3 | 9 10 | B4; -----------;; LED1-3-BCD-dek IC -LEDSeg's1-6; Dsply1-3-BCD-7seg IC -Dsply#1-9;; =============================== ============================================; Tahrir tarixi va eslatmalari:; V1.0 bosh sarlavhasi, kod 3/30/09;;;.; ------------------------------------------------ ------------------------------#o'z ichiga P16F627A. INC; ============ ================================================= =================; Belgilaydi; ------------------------------------------------ ------------------------------- ================== ================================================= ===========; Ma'lumotlar; ------------------------------------------------ -------------------------------; Vaqtni saqlash o'zgaruvchilari hisobi1 teng 20 hisob 2 teng 21 dis1 teng 22dis2 teng 23dis3 teng 24dis4 teng 25dis5 teng 26dis6 teng 27w_temp teng 28status_temp teng 29ISRCNTR teng 2A; ==================== ================================================= =======; Vektorlarni tiklash; Konfiguratsiyani tekshiring. Yonishdan oldin bitlar !!!; INTOSC; MCLR: YO'Q; PWRUP: yoqilgan; Qolganlari: nogiron !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR boshlash kerak; == ================================================= ============================; ISR;; ----------------------------------------------- -------------------------------- tashkilot ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR BU YERDA; PB0-PB5 kalitlarini tekshiring btfsc PORTB, 0; SW1 qo'ng'irog'ini tekshiring sw1debounce btfsc PORTB, 1; SW1 qo'ng'irog'ini tekshiring sw2debounce btfsc PORTB, 2; SW1 qo'ng'irog'ini tekshiring sw3debounce btfsc PORTB, 3; SW1 qo'ng'irog'ini tekshiring sw4debounce btfsc PORTB, 4; SW1 qo'ng'irog'ini tekshiring sw5debounce btfsc PORTB, 5; SW1 qo'ng'irog'ini tekshiring sw6debounce goto endisrsw1debounce qo'ng'iroqni o'chirish; 0,2 soniya kuting, qo'ng'iroqni o'chirish incf dis1; Movf dis1, W hisoblagichini yangilang; Xorlw 0x1A to'lishini tekshiring; 7-sekundda 10? btfss STATUS, Z qaytish; Yo'q, skanerlashga qayting. movlw h'10 '; Ha, displeyni tiklash. movwf dis1 qaytaradi w2debounce chaqiruvni o'chirish; 0,2 soniya kutib turing, qo'ng'iroqni o'chirish incf dis2; Movf dis2, W hisoblagichini yangilang; Xorlw 0x4A oshib ketishini tekshiring; 7-sekundda 10? btfss STATUS, Z qaytish; Yo'q, skanerlashga qayting. movlw h'40 '; Ha, displeyni tiklash. movwf dis2 returnw3debounce chaqiruvni qaytarish; 0,2 soniya kutib turing, qo'ng'iroqni o'chirish incf dis3; Movf dis3, W hisoblagichini yangilang; Xorlw 0x5A to'lishini tekshiring; 7-sekundda 10? btfss STATUS, Z qaytish; Yo'q, skanerlashga qayting. movlw h'50 '; Ha, displeyni tiklash. movwf dis3 returnw4debounce chaqiruvni qaytarish; 0,2 soniya kuting, qo'ng'iroqni o'chirish disf dis4; Movf dis4, W hisoblagichini yangilang; Xorlw 0x8A oshib ketishini tekshiring; 7-sekundda 10? btfss STATUS, Z qaytish; Yo'q, skanerlashga qayting. movlw h'80 '; Ha, displeyni tiklash. movwf dis4 returnw5debounce chaqiruvni qaytarish; 0,2 soniya kuting, qo'ng'iroqni o'chirish incf dis5; Movf dis5, W hisoblagichini yangilang; Xorlw 0x9A oshib ketishini tekshiring; 7-sekundda 10? btfss STATUS, Z qaytish; Yo'q, skanerlashga qayting. movlw h'90 '; Ha, displeyni tiklash. movwf dis5 returnw6debounce chaqiruvni qaytarish; 0,2 soniya kuting, qo'ng'iroq o'chiriladi, shu jumladan dis6; Movf dis6, W hisoblagichini yangilang; Xorlw 0xCA oshib ketishini tekshiring; 7-sekundda 10? btfss STATUS, Z qaytish; Yo'q, skanerlashga qayting. movlw h'C0 '; Ha, displeyni tiklash. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; =========================== ================================================= =; Bu yerdan boshlang!; ---------------------------------------------- --------------------------------- boshlash; Konfiguratsiya kiritish -chiqarish portlari clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; RA Chiqish, RA5 Movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, hPF movl. RB kirishlari movwf TRISB; Bsf PCON, 3 ichki taymerini o'rnating; 4 MGts ga sozlang. movlw h'CF '; Tmr0 Ichki manba, oldindan hisoblangan TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; TMR0 uzilishlarini yoqish, bcf STATUS, RP0; Registrlarni ishga tushirish clrf PORTA; PortA clrf PORTB -ni tozalash; PortB chiqishlari clrf count1 clrf count2 movlw h'10 'movwf dis1 movlw h'40' movwf dis2 movlw h'50 'movwf dis3 movlw h'80' movwf dis4 movlw h'90 'movwf dis5 movlw h'C0' movwf dis6 call bekor qilmoq; 0,2 soniya; sinov LEDlari, 8 displey ???; =================================== =========================================; Asosiy; Kommutatorlardan, o'chirilishlardan va xatolardan ko'rsatuvlarni oladi.;; Bu displeylarni @4Mhz TMR0 prescal 1: 4 bilan 1KHz tezlikda yangilaydi. 0 displeyi ishlatilmaydigan displeyga ajratish uchun ishlatiladi. 1-6-displey simli.; Birinchidan, BCD-7Seg IC displey qiymati bilan yuklangan, VA BCD-Dec IC faollashtirilgan; displeyni tanlash.; Ikkinchidan, ko'rsatish uchun ms kechikishi.; Uchinchidan, BCD-Dek IC o'chirilgan … displeyni o'chirish uchun display0 tanlangan;; Bu 6 displeyning har biri uchun takrorlanadi va aylanadi. -------------------------------------------------- --------------- asosiy; Disp1 movf dis1, 0 movwf PORTA chaqiruvi ledon goto main; ==================== ================================================= ========; Ledon; LEDni yoqish vaqtini belgilash; 6 displey-1Kts = 166 davrda 1/6 vazifa aylanishi; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; ======================================== =====================================; Chiqib ketish signali; Yuklash va qo'ng'iroq qilish uchun 4 tsikl, qaytish uchun 2 tsikl.; 4MHz Tc:: count2 = 255-> 0,2 sek; -------------------------------------- ----------------------------------------- ko'chirish movlw.255; 1/5 soniyali kechikish. movwf count2 qo'ng'iroq pon_wait qaytish; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 tsikl 0 ga, + 3 tsikl qaytadi.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI dastlab 74LS47 va CD4028 yoqish liniyasidagi har bir displey haydovchi chizig'idan 470 Ohm qarshilikka ega edi. Biroq, men o'z davrimning joriy chizig'ini sinab ko'rdim va u faqat ~ 31mA tortayotganini ko'rdim. Va displeylarning haqiqiy drayveri to'g'ridan -to'g'ri 74LS47 -dan va yoqish boshqa IC -dan bo'lgani uchun, o'rtacha va yuqori talablar tezda pasayadi va tegishli ma'lumotlar jadvallari ….. Men rezistorlarni taxtadan olib tashladim va 1mA farqni topdim. ! Ko'rinib turibdiki, CA segmentini 4028 -dan to'g'ridan -to'g'ri haydash va barcha segmentlarni to'g'ridan -to'g'ri haydash yaxshi! … qandaydir.:) Menda kodda xato bor edi, u tugma bosilganda registrlarimni o'chirmadi, natijada tugma bosilganda oxirgi displeyda 2 ta segment juda yorqin yondi. Bu yomon edi. Biroq, registrni tozalash bu muammoni hal qildi va uzluksiz quvvat tekshiruvi uning doimiy 30mA chizig'ida ekanligini tasdiqlaydi. Bu menga (xuddi shunday sxemalar bo'yicha oldingi tajribaga asoslanib) 1 9V batareyadan (5V regulyatsiyasi bo'yicha 500mAH/30mAH) ~ 20 soatlik ish vaqtini berishi kerak … Umid qilamanki, men LEDni to'g'ridan -to'g'ri boshqarishga qaror qildim, lekin ularni rozetkalarga joylashtirdim. biror narsa yuz bergan bo'lsa, uzoq muddatli.

4 -qadam: tenglikni lehimlash

PCB lehimlash
PCB lehimlash

Har safar men o'z loyihamda shu nuqtaga kelsam, abituriyani kechiktiraman. Avvaliga men bu narsani sim bilan o'rab olmoqchi edim, lekin bu fikrni tezda tashlab qo'ydim. Avvaliga "bir nechta simlarni lehimlash kerak, katta muammo yo'q" deb o'ylayman … keyin, mening loyiham lehimga tayyor bo'lgach, men o'ylayman, " Men proto -taxtani yasash uchun yuborishim kerak edi yoki o'z taxtamni o'yib tashlashim kerak edi. "Men hali ham PCB bilan ishlov bermayman va taxtani yasash uchun $$ to'lashni xohlamadim, shuning uchun …. Ha ….. Men bu narsani lehimga taxminan 3 soat sarfladim. Bu taxminan 150 ta sim, shuning uchun bu 300 ta lehim nuqtasi, lehim ko'prigi uchun teginish, baribir, bu erda taxtaning orqa tomoni tasvirlangan ….ha … tartibsizlik, lekin hamma narsa tugagach, menda faqat 1 lehim bor edi. 20 minut o'ylab ko'rdim, chunki displeyda noto'g'ri #mantiqiy tarzda ko'rsatilib, men uni hal qilishim kerak edi. Shundan so'ng, men qisqa va bamni topdim! Bu mukammal ishladi.

5 -qadam: Xulosa

Xulosa
Xulosa

U ishladi! Bu loyiha taxminan 2 hafta davom etdi; so'rovchiga nozik nuqtalarni o'ylab, elektron pochta orqali yuborish uchun ~ 3 soat kodni to'ldirish va disk raskadrovka, ~ 4 soat non taxlash va disk raskadrovka, ~ 3 soat lehimlash Faqat 3 ta ICdan foydalanish mumkin. Charlieplex 6 7 segmentli LEDlar. Quvvat chizig'i 30 mA atrofida, bu dizayn men uchun yomon emas. Menimcha, 7 segmentli LEDlardan ko'proq foydalanish mumkin, lekin konvertni itarib yubormaganman. 7 segmentli LEDlar yordamida deyarli har qanday ilovaga qo'llanilishi mumkin; Termometr, soat, matnli displey, va hokazo. Agar siz murakkab kodni ishlatsangiz, sizda harakatlanuvchi displey yoki rasmlar bo'lishi mumkin … hatto POV (ko'rish qobiliyati) loyihasi uchun asos ham bo'lishi mumkin. Oxirgi dastur do'stimga o'z minorasini qurishi uchun qoldirilgan. va taxtani o'zi xohlagancha joylashtiring. Agar/Bu bajarilganda, men yuklangan rasmni olaman. Ammo sxemaga kelsak, bu buyurtma uchun qurilgan ko'rinadi!

Tavsiya: