Mục lục:

Bộ đếm lượt BloodBowl Sử dụng đèn LED 7 đoạn: 5 bước
Bộ đếm lượt BloodBowl Sử dụng đèn LED 7 đoạn: 5 bước

Video: Bộ đếm lượt BloodBowl Sử dụng đèn LED 7 đoạn: 5 bước

Video: Bộ đếm lượt BloodBowl Sử dụng đèn LED 7 đoạn: 5 bước
Video: TerranScapes - Orc Display Board WIP#5 - Turn Counter 2024, Tháng bảy
Anonim
Bộ đếm lượt BloodBowl Sử dụng đèn LED 7 đoạn
Bộ đếm lượt BloodBowl Sử dụng đèn LED 7 đoạn

Dự án này dành cho máy đếm lượt trò chơi BloodBowl sử dụng sáu đèn LED 7 đoạn Charlieplexed.

Bước 1: Khái niệm

Ý tưởng
Ý tưởng

Một người bạn của tôi đã hỏi tôi về ý tưởng xây dựng bộ đếm Bloodbowl Turn cho trò chơi boardgame của anh ấy. Không biết đây là gì và anh ấy muốn gì, phải mất một lúc để quyết định xem tôi sẽ làm điều này như thế nào và tôi sẽ làm điều này như thế nào. Ý tưởng cơ bản là có 3 nút nhấn, mỗi nút điều khiển 3 đèn LED và nó sẽ được đặt bên trong một tháp xây dựng tùy chỉnh. hiển thị đếm ngược từ 8 đến 0 và quay ngược lại. Tôi sẽ hoàn thành mạch và anh ta sẽ hoàn thành tháp.

Bước 2: Thiết kế & Danh sách các bộ phận

Danh sách thiết kế & bộ phận
Danh sách thiết kế & bộ phận

Vì khái niệm gọi là 6 LED 7 đoạn và tôi đã có một số PIC vi mạch 8-bit, tôi đã nghiên cứu các cách sử dụng PIC để điều khiển đèn LED. Tôi tìm thấy liên kết này https://www.mikroe.com/en/books /picbook/7_08chapter.htm cho biết "Có thể truy cập tối đa 6 màn hình như thế này mà độ sáng của mỗi màn hình không bị ảnh hưởng." Tôi coi đây là một thách thức và là điều cần nghiên cứu trong dự án của mình. Điều đầu tiên tôi làm là lấy một số màn hình 7 đoạn sợi đốt từ hộp của mình và xem chúng sẽ hoạt động như thế nào. Tin xấu. Các phần cụ thể mà tôi đã chọn không hoạt động như tôi muốn. Phân đoạn này sẽ sáng khi cần thiết, trên bảng mạch, nhưng dòng điện rò rỉ đã được phân phối cho 6 phân đoạn còn lại. Tôi nhận ra rằng màn hình sợi đốt có thể không phải là cách để đi, hoặc tôi cần sử dụng chúng theo một cách khác. Vì vậy, để đơn giản hơn, tôi đã xác minh đèn LED 7 đoạn mà tôi có trong tay sẽ hoạt động cho breadboarding và đặt hàng một số màn hình cực dương phổ biến. Điều thứ hai tôi cần làm là bố trí thiết kế của mình và bắt đầu công việc trên mã. Trong ảnh là mạch của tôi. Không nhiều về nó, vì mã trong PIC xử lý việc ghép kênh… lỗi Charlieplexing. Lưu ý: TẤT CẢ 6 màn hình đều có cùng dòng từ IC trình điều khiển. IC chọn cho phép hiển thị từng màn hình, mỗi lần hiển thị, và các đường 7 đoạn được PIC cập nhật tương ứng. Ý tưởng rất đơn giản Sau đó, hoàn thành mã và phần cứng là tất cả những gì cần thiết. “Công tắc nút nhấn nhỏ PCB6 (NO) 1 74LS47, IC hiển thị 7 đoạn1 PIC16F627 1 CD4028, 1 trong 10 IC chọn 6 điện trở 10KOhm1 điện trở 470Ohm1 ống chỉ. Tôi đã sử dụng nhiều màu sắc và kiểu dáng khác nhau, nhưng đó chỉ là tôi. 1 Bộ điều chỉnh 5V 78L051 Kẹp pin 9V1 Pin 9V1 công tắc nhỏ (để bật / tắt nguồn) Tôi coi đây là một dự án vừa phải phức tạp, do; 1) Yêu cầu mã bộ vi xử lý2) Hàn và breadboarding 3) Tối ưu hóa thiết kế. Bản thân không có vấn đề nào trong số này là quá phức tạp, nhưng thực hiện tất cả chúng mà không có bất kỳ kinh nghiệm nào có thể gây khó khăn cho người mới bắt đầu. Một lập trình viên phần cứng được yêu cầu để ghi thiết bị, trạm hàn, v.v. Hãy để tôi giải quyết vấn đề đó một cách nhanh chóng, bằng cách nói rõ thiết kế ban đầu của tôi có chúng … nhưng hãy đọc bước tiếp theo để giải thích!

Bước 3: Breadboarding & Micro Code

Breadboarding & Mã vi mô
Breadboarding & Mã vi mô

Breadboard là phải cho điều này. Được hiển thị là breadboard chung của tôi, nhưng đối với kích thước của dự án này, tôi thực sự đã sử dụng cái này và một breadboard nhỏ hơn, vì có nhiều dây cần được đặt cách nhau. Đầu tiên, tôi đã thử nghiệm một đèn LED 7 đoạn duy nhất bằng mã ban đầu. Điều này đã xác nhận 3 điều; 1) Hệ thống dây của IC đã được xác minh là tốt! 2) Hướng dẫn tôi tối ưu hóa và hoàn thiện mã của mình. 3) Làm cho tôi nhận ra rằng tôi không cần các điện trở giới hạn hiện tại! để làm việc với mã của tôi, vì đèn LED sẽ chuyển động qua các số bằng một công tắc nút nhấn, để xác minh mã và bố cục của tôi. Không yêu cầu nhiều nhưng breadboarding xác nhận rằng tôi đang ở trong tình trạng tốt.2 CODEI ban đầu có bộ mã của tôi với quy trình chính để quét các nút và ISR (Quy trình dịch vụ ngắt) hiển thị các số,. Sau khi kiểm tra breadboarding, tôi đã đảo ngược các quy trình, vì vậy phần lớn thời gian liên tục hiển thị số và ISR để kiểm tra các nút. Lý do tôi làm điều này, chỉ là để có một màn hình hiển thị liên tục, vì PIC đang chạy với đồng hồ 4Mhz bên trong, tôi mất rất ít thời gian để quét các nút. Không có vấn đề gì lớn… chỉ phụ thuộc vào cách bạn muốn thực hiện mã và điều gì có ý nghĩa nhất đối với mỗi ứng dụng. Đối với điều này, hiển thị là quan trọng, vì vậy tôi đưa nó vào quy trình chính. Khi các bộ phận đầu tiên của tôi đến (tất cả 6 màn hình!), Tôi đã hoàn thành việc nối dây breadboard và phát hiện ra một vấn đề khác. Khi nhấn nút, mã của tôi có một số thanh ghi cẩu thả chưa được xóa và ISR đang gây ra một số trục trặc hiển thị nhỏ.; ========================== ================================================== =====; Lượt truy cập;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Nút1 B0 | 6 13 | B7; B1 | 7 12 | B6; B2 | 8 11 | B5; B3 | 9 10 | B 4; -----------;; LED1-3 - IC BCD-dec -LEDSeg's1-6; Dsply1-3 - IC BCD-7seg -Dsply # 1-9;; ================================== =============================================; Lịch sử sửa đổi & ghi chú:; V1.0 Tiêu đề ban đầu, Mã 3/30/09;;; (C) 5/2009; Mã này có thể được sử dụng cho việc học tập / ứng dụng / sửa đổi cá nhân.; Bất kỳ việc sử dụng mã này trong các sản phẩm thương mại đều vi phạm bản phát hành phần mềm miễn phí này..; -------------------------------------------------- ------------------------------- # bao gồm P16F627A. INC; ============= ================================================== ================; Xác định; ------------------------------------------------ -------------------------------; ================== ================================================== ===========; Dữ liệu;------------------------------------------------ -------------------------------; Các biến giữ thời giancount1 = 20 count2 = 21 dis1 = 22dis2 = 23dis3 = 24dis4 = 25dis5 = 26dis6 = 27w_temp = 28status_temp = 29ISRCNTR = 2A; ========================= ================================================== =======; Đặt lại Vectơ;; KIỂM TRA CẤU HÌNH. BITS TRƯỚC KHI TRỞ LẠI !!!; INTOSC; MCLR: ĐÃ BẬT; PWRUP: ĐÃ BẬT; TẤT CẢ NHỮNG NGƯỜI KHÁC: BẤT CHẤP !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR goto start; == ================================================== ===========================; ISR;; ----------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; CÓ Ở ĐÂY; Kiểm tra PB0-PB5 Công tắc btfsc PORTB, 0; Kiểm tra cuộc gọi SW1 sw1debounce btfsc PORTB, 1; Kiểm tra cuộc gọi SW1 sw2debounce btfsc PORTB, 2; Kiểm tra cuộc gọi SW1 sw3debounce btfsc PORTB, 3; Kiểm tra cuộc gọi SW1 sw4debounce btfsc PORTB, 4; Kiểm tra cuộc gọi SW1 sw5debounce btfsc PORTB, 5; Kiểm tra cuộc gọi SW1 sw6debounce goto endisrsw1debounce call debounce; Chờ 0,2 giây cuộc gọi gỡ lỗi incf dis1; Cập nhật bộ đếm movf dis1, W; Kiểm tra tràn xorlw 0x1A; 10 trên 7-seg? btfss TRẠNG THÁI, Z trả về; Không, quay lại để quét. movlw h'10 '; Có, đặt lại màn hình. movwf dis1 returnnsw2debounce cuộc gọi debounce; Chờ 0,2 giây cuộc gọi gỡ lỗi incf dis2; Cập nhật bộ đếm movf dis2, W; Kiểm tra tràn xorlw 0x4A; 10 trên 7-seg? btfss TRẠNG THÁI, Z trả về; Không, quay lại để quét. movlw h'40 '; Có, đặt lại màn hình. movwf dis2 returnnsw3debounce cuộc gọi debounce; Chờ 0,2 giây cuộc gọi gỡ lỗi incf dis3; Cập nhật bộ đếm movf dis3, W; Kiểm tra tràn xorlw 0x5A; 10 trên 7-seg? btfss TRẠNG THÁI, Z trở lại; Không, quay lại để quét. movlw h'50 '; Có, đặt lại màn hình. movwf dis3 returnnsw4debounce cuộc gọi debounce; Chờ 0,2 giây cuộc gọi gỡ lỗi incf dis4; Cập nhật bộ đếm movf dis4, W; Kiểm tra tràn xorlw 0x8A; 10 trên 7-seg? btfss TRẠNG THÁI, Z trả về; Không, quay lại để quét. movlw h'80 '; Có, đặt lại màn hình. movwf dis4 returnnsw5debounce cuộc gọi debounce; Chờ 0,2 giây cuộc gọi gỡ lỗi incf dis5; Cập nhật bộ đếm movf dis5, W; Kiểm tra tràn xorlw 0x9A; 10 trên 7-seg? btfss TRẠNG THÁI, Z trở lại; Không, quay lại để quét. movlw h'90 '; Có, đặt lại màn hình. movwf dis5 returnnsw6debounce cuộc gọi debounce; Chờ 0,2 giây cuộc gọi gỡ lỗi incf dis6; Cập nhật bộ đếm movf dis6, W; Kiểm tra tràn xorlw 0xCA; 10 trên 7-seg? btfss TRẠNG THÁI, Z trả về; Không, quay lại để quét. movlw h'C0 '; Có, đặt lại màn hình. movwf dis6 returnnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================ ================================================== =; Bắt đầu ở đây!;---------------------------------------------- ---------------------------------bắt đầu; Cấu hình các cổng I / O clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; RA Outputs, RA5 No output movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF'; Đầu vào RB movwf TRISB; Đặt hẹn giờ bên trong bsf PCON, 3; Đặt thành 4Mhz. movlw h'CF '; Tmr0 Nguồn nội bộ, tỷ lệ đặt trước TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Kích hoạt ngắt TMR0, bcf STATUS, RP0; Khởi tạo thanh ghi clrf PORTA; Xóa PortA clrf PORTB; Xóa các đầu ra 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' gọi sự suy nhược; 0,2 giây; kiểm tra đèn LED, hiển thị 8 ???; ====================================== =========================================; Chủ chốt; Nhận đầu vào từ các thiết bị chuyển mạch, lỗi và màn hình hiển thị. Màn hình 1-6 có dây.; Đầu tiên, IC BCD-7Seg được tải với giá trị hiển thị, VÀ IC BCD-Dec được kích hoạt cho; lựa chọn hiển thị.; Thứ hai, độ trễ ms được giữ để hiển thị.; Thứ ba, BCD-Dec IC bị vô hiệu hóa… display0 được chọn để tắt màn hình;; Điều này được lặp lại cho từng màn hình trong số 6 màn hình và được lặp lại.; ISR xử lý cảm biến công tắc ở tốc độ 15Hz.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA gọi ledon goto main; ===================== ================================================== ========; Ledon; Giải quyết thời gian để đèn LED bật nguồn; 6 hiển thị -> 1/6 chu kỳ nhiệm vụ ở 1Khz = 166 chu kỳ; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; =========================================== ====================================; Tín hiệu Debounce; 4 chu kỳ để tải và gọi, 2 chu kỳ để quay lại; 4Mhz Tc:: count2 = 255 -> 0,2 giây; -------------------------------------- ----------------------------------------- gỡ rối movlw.255; Độ trễ trong 1/5 giây ra mắt. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 chu kỳ đến 0, + 3 chu kỳ để quay lại.; ------------------------------------------ ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 MẠCH Tôi ban đầu có điện trở 470Ohm từ mỗi dòng trình điều khiển màn hình từ dòng kích hoạt 74LS47 và CD4028. Tuy nhiên, tôi đã kiểm tra dòng điện của mạch và thấy nó chỉ kéo ~ 31mA. Và vì trình điều khiển thực tế cho các màn hình là trực tiếp từ 74LS47 và kích hoạt là từ một vi mạch khác, việc chạy nhanh các yêu cầu trung bình và cao nhất cũng như các bảng dữ liệu tương ứng….. Tôi đã kéo các điện trở ra khỏi breadboard và nhận thấy sự khác biệt 1mA ! Có vẻ như trực tiếp lái xe tuyến CA từ 4028 trong khi lái xe trực tiếp tất cả các đoạn là OK! … Đại loại.:) Tôi đã xảy ra sự cố trong mã của tôi không xóa sổ đăng ký của tôi khi một nút được nhấn, khiến màn hình cuối cùng có 2 phân đoạn rất sáng khi nhấn một nút. Điều này thật tệ. Tuy nhiên, việc xóa thanh ghi đã khắc phục sự cố này và kiểm tra nguồn liên tục xác nhận rằng nó liên tục rút ra khoảng 30mA. Điều này sẽ mang lại cho tôi (dựa trên kinh nghiệm trước đây với các mạch tương tự) ~ 20 giờ thời gian chạy khi sử dụng 1 pin 9V (500mAH / 30mAH theo quy định 5V)… Tôi hy vọng! Tôi quyết định giữ nguyên điều khiển trực tiếp của đèn LED, nhưng đặt chúng vào ổ cắm trường hợp một cái gì đó đã xảy ra, lâu dài.

Bước 4: Hàn PCB

Hàn PCB
Hàn PCB

Mỗi khi tôi đến điểm này trong dự án của mình, tôi đều trì hoãn việc bỏ dở. Lúc đầu, tôi định quấn dây cho thứ này, nhưng nhanh chóng bỏ ý định đó. Đầu tiên tôi nghĩ "Một vài sợi dây để hàn, không có vấn đề gì lớn" … sau đó, vào thời điểm dự án của tôi đã sẵn sàng để hàn, tôi đang suy nghĩ, " Lẽ ra, tôi nên gửi đi để có một bảng proto được tạo ra, hoặc khắc bảng của riêng tôi ". Tôi không thích khắc PCB (chưa), và không muốn trả $$ để làm một bảng, vì vậy…. Yeah….. Tôi đã dành khoảng 3 giờ để hàn thứ này. Đó là khoảng 150 dây, vì vậy đó là 300 điểm hàn, cộng với các bộ phận cảm ứng cho cầu hàn. Dù sao, đây là mặt sau của bảng được hình ảnh….. Mất 20 phút suy nghĩ kể từ khi màn hình hiển thị số sai được hiển thị theo một mô hình logic mà tôi phải giải mã. Sau đó, tôi xác định vị trí của short, và bam! Nó hoạt động hoàn hảo.

Bước 5: Kết luận

Phần kết luận
Phần kết luận

NÓ ĐÃ HOẠT ĐỘNG! Dự án này mất khoảng; ~ 2 tuần để suy nghĩ và gửi email các điểm tốt cho người yêu cầu, ~ 3 giờ hoàn thành mã và gỡ lỗi, ~ 4 giờ breadboarding và gỡ lỗi, ~ 3 giờ hàn Chỉ cần sử dụng 3 IC là có thể Charlieplex 6 đèn LED 7 đoạn. Điện năng tiêu thụ ở mức khoảng 30mA với thiết kế này, điều này không tệ nếu bản thân tôi nói vậy. được áp dụng cho hầu hết BẤT KỲ ứng dụng nào sử dụng đèn LED 7 đoạn; nhiệt kế, đồng hồ, màn hình hiển thị văn bản, v.v. Với một số mã phức tạp, bạn có thể có một màn hình chuyển động, hoặc hình ảnh … thậm chí có thể là cơ sở cho một dự án POV (kiên trì tầm nhìn). và đặt bảng vào, khi anh ta thấy phù hợp. Nếu / Khi điều đó được thực hiện xong, tôi sẽ nhận được một bức ảnh được tải lên. Nhưng đối với mạch, điều này dường như được xây dựng để đặt hàng!

Đề xuất: