Daftar Isi:

BloodBowl Turn Counter Menggunakan LED 7-segmen: 5 Langkah
BloodBowl Turn Counter Menggunakan LED 7-segmen: 5 Langkah

Video: BloodBowl Turn Counter Menggunakan LED 7-segmen: 5 Langkah

Video: BloodBowl Turn Counter Menggunakan LED 7-segmen: 5 Langkah
Video: detik detik pesawat Sriwijaya air sj182 2024, Juli
Anonim
Penghitung Putaran BloodBowl Menggunakan LED 7-segmen
Penghitung Putaran BloodBowl Menggunakan LED 7-segmen

Proyek ini untuk penghitung giliran permainan BloodBowl menggunakan enam LED 7-segmen Charlieplexed.

Langkah 1: Konsep

Konsep
Konsep

Seorang teman saya bertanya kepada saya tentang ide untuk membangun penghitung Bloodbowl Turn untuk boardgame-nya. Tidak tahu apa ini, dan apa yang dia inginkan, butuh beberapa saat untuk memutuskan apakah dan bagaimana saya akan melakukan ini. Pertama-tama saya harus memiliki ide tentang apa yang dia inginkan, jadi saya mulai dengan concept art (gambar). Ide dasarnya adalah memiliki 3 tombol tekan, masing-masing mengendalikan 3 LED dan itu akan ditempatkan di dalam menara yang dibuat khusus. Satu-satunya permintaan besar adalah agar 4 tampilan teratas dihitung dari 0 hingga 8 dan disetel ulang, dan memiliki 2 yang lebih rendah menampilkan menghitung mundur dari 8 ke 0 dan siklus kembali. Saya akan menyelesaikan sirkuit, dan dia akan menyelesaikan menara.

Langkah 2: Desain & Daftar Suku Cadang

Desain & Daftar Suku Cadang
Desain & Daftar Suku Cadang

Karena konsep tersebut membutuhkan 6 LED 7-segmen, dan saya memiliki beberapa PIC Microchip 8-bit, saya meneliti cara menggunakan PIC untuk mengontrol LED. Saya menemukan tautan ini https://www.mikroe.com/en/books /picbook/7_08chapter.htm yang menyatakan " Hingga 6 tampilan dapat diakses seperti ini tanpa mempengaruhi kecerahan setiap tampilan." Saya menganggap ini sebagai tantangan dan sesuatu untuk diselidiki sebagai bagian dari proyek saya. Hal pertama yang saya lakukan, adalah mengambil beberapa tampilan 7-segmen pijar dari kotak saya dan melihat cara kerjanya. Kabar buruk. Bagian tertentu yang saya pilih tidak berperilaku seperti yang saya inginkan. Segmen akan menyala saat dibutuhkan, di papan tempat memotong roti, tetapi arus bocor didistribusikan ke 6 segmen lainnya. Saya menyadari tampilan pijar mungkin bukan cara yang tepat, atau saya perlu menggunakannya dengan cara yang berbeda. Jadi untuk kesederhanaan, saya memverifikasi bahwa LED 7-segmen yang saya miliki akan berfungsi untuk papan tempat memotong roti, dan memesan beberapa tampilan anoda umum. Hal kedua yang perlu saya lakukan adalah menata desain saya dan mulai mengerjakan kodenya. Digambarkan adalah sirkuit saya. Tidak banyak, karena kode di PIC menangani multiplexing…errr Charlieplexing. Catatan: SEMUA 6 tampilan memiliki garis yang SAMA dari IC driver. IC pemilih mengaktifkan setiap tampilan, 1 pada satu waktu, dan garis 7-segmen diperbarui oleh PIC yang sesuai. Ide yang sangat sederhana. Setelah itu, hanya diperlukan penyelesaian kode dan perangkat keras. Daftar Suku Cadang Setelah 3 pesanan kecil dari Digi-Key sambil memutuskan komponen tertentu, saya memiliki semua yang saya butuhkan (dengan beberapa barang di tangan);1 ~3"x4 " PCB6 sakelar tombol tekan kecil (NO)1 74LS47, tampilan 7 segmen IC1 PIC16F627 1 CD4028, 1 dari 10 selektor IC 6 resistor 10KOhm1 resistor 470Ohm1 kumparan kawat. Saya menggunakan berbagai warna dan ukuran, tapi itu hanya saya.1 Regulator 78L05 5V1 klip baterai 9V1 Baterai 9V1 sakelar kecil (untuk menghidupkan/mematikan) Saya menganggap ini proyek yang cukup rumit, karena;1) Diperlukan kode mikroprosesor2) Solder dan breadboarding 3) Optimalisasi desain. Tak satu pun dari masalah ini sendiri yang terlalu rumit, tetapi menjalankan semuanya tanpa pengalaman dapat sedikit banyak bagi pemula. Seorang programmer perangkat keras diperlukan untuk membakar perangkat, stasiun solder, dll…Hal PERTAMA yang mungkin diperhatikan seseorang adalah bahwa LED 7-segmen TIDAK memiliki resistor seri (pembatas arus)! Biarkan saya mengatasinya dengan cepat, dengan menyatakan desain asli saya memilikinya … tetapi baca langkah selanjutnya untuk penjelasan!

Langkah 3: Breadboarding & Kode Mikro

Breadboarding & Kode Mikro
Breadboarding & Kode Mikro

Papan tempat memotong roti adalah suatu keharusan untuk ini. Ditampilkan adalah papan tempat memotong roti generik saya, tetapi untuk ukuran proyek ini saya benar-benar menggunakan yang ini dan papan tempat memotong roti yang lebih kecil, karena ada banyak kabel yang perlu diberi jarak. Pertama, saya menguji satu LED 7-segmen tunggal menggunakan kode awal. Ini mengkonfirmasi 3 hal; 1) Pengkabelan IC telah diverifikasi dengan baik! 2) Memimpin saya untuk mengoptimalkan dan menyelesaikan kode saya. 3) Membuat saya sadar bahwa saya tidak memerlukan resistor pembatas arus! 1 KABEL Seperti yang dinyatakan, desain skematik saya ditemukan untuk bekerja dengan kode saya, karena LED akan menggilir angka menggunakan satu tombol tekan, sehingga memverifikasi kode dan tata letak saya. Tidak banyak yang diperlukan tetapi breadboarding mengonfirmasi bahwa saya dalam kondisi yang baik.2 CODEI awalnya memiliki kode saya yang disetel dengan rutinitas utama untuk memindai tombol dan ISR (Interrupt Service Routine) menampilkan angka,. Setelah tes papan tempat memotong roti, saya membalikkan rutinitas, jadi sebagian besar waktu terus-menerus menampilkan angka dan ISR untuk memeriksa tombol. Alasan saya melakukan ini, hanya untuk memiliki tampilan yang konstan, karena PIC berjalan dengan jam internal 4Mhz, saya kehilangan sedikit waktu untuk memindai tombol. Bukan masalah besar… hanya tergantung pada bagaimana Anda ingin melakukan kode dan apa yang paling masuk akal untuk setiap aplikasi. Untuk ini, tampilan itu penting, jadi saya memasukkannya ke dalam rutinitas utama. Ketika bagian pertama saya tiba (semua 6 tampilan!), Saya menyelesaikan pemasangan kabel papan tempat memotong roti dan menemukan masalah lain. Saat menekan tombol, kode saya memiliki beberapa register ceroboh yang tidak dihapus dan ISR menyebabkan beberapa gangguan tampilan kecil.;======================== ================================================== =====;Putar Penghitung;; -----------;Dsply3 Dsply2;Dsply4 Dsply1;Led1 Led3; A5 |4 15| A6 -- Led2; Vss |5 14| Vdd;Tombol1 B0 |6 13| B7; B1 |7 12| B6; B2 |8 11| B5; B3 |9 10| B4; -----------;; LED1-3 - IC BCD-dec -LEDSeg's1-6; Dsply1-3 - IC BCD-7seg -Dsply#1-9;;================================== =============================================; Riwayat Revisi & Catatan:; Header Awal V1.0, Kode 30/3/09;;;(C) 5/ 2009;Kode ini dapat digunakan untuk pembelajaran/aplikasi/modifikasi pribadi.;Setiap penggunaan kode ini dalam produk komersial melanggar rilis freeware ini.;Untuk pertanyaan/komentar, hubungi sirkuit dot mage di yahoo dot com.;------------------------------------------------ -------------------------------#include P16F627A. INC;============== ================================================== ==================; Mendefinisikan;------------------------------------------------ ------------------------------------------;==================== ================================================== ===========; Data;------------------------------------------------ -------------------------------; Variabel penyimpanan waktuhitung1 persamaan 20 hitungan2 persamaan 21 dis1 persamaan 22dis2 persamaan 23dis3 persamaan 24dis4 persamaan 25dis5 persamaan 26dis6 persamaan 27w_temp persamaan 28status_temp persamaan 29ISRCNTR persamaan 2A;====================== ================================================== =======; Atur Ulang Vektor;; PERIKSA KONFIGURASI BIT SEBELUM TERBAKAR!!!; INTOSC; MCLR: DIAKTIFKAN; PWRUP: DIAKTIFKAN; SEMUA LAINNYA: NONAKTIFKAN!!;;------------------------------------------ -------------------------------------RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR mulai;== ================================================== ===========================; RS;;------------------------------------------------- --------------------------------org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR DI SINI; Periksa PB0-PB5 Switch 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 panggilan debounce; Tunggu 0.2 detik panggilan debounce incf dis1; Perbarui penghitung movf dis1, W; Periksa overflow xorlw 0x1A; 10 di 7-seg? STATUS btfss, Z kembali; Tidak, kembali untuk memindai. movlw h'10'; Ya, setel ulang tampilan. movwf dis1 kembaliw2debounce panggilan debounce; Tunggu 0.2 detik panggilan debounce incf dis2; Perbarui penghitung movf dis2, W; Periksa overflow xorlw 0x4A; 10 di 7-seg? STATUS btfss, Z kembali; Tidak, kembali untuk memindai. movlw h'40'; Ya, setel ulang tampilan. movwf dis2 kembaliw3debounce panggilan debounce; Tunggu 0.2 detik panggilan debounce incf dis3; Perbarui penghitung movf dis3, W; Periksa overflow xorlw 0x5A; 10 di 7-seg? STATUS btfss, Z kembali; Tidak, kembali untuk memindai. movlw h'50'; Ya, setel ulang tampilan. movwf dis3 kembaliw4debounce panggilan debounce; Tunggu 0.2 detik panggilan debounce incf dis4; Perbarui penghitung movf dis4, W; Periksa overflow xorlw 0x8A; 10 di 7-seg? STATUS btfss, Z kembali; Tidak, kembali untuk memindai. movlw h'80'; Ya, setel ulang tampilan. movwf dis4 kembaliw5debounce panggilan debounce; Tunggu 0.2 detik panggilan debounce incf dis5; Perbarui penghitung movf dis5, W; Periksa overflow xorlw 0x9A; 10 di 7-seg? STATUS btfss, Z kembali; Tidak, kembali untuk memindai. movlw h'90'; Ya, setel ulang tampilan. movwf dis5 mengembalikanw6debounce panggilan debounce; Tunggu 0.2 detik panggilan debounce incf dis6; Perbarui penghitung movf dis6, W; Periksa overflow xorlw 0xCA; 10 di 7-seg? STATUS btfss, Z kembali; Tidak, kembali untuk memindai. movlw h'C0'; Ya, setel ulang tampilan. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie;============================ ================================================== =; Mulai di sini!;---------------------------------------------- ---------------------------------Mulailah; Port I/O konfigurasi clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00';RA Keluaran, RA5 Tidak ada keluaran movwf STATUS TRISA bcf, RP0 clrf PORTB STATUS RPh'FF'; Masukan RB movwf TRISB; Setel timer internal bsf PCON, 3; Setel ke 4Mhz. movlw h'CF'; Tmr0 Sumber internal, skala awal TMR0 1:256 movwf OPTION_REG movlw h'A0' movwf INTCON; Aktifkan interupsi TMR0, bcf STATUS, RP0; Inisialisasi Register clrf PORTA; Hapus PortA clrf PORTB; Hapus output 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 memantulkan; 0,2 detik; LED uji, tampilan 8 ???;====================================== =========================================; Utama; Mendapat input dari sakelar, debounce, dan tampilan incriments.;;Ini memperbarui tampilan, @4Mhz dengan TMR0 prescal 1:4, pada kecepatan 1Khz.;Tampilan 0 digunakan untuk mengalokasikan ke tampilan yang tidak digunakan. Tampilan 1-6 disambungkan.;Pertama, IC BCD-7Seg dimuat dengan nilai tampilan, DAN IC BCD-Des diaktifkan untuk;pemilihan tampilan.;Kedua, penundaan ms ditahan untuk tampilan.;Ketiga, BCD-Des IC dinonaktifkan…display0 dipilih untuk mematikan tampilan;;Ini diulang untuk masing-masing dari 6 tampilan, dan dilingkarkan.;ISR menangani penginderaan sakelar pada laju 15Hz.;-------------- -------------------------------------------------- ---------------main;Disp1 movf dis1, 0 movwf PORTA call ledon goto main;====================== ================================================== ========; Memimpin; Menyetel waktu untuk menyalakan LED.; 6 tampilan -> 1/6 siklus kerja pada 1Khz = 166 siklus;----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn;========================================== ====================================; Sinyal debounce; 4 siklus untuk memuat dan memanggil, 2 siklus untuk kembali.; 4Mhz Tc:: count2=255 -> 0.2 sec;-------------------------------------- -----------------------------------------debounce movlw.255; Delay selama 1/5 detik debounce. movwf count2 panggilan pon_wait kembali;-------------------------------------------- -----------------------------------; count1=255d:: 775 siklus ke 0, + 3 siklus untuk kembali.;--------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI awalnya memiliki resistor 470Ohm dari setiap baris driver tampilan dari jalur pengaktifan 74LS47 dan CD4028. Namun, saya menguji penarikan sirkuit saya saat ini dan ternyata hanya menarik ~31mA. Dan karena driver sebenarnya untuk tampilan langsung dari 74LS47 dan mengaktifkannya dari IC lain, penurunan cepat dari persyaratan rata-rata dan puncak, dan lembar data masing-masing….. Saya menarik resistor dari papan tempat memotong roti dan menemukan perbedaan 1mA ! Tampaknya mengemudikan jalur CA dari 4028 secara langsung sambil mengemudikan semua segmen secara langsung tidak masalah! … semacam.:)Saya memiliki kesalahan dalam kode saya yang tidak menghapus register saya ketika sebuah tombol ditekan, menyebabkan tampilan terakhir memiliki 2 segmen yang sangat terang ketika sebuah tombol ditekan. Ini buruk. Namun, mengosongkan register memperbaiki masalah ini, dan pemeriksaan daya terus menerus memastikan bahwa itu terus-menerus sekitar 30mA imbang. Ini akan memberi saya (berdasarkan pengalaman sebelumnya dengan sirkuit serupa) ~ 20 jam waktu berjalan menggunakan baterai 1 9V (500mAH/30mAH di bawah regulasi 5V)…Saya harap!Saya memutuskan untuk tetap menyalakan LED secara langsung, tetapi memasukkannya ke dalam soket kasus sesuatu terjadi, jangka panjang.

Langkah 4: Solder PCB

Solder PCB
Solder PCB

Setiap kali saya mencapai titik ini dalam proyek saya, saya menunda sedikit. Awalnya saya akan membungkus benda ini dengan kawat, tetapi dengan cepat membuang ide itu. Pada awalnya saya berpikir "Beberapa kabel untuk disolder, bukan masalah besar"…kemudian, pada saat proyek saya siap untuk disolder, saya berpikir, " Saya seharusnya mengirim untuk membuat papan proto, atau mengetsa papan saya sendiri". Saya tidak menyukai etsa PCB (belum), dan tidak ingin membayar $$ untuk membuat papan, jadi…. Ya….. Saya menghabiskan sekitar 3 jam menyolder benda ini. Ini sekitar 150 kabel, jadi itu 300 titik solder, ditambah sentuhan untuk jembatan solder. Bagaimanapun, ini sisi belakang papan yang digambarkan …. ya … agak berantakan, tetapi ketika semuanya selesai saya hanya memiliki 1 solder pendek. Butuh waktu 20 menit untuk berpikir karena tampilan menunjukkan # yang salah ditampilkan dalam pola logis yang harus saya uraikan. Setelah itu, saya menemukan short, dan bam! Itu bekerja dengan sempurna.

Langkah 5: Kesimpulan

Kesimpulan
Kesimpulan

BERHASIL! Proyek ini memakan waktu sekitar;~2 minggu untuk memikirkan dan mengirimkan poin-poin bagus ke pemohon, ~3 jam penyelesaian kode dan debug, ~4 jam papan tempat memotong roti dan debug, ~3 jam menyolderMenggunakan hanya 3 IC dimungkinkan untuk Charlieplex 6 LED 7-segmen. Penarikan daya sekitar 30mA dengan desain ini, yang tidak buruk jika saya mengatakannya sendiri. Saya menduga lebih banyak LED 7-segmen dapat digunakan, tetapi belum mendorong amplop. Ide ini bisa diterapkan ke hampir APAPUN aplikasi menggunakan LED 7-segmen; termometer, jam, tampilan teks, dll. Dengan beberapa kode rumit, Anda dapat memiliki tampilan bergerak, atau gambar…bahkan mungkin menjadi dasar untuk proyek POV (persistence of vision). Implementasi akhir diserahkan kepada teman saya untuk membangun Menaranya dan tempatkan papan, sesuai keinginannya. Jika / Ketika itu selesai, saya akan mendapatkan gambar yang diunggah. Tetapi untuk sirkuitnya, ini tampaknya dibuat sesuai pesanan!

Direkomendasikan: