Stap 3: Breadboarding & Micro Code
Ik testte eerst één enkele 7-segment LED met behulp van oorspronkelijke code. Dit bevestigd 3 dingen;
1) bedrading van de IC's werd goed gecontroleerd!
2) leidde me om te optimaliseren en het voltooien van mijn code.
3) deed me beseffen dat ik niet de huidige beperkende weerstanden hoefde!
1 bedrading
Zoals vermeld, bleek mijn schematische ontwerp om te werken met mijn code, zoals de LED getallen met een drukschakelaar, doorlopen zou zodat gecontroleerd mijn code en de lay-out. Niet veel nodig was maar breadboarding bevestigd was ik in goede vorm.
2 CODE
Oorspronkelijk had ik mijn code ingesteld met een belangrijkste routine om te scannen voor knoppen en het display van de ISR (Interrupt Service Routine) de getallen. Na breadboarding proeven, omgekeerd ik de routines, zodat het merendeel van de tijd voortdurend van getallen de ISR weergeven werd om knoppen te controleren. De reden waarom ik deed dit, was gewoon om een constante vertoning, aangezien de PIC wordt uitgevoerd met een interne klok van 4Mhz, ik ben het verliezen van heel weinig tijd scannen voor knoppen. Geen big deal... hangt enkel hoe u wilt doen van de code en wat is het meest zinvol voor elke toepassing. Voor dit is display belangrijk, dus heb ik die in de belangrijkste routine.
Toen mijn eerste onderdelen aangekomen (alle 6 displays!), ik voltooide het breadboard bedrading en vond een andere kwestie. Wanneer de knop duwen mijn code had sommige slordig registers die werden niet geruimd en de ISR werd veroorzaakt sommige kleine display glitches.
;===============================================================================
; Zet de teller
;
; -----------
; 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
; Button1--> 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---> Dsply #1-9
;
;===============================================================================
; Revisiegeschiedenis & nota's:
; V1.0 de oorspronkelijke Header, Code 3/30/09
;
;
; (C) 5 / 2009
; Deze code kan worden gebruikt voor persoonlijke leren / / wijzigingen in de toepassing.
; Elk gebruik van deze code in commerciële producten in strijd is met deze versie van de freeware.
; Voor vragen/opmerkingen, circuit dot mage op yahoo dot com te contacteren.
;-------------------------------------------------------------------------------
#include P16F627A. INC
;===============================================================================
; Definieert
;-------------------------------------------------------------------------------
;===============================================================================
; Gegevens
;-------------------------------------------------------------------------------
; Tijd bijhouden variabelen
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
;===============================================================================
; Reset vectoren
;
; SELECTIEVAKJE CONFIG. BITS VOORDAT HET BRANDEN!
; INTOSC
; PICSSOFTWARE: INGESCHAKELD
; PWRUP: INGESCHAKELD
; ALLE ANDEREN: UITSCHAKELEN!!
;
;-------------------------------------------------------------------------------
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;
; ISR HIER
; PB0-PB5 Switches controleren
btfsc PORTB, 0; Selectievakje SW1
oproep sw1debounce
btfsc PORTB, 1; Selectievakje SW1
oproep sw2debounce
btfsc PORTB, 2; Selectievakje SW1
oproep sw3debounce
btfsc PORTB, 3; Selectievakje SW1
oproep sw4debounce
btfsc PORTB, 4; Selectievakje SW1
oproep sw5debounce
btfsc PORTB, 5; Selectievakje SW1
oproep sw6debounce
goto endisr
sw1debounce
oproep ontdendering; 0.2 sec wachten
oproep ontdendering
INCF dis1; Update teller
movf dis1, W; Selectievakje voor overloop
xorlw 0x1A; 10 op 7-seg?
btfss STATUS, Z
terugkeer; Nee, terug naar de scannen.
movlw h '10'; Ja, opnieuw weergegeven.
movwf dis1
terugkeer
sw2debounce
oproep ontdendering; 0.2 sec wachten
oproep ontdendering
INCF dis2; Update teller
movf dis2, W; Selectievakje voor overloop
xorlw 0x4A; 10 op 7-seg?
btfss STATUS, Z
terugkeer; Nee, terug naar de scannen.
movlw h '40'; Ja, opnieuw weergegeven.
movwf dis2
terugkeer
sw3debounce
oproep ontdendering; 0.2 sec wachten
oproep ontdendering
INCF dis3; Update teller
movf dis3, W; Selectievakje voor overloop
xorlw 0x5A; 10 op 7-seg?
btfss STATUS, Z
terugkeer; Nee, terug naar de scannen.
movlw h '50'; Ja, opnieuw weergegeven.
movwf dis3
terugkeer
sw4debounce
oproep ontdendering; 0.2 sec wachten
oproep ontdendering
INCF dis4; Update teller
movf dis4, W; Selectievakje voor overloop
xorlw 0x8A; 10 op 7-seg?
btfss STATUS, Z
terugkeer; Nee, terug naar de scannen.
movlw h '80'; Ja, opnieuw weergegeven.
movwf dis4
terugkeer
sw5debounce
oproep ontdendering; 0.2 sec wachten
oproep ontdendering
INCF dis5; Update teller
movf dis5, W; Selectievakje voor overloop
xorlw 0x9A; 10 op 7-seg?
btfss STATUS, Z
terugkeer; Nee, terug naar de scannen.
movlw h '90'; Ja, opnieuw weergegeven.
movwf dis5
terugkeer
sw6debounce
oproep ontdendering; 0.2 sec wachten
oproep ontdendering
INCF dis6; Update teller
movf dis6, W; Selectievakje voor overloop
xorlw 0xCA; 10 op 7-seg?
btfss STATUS, Z
terugkeer; Nee, terug naar de scannen.
movlw h 'C0'; Ja, opnieuw weergegeven.
movwf dis6
terugkeer
endisr
BCF INTCON, T0IF
swapf status_temp, w
movwf STATUS
swapf w_temp, f
swapf w_temp, w
retfie
;===============================================================================
; Start hier!
;-------------------------------------------------------------------------------
Start
; Config i/o-poorten
clrf PORTA
movlw 0x07
movwf CMCON
BCF STATUS, RP1
BSF STATUS, RP0
movlw h '00'; RA < 0-7 > uitgangen, RA5 geen uitgang
movwf TRISA
BCF STATUS, RP0
clrf PORTB
BSF STATUS, RP0
movlw h'FF'; RB < 0-7 > ingangen
movwf TRISB
; Instellen interne timer
BSF PCON, 3; Ingesteld op 4Mhz.
movlw h'CF'; Tmr0 interne bron, prescale TMR0 1:256
movwf OPTION_REG
movlw h 'A0'
movwf INTCON; TMR0 interrupts, inschakelen
BCF STATUS, RP0
; Initialiseren van de Registers
clrf PORTA; Duidelijke PortA
clrf PORTB; Duidelijk PortB uitgangen
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
oproep ontdendering; 0.2 sec
; testen LEDs, 8 weer???
;===============================================================================
; Main
; Krijgt ingangen van wissels, debounces en incriments displays.
;
; Dit werkt bij de beeldschermen, met TMR0 prescal 1:4, met een snelheid van 1Khz.
Display 0 wordt gebruikt voor het toewijzen aan een ongebruikte display. Weergeven 1-6 zijn aangesloten.
; Eerst, BCD-7Seg IC is geladen met de weergavewaarde, en BCD-Dec IC is geactiveerd voor
; selectie weergeven.
; Ten tweede, een vertraging van ms wordt gehouden voor weergave.
; Ten derde, BCD-Dec IC is gedeactiveerd... display0 is geselecteerd voor dicht vandoor weergeven
;
; Dit wordt herhaald voor elk van de 6 displays, en een lus.
ISR behandelt schakelaar sensing 15Hz tempo.
;-------------------------------------------------------------------------------
belangrijkste
Disp1
movf dis1, 0
movwf PORTA
oproep ledon
goto belangrijkste
;===============================================================================
; Ledon
; Tijd voor LED power afwikkeling op.
; 6 displays -> 1/6 taakcyclus op 1 Khz = 166 cycles
;-------------------------------------------------------------------------------
ledon
movlw.54
movwf count1
ledloop
decfsz count1, F
goto ledloop
terugkeer
;===============================================================================
; Ontdendering signaal
; 4 cycli te laden en te roepen, 2 cycli om terug te keren.
; 4 Mhz Tc:: count2 = 255 -> 0.2 sec
;-------------------------------------------------------------------------------
ontdendering
movlw.255; De wachttijd voor 1/5 seconden debounce.
movwf count2
oproep pon_wait
terugkeer
;-------------------------------------------------------------------------------
; count1 = 255 d:: 775 cycli aan 0, + 3 cycli om terug te keren.
;-------------------------------------------------------------------------------
pon_wait
big_loopS
movlw.255
movwf count1
short_loopS
decfsz count1, F
goto short_loopS
decfsz count2, F
goto big_loopS
terugkeer
einde
3 CIRCUIT
Ik had oorspronkelijk 470 Ohm weerstanden van elke lijn van de bestuurder van het display van de 74LS47 en CD4028 u regel. Echter ik getest van mijn circuit huidige trekken en het was alleen trekken ~ 31mA. En aangezien de feitelijke bestuurder voor de displays rechtstreeks van de 74LS47 is en inschakelen van een andere IC, een snelle omlaag lopen van het gemiddelde en piek eisen, en de respectieve gegevensbladen... Ik trok de weerstanden uit het breadboard en vond een 1mA verschil! Blijkt dat direct rijden de CA-lijn van de 4028 terwijl direct het besturen van alle segmenten OK is! .. .sort van. :)
Ik heb een glitch in mijn code die deed mijn registers niet duidelijk wanneer een knop is ingedrukt, waardoor de laatste weergave hebben 2 segmenten zeer fel verlicht wanneer een knop is ingedrukt. Dit was slecht. Echter dit probleem opruimen van het register vast, en continu vermogen controles bevestigen dat het is voortdurend rond 30mA trekken. Zulks moeten verlenen mij (gebaseerd op eerdere ervaringen met soortgelijke circuits) ~ 20 uren van gebruikstijd met 1 9V batterij (500mAH/30mAH onder 5V verordening)... Ik hoop!
Ik besloot om te houden van de LED's direct gedreven, maar zet ze in sockets in het geval dat iets gebeurd, lange termijn.