Paso 3: Diseño y código Micro
En primer lugar, he probado un solo LED de 7 segmentos mediante código inicial. Esto confirmó las 3 cosas;
1) cableado de la IC se verificó bien!
2) me ha llevado a optimizar y concretar mi código.
3) me hizo darme cuenta que no necesitaba las resistencias limitantes actuales!
1 cableado
Como se dijo, mi diseño esquemático se encontró con mi código, como el LED ciclo a través de números usando un interruptor pulsador, que verificado mi código y el diseño. No mucho era necesario pero diseño confirmó que estaba en buena forma.
2 código
Originalmente tenía mi código para buscar botones y la pantalla de la ISR (rutina de servicio de interrupción) los números, con una rutina principal. Después de pruebas de diseño, invirtió las rutinas, por lo que la mayoría del tiempo fue mostrando constantemente números y el ISR para los botones. La razón que hizo esto, era sólo para tener una visualización constante, desde el PIC se ejecuta con un reloj interno de 4Mhz, estoy perdiendo muy poco tiempo buscando botones. No es gran cosa... sólo depende de cómo quieres hacer el código y lo que tiene más sentido para cada aplicación. Para ello, pantalla es importante, por lo puse en la rutina principal.
Cuando mis primeras piezas llegaron (todas las 6 pantallas!), completó el cableado del tablero y otro tema. Al pulsar el botón de mi código tenía algunos registros descuidados que no se despejaron y el ISR estaba causando algunos problemillas de pantalla menor.
;===============================================================================
; Gire
;
; -----------
; 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
; -----------
;
; LED 1-3---> dec BCD IC---> LEDSeg's1-6
; Dsply1-3---> BCD-7seg IC---> Dsply #1-9
;
;===============================================================================
; Historia de revisión y notas:
; Cabecera inicial v1.0, código 30/03/09
;
;
; (C) 5 / 2009
; Este código puede usarse para aprendizaje/uso/modificación de personal.
; Cualquier uso de este código en productos comerciales viola esta versión freeware.
; Para preguntas o comentarios, póngase en contacto con el circuito punto mago arroba yahoo punto com.
;-------------------------------------------------------------------------------
#include P16F627A. INC
;===============================================================================
; Define
;-------------------------------------------------------------------------------
;===============================================================================
; Datos
;-------------------------------------------------------------------------------
; Variables de tiempo de mantenimiento
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
;===============================================================================
; Vectores de RESET
;
; COMPRUEBE LA CONFIGURACIÓN. PEDACITOS ANTES DE GRABAR!!!!!!
; INTOSC
; MCLR: HABILITADO
; PWRUP: HABILITADO
; TODOS LOS DEMÁS: DESACTIVAR!!!!
;
;-------------------------------------------------------------------------------
RESET_ADDR EQU 0 X 00
ISR_ADDR EQU 0 X 04
org RESET_ADDR
Goto Inicio
;===============================================================================
; ISR
;
;-------------------------------------------------------------------------------
org ISR_ADDR
movwf w_temp
swapf STATUS, w
movwf status_temp;
; ISR AQUÍ
; Comprobar interruptores PB0-PB5
btfsc PORTB, 0; Compruebe SW1
llamar al sw1debounce
btfsc PORTB, 1; Compruebe SW1
llamar al sw2debounce
btfsc PORTB, 2; Compruebe SW1
llamar al sw3debounce
btfsc PORTB, 3; Compruebe SW1
llamar al sw4debounce
btfsc PORTB, 4; Compruebe SW1
llamar al sw5debounce
btfsc PORTB, 5; Compruebe SW1
llamar al sw6debounce
Goto endisr
sw1debounce
debounce llamada; Esperar de 0,2 seg.
llamada debounce
incf dis1; Contador de actualización
movf dis1, W; Verificación de desbordamiento
xorlw 0x1A; ¿10 en el 7-seg?
btfss STATUS, Z
retorno; No, volver a escanear.
movlw h '10'; Sí, restablecer la pantalla.
movwf dis1
volver
sw2debounce
debounce llamada; Esperar de 0,2 seg.
llamada debounce
incf dis2; Contador de actualización
movf dis2, W; Verificación de desbordamiento
xorlw 0x4A; ¿10 en el 7-seg?
btfss STATUS, Z
retorno; No, volver a escanear.
movlw h '40'; Sí, restablecer la pantalla.
movwf dis2
volver
sw3debounce
debounce llamada; Esperar de 0,2 seg.
llamada debounce
incf dis3; Contador de actualización
movf dis3, W; Verificación de desbordamiento
xorlw 0x5A; ¿10 en el 7-seg?
btfss STATUS, Z
retorno; No, volver a escanear.
movlw h '50'; Sí, restablecer la pantalla.
movwf dis3
volver
sw4debounce
debounce llamada; Esperar de 0,2 seg.
llamada debounce
incf dis4; Contador de actualización
movf dis4, W; Verificación de desbordamiento
xorlw 0x8A; ¿10 en el 7-seg?
btfss STATUS, Z
retorno; No, volver a escanear.
movlw h '80'; Sí, restablecer la pantalla.
movwf dis4
volver
sw5debounce
debounce llamada; Esperar de 0,2 seg.
llamada debounce
incf dis5; Contador de actualización
movf dis5, W; Verificación de desbordamiento
xorlw 0x9A; ¿10 en el 7-seg?
btfss STATUS, Z
retorno; No, volver a escanear.
movlw h '90'; Sí, restablecer la pantalla.
movwf dis5
volver
sw6debounce
debounce llamada; Esperar de 0,2 seg.
llamada debounce
incf dis6; Contador de actualización
movf dis6, W; Verificación de desbordamiento
xorlw 0xCA; ¿10 en el 7-seg?
btfss STATUS, Z
retorno; No, volver a escanear.
movlw h 'C0'; Sí, restablecer la pantalla.
movwf dis6
volver
endisr
BCF INTCON, T0IF
swapf status_temp, w
movwf STATUS
swapf w_temp, f
swapf w_temp, w
retfie
;===============================================================================
; ¡ Comience aquí!
;-------------------------------------------------------------------------------
Inicio
; Puertos de la entrada-salida de config
clrf PORTA
movlw 0x07
movwf CMCON
BCF STATUS, RP1
bsf STATUS, RP0
movlw h '00'; RA < 0-7 > salidas, RA5 sin salida
movwf TRISA
BCF STATUS, RP0
clrf PORTB
bsf STATUS, RP0
movlw h'FF'; RB < 0-7 > entradas
movwf TRISB
; Sistema temporizador interno
BSF PCON, 3; Situado a 4Mhz.
movlw h'CF'; Fuente interna de Tmr0, prescale 1:256 TMR0
movwf OPTION_REG
movlw h 'A0'
movwf INTCON; Permitir interrupciones de TMR0,
BCF STATUS, RP0
; Inicializar los registros
clrf PORTA; PortA claro
clrf PORTB; Borrar PortB salidas
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
debounce llamada; 0,2 seg.
; LEDs de prueba, exhibición de 8???
;===============================================================================
; Principal
; Recibe entradas de interruptores, debounces y incriments de la muestra.
;
; Esto actualiza las pantallas, con TMR0 prescal 1:4, en una frecuencia de 1Khz.
Pantalla 0 se utiliza para asignar a un despliegue inusitado. Visualización 1-6 están conectados.
; En primer lugar, BCD-7Seg IC está cargado de valor indicado, y IC Dec BCD se activa para
; Mostrar selección.
; En segundo lugar, un retraso de ms se lleva a cabo para la exhibición.
; En tercer lugar, Dec BCD IC se desactiva... display0 es seleccionado para cerrar la pantalla
;
; Esto es repetido para cada una de las 6 pantallas y bucle.
ISR maneja interruptor de detección a 15Hz de velocidad.
;-------------------------------------------------------------------------------
principal
Disp1
movf dis1, 0
movwf PORTA
Llame a ledon
Goto principal
;===============================================================================
; LEDOn
; Tiempo para la energía LED de adaptación en.
; 6 muestra -> ciclo de trabajo de 1/6 a 1 Khz = 166 ciclos
;-------------------------------------------------------------------------------
LEDOn
movlw 54
movwf count1
ledloop
decfsz count1, F
Goto ledloop
volver
;===============================================================================
; Debounce señal
; 4 ciclos de carga y llamar, 2 ciclos para volver.
; 4 Tc Mhz:: count2 = 255 -> 0,2 seg.
;-------------------------------------------------------------------------------
Debounce
movlw.255; Retardo de 1/5 de segundo debounce.
movwf count2
llamar al pon_wait
volver
;-------------------------------------------------------------------------------
; count1 = d:: 775 255 ciclos ciclos 0, + 3 para volver.
;-------------------------------------------------------------------------------
pon_wait
big_loopS
movlw.255
movwf count1
short_loopS
decfsz count1, F
Goto short_loopS
decfsz count2, F
Goto big_loopS
volver
final
3 circuito
Originalmente tenía resistencias de 470 Ohm de cada línea del controlador de pantalla del 74LS47 y CD4028 Habilitar línea. Sin embargo, he probado de corriente de mi circuito y encontró sólo era tirar ~ 31mA. Y puesto que el controlador actual para la muestra es directamente el 74LS47 y habilitar otro IC, un rápido funcionamiento de la media y requisitos del pico y las respectivas hojas de datos... Me arrancaron las resistencias de la placa y encontró una diferencia de 1mA. Parece ser que conducir directamente la línea de CA de la 4028 mientras se conduce directamente todos los segmentos es OK! .. .sort de. :)
Tengo un error en mi código que despejar mis registros cuando se pulsa un botón, haciendo que la última pantalla que 2 tramos muy brillantemente iluminado cuando presionó un botón. Esto era malo. Sin embargo, limpiar el registro había corregido este problema y controles de potencia continua confirman es constantemente alrededor de 30mA sorteo. Esto debería darme (basado en la experiencia previa con circuitos similares) ~ 20 horas de duración con 1 pila de 9V (500mAH/30mAH bajo regulación de 5V)... ¡Eso espero!
Decidí mantener el LED directamente conducido, pero ponerlos en tomas de corriente en caso de que algo sucedió, a largo plazo.