BloodBowl vända Counter använder 7-segment LED (3 / 5 steg)
Steg 3: Breadboarding & Micro kod
Först testade jag en enda 7-segment LED med hjälp av ursprungliga koden. Detta bekräftade 3 saker;
1) ledningar av IC-talet kontrollerades bra!
2) fick mig att optimera och slutföra min kod.
3) fick mig att inse att jag inte behövde de strömbegränsande motstånd!
1 ledningar
Som sagt, visade min schematiska design sig fungera med min kod, som LED skulle gå igenom tal med hjälp av en tryckknapp switch, så att verifierat min kod och layout. Inte mycket krävdes men breadboarding bekräftade jag var i god form.
2 kod
Ursprungligen hade jag min kod som ställts in med en huvudsaklig rutin att skanna för knappar och ISR (Interrupt rutin) displayen siffrorna. Efter breadboarding tester, ändrat jag rutiner, så majoriteten av tiden var ständigt visar siffror och ISR till check för knappar. Anledningen till att jag gjorde detta, var bara att ha en konstant display, sedan PIC körs med en intern 4Mhz klocka, jag förlorar mycket lite tid avsökningen för knappar. Ingen big deal... bara beror på hur du vill göra koden och vad är mest meningsfullt för varje program. För detta är displayen viktigt, så jag satte det i den huvudsakliga rutinen.
När min första delarna anlände (alla 6 skärmar!), jag avslutade bakbord ledningarna och fann en annan fråga. När man trycker på knappen min kod hade några slarviga journaler som inte rensades och ISR orsakade några mindre display buggar.
;===============================================================================
; Aktivera Counter
;
; -----------
; Dsply3 <---A2 |1 18| A1---> Dsply2
; Dsply4 <---A3 |2 17| A0---> Dsply1
; Led1 <---A4 |3 16| A7---> Led3
; A5 |4 15| A6---> Led2
; VSS |5 14| Vdd
; Knapp1--> 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---> vsning #1-9
;
;===============================================================================
; Revisionen historia & anteckningar:
; V1.0 första Header, kod 3/30/09
;
;
(C) 5 / 2009
; Denna kod kan användas för personliga lärande/programmodifieringar.
; All användning av denna kod i kommersiella produkter bryter mot denna freeware version.
; För frågor och kommentarer, kontakta krets dot mage på yahoo dot com.
;-------------------------------------------------------------------------------
#include P16F627A. INC
;===============================================================================
; Definierar
;-------------------------------------------------------------------------------
;===============================================================================
; Data
;-------------------------------------------------------------------------------
; Tid hålla variabler
count1 equ 20
count2 equ 21
dis1 equ 22
dis2 equ 23
dis3 equ 24
dis4 equ 25
dis5 equ 26
dis6 equ 27
w_temp equ 28
status_temp equ 29
ISRCNTR equ 2A
;===============================================================================
; Återställa vektorer
;
; KOLLA CONFIG. BITAR INNAN DU BRÄNNER!!!
; INTOSC
; MCLR: AKTIVERAD
; PWRUP: AKTIVERAD
; ALLA ANDRA: INAKTIVERA!
;
;-------------------------------------------------------------------------------
RESET_ADDR EQU 0X00
ISR_ADDR EQU 0X04
org RESET_ADDR
gå till start
;===============================================================================
; ISR
;
;-------------------------------------------------------------------------------
org ISR_ADDR
movwf w_temp
swapf STATUS, w
movwf status_temp;
; ISR HÄR
; Kolla PB0-PB5 växlar
btfsc PORTB, 0; Kolla SW1
kalla sw1debounce
btfsc PORTB, 1. Kolla SW1
kalla sw2debounce
btfsc PORTB, 2. Kolla SW1
kalla sw3debounce
btfsc PORTB, 3. Kolla SW1
kalla sw4debounce
btfsc PORTB, 4. Kolla SW1
kalla sw5debounce
btfsc PORTB, 5. Kolla SW1
kalla sw6debounce
gå till endisr
sw1debounce
Ring debounce; Vänta 0.2 sek
Ring debounce
INCF dis1; Uppdatera counter
movf dis1, W; Check för overflow
xorlw 0x1A; 10 på 7-seg?
btfss STATUS, Z
hemkomst. Nej, tillbaka för att skanna.
movlw h '10'; Ja, återställa displayen.
movwf dis1
returnera
sw2debounce
Ring debounce; Vänta 0.2 sek
Ring debounce
INCF dis2; Uppdatera counter
movf dis2, W; Check för overflow
xorlw 0x4A; 10 på 7-seg?
btfss STATUS, Z
hemkomst. Nej, tillbaka för att skanna.
movlw h "40"; Ja, återställa displayen.
movwf dis2
returnera
sw3debounce
Ring debounce; Vänta 0.2 sek
Ring debounce
INCF dis3; Uppdatera counter
movf dis3, W; Check för overflow
xorlw 0x5A; 10 på 7-seg?
btfss STATUS, Z
hemkomst. Nej, tillbaka för att skanna.
movlw h "50"; Ja, återställa displayen.
movwf dis3
returnera
sw4debounce
Ring debounce; Vänta 0.2 sek
Ring debounce
INCF dis4; Uppdatera counter
movf dis4, W; Check för overflow
xorlw 0x8A; 10 på 7-seg?
btfss STATUS, Z
hemkomst. Nej, tillbaka för att skanna.
movlw h '80'. Ja, återställa displayen.
movwf dis4
returnera
sw5debounce
Ring debounce; Vänta 0.2 sek
Ring debounce
INCF dis5; Uppdatera counter
movf dis5, W; Check för overflow
xorlw 0x9A; 10 på 7-seg?
btfss STATUS, Z
hemkomst. Nej, tillbaka för att skanna.
movlw h "90". Ja, återställa displayen.
movwf dis5
returnera
sw6debounce
Ring debounce; Vänta 0.2 sek
Ring debounce
INCF dis6; Uppdatera counter
movf dis6, W; Check för overflow
xorlw 0xCA; 10 på 7-seg?
btfss STATUS, Z
hemkomst. Nej, tillbaka för att skanna.
movlw h 'C0'; Ja, återställa displayen.
movwf dis6
returnera
endisr
BCF INTCON, T0IF
swapf status_temp, w
movwf STATUS
swapf w_temp, f
swapf w_temp, w
retfie
;===============================================================================
; Börja här!
;-------------------------------------------------------------------------------
Start
; Config/o-portar
clrf PORTA
movlw 0x07
movwf CMCON
BCF STATUS, RP1
BSF STATUS, RP0
movlw h '00'; RA < 0-7 > utgångar, RA5 nr utgång
movwf TRISA
BCF STATUS, RP0
clrf PORTB
BSF STATUS, RP0
movlw h'FF'; RB < 0-7 > ingångar
movwf TRISB
; Ställ in inre timer
BSF PCON, 3. Inställd på 4Mhz.
movlw h'CF'; Tmr0 inre källa, prescale TMR0 1:256
movwf OPTION_REG
movlw h "A0"
movwf INTCON; Aktivera TMR0 avbrott,
BCF STATUS, RP0
; Initiera register
clrf PORTA; Tydlig PortA
clrf PORTB; Tydlig PortB utgångar
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
Ring debounce; 0.2 sek
; testa lysdioder, Visa 8???
;===============================================================================
; Main
; Får ingångar från växlar, debounces och incriments skärmar.
;
; Detta uppdaterar skärmar, med TMR0 prescal 1:4, med en 1Khz.
Displayen 0 används för att allokera en oanvänd skärm. Display 1-6 är anslutna.
; Först BCD-7Seg IC är laddad med visningsvärde och BCD-Dec IC är aktiverad för
Visa urval.
; För det andra, hålls en fördröjning av ms för visning.
; För det tredje BCD-Dec IC är inaktiverad... display0 är valt att stänga av displayen
;
; Detta upprepas för varje 6 bildskärmar, och loopas.
ISR hanterar switch avkänning i 15Hz takt.
;-------------------------------------------------------------------------------
huvudsakliga
Disp1
movf dis1, 0
movwf PORTA
Ring ledon
gå till största
;===============================================================================
; Ledon
; Landa tid för LED driver på.
; 6 visar -> 1/6 intermittens vid 1 Khz = 166 cykler
;-------------------------------------------------------------------------------
ledon
movlw.54
movwf count1
ledloop
decfsz count1, F
gå till ledloop
returnera
;===============================================================================
; Debounce signal
; 4 cykler att ladda och ring, 2 cykler för att återvända.
; 4 Mhz Tc:: count2 = 255 -> 0.2 sek
;-------------------------------------------------------------------------------
Debounce
movlw 255; Fördröjning för 1/5 sekund Dämpningstid.
movwf count2
kalla pon_wait
returnera
;-------------------------------------------------------------------------------
; count1 = 255 d:: 775 cykler 0 + 3 cykler att återvända.
;-------------------------------------------------------------------------------
pon_wait
big_loopS
movlw 255
movwf count1
short_loopS
decfsz count1, F
gå till short_loopS
decfsz count2, F
gå till big_loopS
returnera
slutet
3 krets
Jag hade ursprungligen 470 Ohm motstånd från varje display driver från 74LS47 och CD4028 aktiverar linje. Men jag testade min krets strömförbrukning och fann det bara drog ~ 31mA. Och eftersom de faktiska drivrutinen för bildskärmar är direkt från 74LS47 och aktivera är från en annan IC, en snabb avställning av genomsnittet och peak krav och de respektive datablad... Jag drog motstånd av bakbord och hittade en 1mA skillnad! Det visar sig att direkt köra CA linjen från 4028 medan direkt köra alla segment är OK! .. .sort av. :)
Jag hade ett tekniskt fel i min kod som inte klart min register när en knapp trycktes, orsakar den senaste displayen att ha 2 segment mycket ljust lyser när en knapp trycktes. Detta var dåligt. Men rensa registret fast problemet och kontinuerlig effekt kontroller bekräfta det är ständigt runt 30mA draw. Detta bör ge mig (baserat på tidigare erfarenheter med liknande kretsar) ~ 20 timmar med körning med 1 9V batteri (500mAH/30mAH enligt 5V förordning)... Jag hoppas!
Jag bestämde mig att hålla lysdioder direkt driven, men Lägg dem i uttag ifall något hände, på lång sikt.