Isi kandungan:

Pembilang Putaran BloodBowl Menggunakan LED 7 segmen: 5 Langkah
Pembilang Putaran BloodBowl Menggunakan LED 7 segmen: 5 Langkah

Video: Pembilang Putaran BloodBowl Menggunakan LED 7 segmen: 5 Langkah

Video: Pembilang Putaran BloodBowl Menggunakan LED 7 segmen: 5 Langkah
Video: 150=... putaran 2024, Julai
Anonim
Pembilang Putaran BloodBowl Menggunakan LED 7 segmen
Pembilang Putaran BloodBowl Menggunakan LED 7 segmen

Projek ini adalah untuk kaunter giliran permainan BloodBowl menggunakan enam LED 7 segmen Charlieplexed.

Langkah 1: Konsep

Konsep
Konsep

Seorang rakan saya bertanya kepada saya mengenai idea untuk membina kaunter Bloodbowl Turn untuk papan permainannya. Tidak mengetahui apa ini, dan apa yang dia mahukan, diperlukan beberapa saat untuk memutuskan apakah dan bagaimana saya akan melakukan ini. Saya pertama kali mempunyai idea tentang apa yang dia mahukan, jadi saya mulakan dengan seni konsep (gambar). Idea asasnya adalah untuk mempunyai 3 butang tekan, mengendalikan 3 LED masing-masing dan ia akan diletakkan di dalam menara yang dibina khas. Satu-satunya permintaan besar adalah agar 4 paparan teratas dihitung dari 0 hingga 8 dan diset semula, dan mempunyai 2 yang lebih rendah paparan mengira dari 8 hingga 0 dan mengitar semula. Saya akan menyelesaikan litar, dan dia akan menyelesaikan menara.

Langkah 2: Senarai Reka Bentuk & Bahagian

Reka Bentuk & Senarai Bahagian
Reka Bentuk & Senarai Bahagian

Oleh kerana konsep ini memerlukan 6 LED 7 segmen, dan saya mempunyai beberapa PIC Microchip 8-bit yang berguna, saya meneliti cara menggunakan PIC untuk mengawal LED. Saya dapati pautan ini https://www.mikroe.com/en/books /picbook/7_08chapter.htm yang menyatakan "Hingga 6 paparan dapat diakses seperti ini tanpa kecerahan setiap paparan terpengaruh." Saya menganggap ini satu cabaran dan sesuatu untuk disiasat sebagai sebahagian daripada projek saya. Perkara pertama yang saya lakukan, adalah mengambil beberapa paparan 7 segmen pijar dari kotak saya dan melihat bagaimana ia berfungsi. Berita buruk. Bahagian tertentu yang saya pilih tidak berkelakuan seperti yang saya mahukan. Segmen akan menyala apabila diperlukan, di papan roti, tetapi arus kebocoran diedarkan ke 6 segmen lain. Saya menyedari paparan pijar mungkin bukan cara yang sesuai, atau saya perlu menggunakannya dengan cara yang berbeza. Oleh itu, untuk kesederhanaan, saya mengesahkan LED 7 segmen yang saya miliki akan berfungsi untuk papan roti, dan memerintahkan beberapa paparan anod biasa. Perkara kedua yang perlu saya lakukan ialah menyusun reka bentuk saya dan memulakan kerja kod. Bergambar adalah litar saya. Tidak banyak, kerana kod dalam PIC mengurus multiplexing… errr Charlieplexing. Catatan: SEMUA 6 paparan mempunyai garis yang SAMA dari IC pemacu. IC pemilih membolehkan setiap paparan, 1 pada satu masa, dan garis 7 segmen dikemas kini oleh PIC dengan sewajarnya. Idea yang sangat mudah. Selepas itu, penyelesaian kod dan perkakasan adalah yang diperlukan. Senarai Bahagian Selepas 3 pesanan kecil dari Digi-Key semasa membuat keputusan mengenai komponen tertentu, saya mempunyai semua yang saya perlukan (dengan beberapa barang di tangan); 1 ~ 3 "x4 "Tombol tekan kecil PCB6 (NO) 1 74LS47, paparan 7 segmen IC1 PIC16F627 1 CD4028, 1 dari 10 pemilih IC 6 10KOhm perintang1 470Ohm perintang1 gulungan dawai. Saya menggunakan pelbagai warna dan alat pengukur, tetapi itu hanya saya.1 Pengatur 78L05 5V1 Klip bateri 9V1 bateri 9V1 suis kecil (untuk menghidupkan / mematikan kuasa) Saya menganggap ini sebagai projek yang agak kompleks, kerana; 1) Kod mikropemproses diperlukan2) Memateri dan papan roti 3) Pengoptimuman reka bentuk. Tidak ada masalah ini sendiri yang terlalu rumit, tetapi mengambil semua tanpa pengalaman boleh menjadi banyak perkara untuk pemula. Seorang pengaturcara perkakasan diperlukan untuk membakar peranti, stesen solder, dan lain-lain… PERTAMA yang mungkin disedari oleh seseorang ialah LED 7-segmen TIDAK mempunyai perintang (had semasa)! Biarkan saya mengatasinya dengan cepat, dengan menyatakan reka bentuk asal saya memilikinya … tetapi baca langkah seterusnya untuk penjelasan!

Langkah 3: Papan Roti & Kod Mikro

Papan Roti & Kod Mikro
Papan Roti & Kod Mikro

Papan roti adalah satu kemestian untuk ini. Yang ditunjukkan adalah papan roti generik saya, tetapi untuk ukuran projek ini, saya sebenarnya menggunakan papan roti ini dan papan roti yang lebih kecil, kerana terdapat banyak wayar yang perlu dijarakkan. Pertama, saya menguji satu LED 7 segmen tunggal menggunakan kod awal. Ini mengesahkan 3 perkara; 1) Pendawaian IC telah disahkan baik! 2) Membimbing saya untuk mengoptimumkan dan menyelesaikan kod saya.3) Membuat saya menyedari bahawa saya tidak memerlukan perintang had sekarang! 1 WIRINGSeperti yang dinyatakan, reka bentuk skematik saya dijumpai untuk bekerja dengan kod saya, kerana LED akan memutar nombor menggunakan satu butang tekan butang, sehingga mengesahkan kod dan susun atur saya. Tidak banyak yang diperlukan tetapi papan roti mengesahkan saya berada dalam keadaan baik.2 CODEI pada awalnya telah menetapkan kod saya dengan rutin utama untuk mengimbas butang dan ISR (Interrupt Service Routine) memaparkan nombor,. Setelah ujian papan roti, saya membalikkan rutinnya, sehingga sebagian besar waktu selalu menampilkan angka dan ISR untuk memeriksa butang. Sebab saya melakukan ini, hanya untuk paparan tetap, kerana PIC berjalan dengan jam 4Mhz dalaman, saya kehilangan sedikit masa untuk mencari butang. Bukan masalah besar … hanya bergantung pada bagaimana anda ingin membuat kod dan apa yang paling masuk akal untuk setiap aplikasi. Untuk ini, paparan adalah penting, jadi saya meletakkannya dalam rutin utama. Apabila bahagian pertama saya tiba (semua 6 paparan!), Saya menyelesaikan pendawaian papan roti dan menemui masalah lain. Semasa menekan butang kod saya mempunyai beberapa daftar ceroboh yang tidak dibersihkan dan ISR menyebabkan beberapa gangguan paparan kecil.; ======================== ================================================== =====; Kaunter Belok;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Butang1 B0 | 6 13 | B7; B1 | 7 12 | B6; B2 | 8 11 | B5; B3 | 9 10 | B4; -----------;; LED1-3 - BCD-dec IC -LEDSeg's1-6; Dsply1-3 - BCD-7seg IC -Dlyply # 1-9;; ================================== =============================================; Sejarah & Catatan Penyemakan:; V1.0 Tajuk Permulaan, Kod 3/30/09;; (C) 5/2009; Kod ini boleh digunakan untuk pembelajaran / aplikasi / pengubahsuaian peribadi; Sebarang penggunaan kod ini dalam produk komersial melanggar pelepasan perisian percuma ini.; Untuk pertanyaan / komen, hubungi rangkaian dot mage di yahoo dot com.; ------------------------------------------------ ------------------------------- # sertakan P16F627A. INC; ============= ================================================== ================; Mentakrifkan; ------------------------------------------------ -------------------------------; ================== ================================================== ===========; Data; ------------------------------------------------ -------------------------------; Pemboleh ubah simpan masacount1 equ 20 count2 equ 21 dis1 equ 22dis2 equ 23dis3 equ 24dis4 equ 25dis5 equ 26dis6 equ 27w_temp equ 28status_temp equ 29ISRCNTR equ 2A; ====================== ================================================== =======; Tetapkan Semula Vektor;; SEMAK KONFIG. BIT SEBELUM MEMBAKAR !!!; INTOSC; MCLR: DIBERIKAN; PWRUP: DIBERIKAN; SEMUA LAIN: Lumpuhkan !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR mulakan; == ================================================== ===========================; ISR;; ----------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR DI SINI; Periksa Suis PB0-PB5 btfsc PORTB, 0; Periksa panggilan SW1 sw1debounce btfsc PORTB, 1; Periksa panggilan SW1 sw2debounce btfsc PORTB, 2; Periksa panggilan SW1 sw3debounce btfsc PORTB, 3; Periksa panggilan SW1 sw4debounce btfsc PORTB, 4; Periksa panggilan SW1 sw5debounce btfsc PORTB, 5; Periksa panggilan SW1 sw6debounce goto endisrsw1debounce call debounce; Tunggu 0.2 saat panggilan debounce incf dis1; Kemas kini kaunter movf dis1, W; Periksa limpahan xorlw 0x1A; 10 pada 7-seg? btfss STATUS, Z kembali; Tidak, kembali untuk mengimbas. movlw h'10 '; Ya, tetapkan semula paparan. movwf dis1 returnsw2debounce call debounce; Tunggu 0.2 saat debounce panggilan incf dis2; Kemas kini kaunter movf dis2, W; Periksa limpahan xorlw 0x4A; 10 pada 7-seg? btfss STATUS, Z kembali; Tidak, kembali untuk mengimbas. movlw h'40 '; Ya, tetapkan semula paparan. movwf dis2 returnsw3debounce call debounce; Tunggu panggilan keluar 0.2 saat incf dis3; Kemas kini kaunter movf dis3, W; Periksa limpahan xorlw 0x5A; 10 pada 7-seg? btfss STATUS, Z kembali; Tidak, kembali untuk mengimbas. movlw h'50 '; Ya, tetapkan semula paparan. movwf dis3 returnsw4debounce call debounce; Tunggu 0.2 saat debounce panggilan incf dis4; Kemas kini kaunter movf dis4, W; Periksa limpahan xorlw 0x8A; 10 pada 7-seg? btfss STATUS, Z kembali; Tidak, kembali untuk mengimbas. movlw h'80 '; Ya, tetapkan semula paparan. movwf dis4 returnsw5debounce call debounce; Tunggu 0.2 saat debounce panggilan incf dis5; Kemas kini kaunter movf dis5, W; Periksa limpahan xorlw 0x9A; 10 pada 7-seg? btfss STATUS, Z kembali; Tidak, kembali untuk mengimbas. movlw h'90 '; Ya, tetapkan semula paparan. movwf dis5 returnsw6debounce call debounce; Tunggu 0.2 saat debounce panggilan incf dis6; Kemas kini kaunter movf dis6, W; Periksa limpahan xorlw 0xCA; 10 pada 7-seg? btfss STATUS, Z kembali; Tidak, kembali untuk mengimbas. movlw h'C0 '; Ya, tetapkan semula paparan. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================ ================================================== =; Mulakan Di Sini!; ---------------------------------------------- --------------------------------- mulakan; Konfigurasi port I / O clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; RA Output, RA5 No output movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw; RP0 movlw; Masukan RB movwf TRISB; Tetapkan pemasa dalaman bsf PCON, 3; Tetapkan ke 4Mhz. movlw h'CF '; Tmr0 Sumber dalaman, preskala TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Aktifkan gangguan TMR0, bcf STATUS, RP0; Memulakan Pendaftaran clrf PORTA; Kosongkan PortA clrf PORTB; Hapus keluaran PortB 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 bangkit; 0.2 saat; LED ujian, paparan 8 ???; ====================================== =========================================; Utama; Mendapatkan input dari paparan suis, debounces dan incriments. Paparan 1-6 adalah kabel. Pertama, BCD-7Seg IC dimuat dengan nilai paparan, DAN BCD-Dec IC diaktifkan untuk; pemilihan paparan. Kedua, kelewatan ms ditahan untuk paparan. Ketiga, BCD-Des IC dinyahaktifkan … display0 dipilih untuk mematikan paparan;; Ini diulang untuk setiap 6 paparan, dan dilingkarkan.; ISR mengendalikan pengalih suis pada kadar 15Hz.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon goto main; ===================== ================================================== ========; Ledon; Menetapkan masa untuk menyalakan LED.; 6 paparan -> 1/6 kitaran tugas pada 1Khz = 166 kitaran; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; =========================================== ====================================; Isyarat debounce; 4 kitaran untuk memuat dan memanggil, 2 kitaran untuk kembali.; 4Mhz Tc:: count2 = 255 -> 0.2 saat; -------------------------------------- ----------------------------------------- lantunkan movlw.255; Kelewatan untuk deboun 1/5 saat. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; hitung1 = 255d:: 775 kitaran hingga 0, + 3 kitaran untuk kembali.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI pada asalnya mempunyai 470Ohm perintang dari setiap barisan pemacu paparan dari saluran pengaktifan 74LS47 dan CD4028. Walau bagaimanapun, saya menguji undian litar saya dan mendapati ia hanya menarik ~ 31mA. Dan kerana pemacu sebenar untuk paparan langsung dari 74LS47 dan diaktifkan adalah dari IC lain, penurunan cepat dari keperluan purata dan puncak, dan lembaran data masing-masing….. Saya menarik perintang dari papan roti dan mendapati perbezaan 1mA ! Nampaknya secara langsung mengemudi garis CA dari 4028 sambil memandu secara langsung semua segmen adalah OK! …lebih kurang.:) Saya TIDAK ADA kesalahan dalam kod saya yang tidak membersihkan daftar saya ketika butang ditekan, menyebabkan paparan terakhir mempunyai 2 segmen yang sangat terang ketika butang ditekan. Ini teruk. Walau bagaimanapun, membersihkan daftar telah menyelesaikan masalah ini, dan pemeriksaan kuasa berterusan mengesahkan bahawa undian berterusan sekitar 30mA. Ini semestinya memberi saya (berdasarkan pengalaman sebelumnya dengan litar yang serupa) ~ 20 jam masa penggunaan menggunakan 1 bateri 9V (500mAH / 30mAH di bawah peraturan 5V) … Saya harap! Saya memutuskan untuk terus menggerakkan LED, tetapi memasukkannya ke soket sekiranya berlaku sesuatu, jangka masa panjang.

Langkah 4: Pematerian PCB

Pematerian PCB
Pematerian PCB

Setiap kali saya sampai ke tahap ini dalam projek saya, saya menunda. Pada mulanya saya akan mengikat barang ini, tetapi dengan cepat menjatuhkan idea itu. Pada mulanya saya fikir "Beberapa wayar untuk disolder, bukan masalah besar" … maka, pada masa projek saya siap dipateri, saya berfikir, " Saya sepatutnya menghantar papan proto, atau mengukir papan saya sendiri ". Saya tidak berminat dengan PCB, dan tidak mahu membayar $$ untuk membuat papan, jadi …. Ya ….. Saya menghabiskan lebih kurang 3 jam untuk menyelesaikan perkara ini. Kira-kira 150 wayar, jadi itu 300 titik solder, ditambah sentuhan untuk jambatan solder. Bagaimanapun, inilah bahagian belakang papan yang digambarkan….yeah… tidak kemas, tetapi ketika semuanya selesai, saya hanya mempunyai 1 solder pendek. Mengambil masa selama 20 minit sejak paparan menunjukkan # salah ditampilkan dalam corak logik yang saya harus fahami. Selepas itu, saya mencari jalan pendek, dan bam! Ia berfungsi dengan sempurna.

Langkah 5: Kesimpulannya

Kesimpulannya
Kesimpulannya

KERJA! Projek ini mengambil masa; ~ 2 minggu untuk difikirkan dan hantarkan e-mel yang baik kepada peminta permintaan, ~ 3 jam penyelesaian kod dan debug, ~ 4 jam papan roti dan debug, ~ 3 jam pematerian Dengan hanya menggunakan 3 IC, mungkin untuk Charlieplex 6 7-segmen LED. Cabutan kuasa kira-kira 30mA dengan reka bentuk ini, yang tidak buruk jika saya mengatakannya sendiri. Saya mengesyaki lebih banyak LED 7-segmen boleh digunakan, tetapi tidak mendorong sampul surat. Idea ini boleh digunakan pada hampir SETIAP aplikasi menggunakan LED 7 segmen; termometer, jam, paparan teks, dan lain-lain. Dengan beberapa kod yang rumit, anda mungkin mempunyai paparan bergerak, atau gambar … mungkin juga sebagai asas untuk projek POV (kegigihan penglihatan). Pelaksanaan akhir ditinggalkan oleh rakan saya untuk membina Menara nya dan letakkan papan itu, sesuai yang difikirkannya sesuai. Sekiranya / Setelah selesai, saya akan memuat naik gambar. Tetapi untuk litar, ini nampaknya dibina mengikut pesanan!

Disyorkan: