You are on page 1of 5

Contador de 4 dgitos PIC 16F84A

Quizs una de las aplicaciones ms usual para un micro controlador sea la elaboracin de un contador de turnos o de personas atendidas. En este caso decidimos disear un circuito que requiera la menor cantidad posible de componentes y que cumpla con las prestaciones tpicas de estas aplicaciones.

Como se ve en el diagrama el circuito est estructurado alrededor del PICmicro el cual en su interior lleva la cuenta de las pulsaciones sobre el pulsador 'I' y, a su vez, genera los dgitos a ser mostrados sobre los displays de 7 segmentos de LED's. Para reducir la cantidad de circuitos integrados a slo uno hemos optado por generar los dgitos por soft dentro del mismo micro, evitando as tener que recurrir a decodificadores de BCD, que si bien no representan costo alguno para adquirirlos, el hecho de colocarlos en el circuito impreso implica mayor tamao, mayor cantidad de pistas y perforaciones. El funcionamiento es por dems simple. Los cuatro dgitos del display se encuentran en paralelo. Esto significa que el segmento A del primero est cableado junto con el del segundo, el tercero y el cuarto. Y lo mismo sucede con los dems segmentos. Para que no se encienda sobre los cuatro dgitos el mismo nmero se multiplexa el encendido por medio de los cuatro transistores. Para que el display se ilumine no solo tiene que haber un uno lgico en el segmento a encender, sino que tambin se requiere que el transistor este en conduccin para lograr la masa. De esta forma, conmutando los transistores secuencialmente y a

velocidad suficiente se logra hacer parecer al ojo humano que los cuatro displays estn iluminados simultneamente, cuando en realidad slo uno se ilumina por vez. Por ejemplo, para hacer aparecer en los displays la secuencia 1 2 3 4 habra que hacer la siguiente rutina: 1. 2. 3. 4. 5. 6. 7. 8. 9. Generar el dgito 1 Encender el primer display Generar el dgito 2 Encender el segundo display Generar el dgito 3 Encender el tercer display Generar el dgito 4 Encender el cuarto display Repetir la secuencia a velocidad suficiente.

Esto es el concepto bsico. Para entender mejor el sistema ser necesario consultar el archivo en assembler que contiene el cdigo fuente del programa a cargar en el micro, que lo puede obtener del link de mas abajo. Para evitar que la velocidad del micro haga avanzar el conteo a mas de una unidad por pulsacin se ha implementado un retardo de 100mS luego de la pulsacin del interruptor marcado como 'I'. Si se quiere hacer avanzar el conteo hasta una posicin no es necesario presionar y soltar el pulsador repetitivamente, bastar con mantenerlo presionado y el conteo avanzar rpidamente. Para volver la cuenta a cero basta con resetear el micro, presionando la tecla marcada como 'R'. Si bien nosotros empleamos un cristal de 4MHz para el generador de reloj, tambin se puede emplear una red RC, porque en este proyecto no se requiere gran precisin de clock. Los transistores pueden ser reemplazados sin problema por cualquiera de uso general como el BC548 o similar. Los displays utilizados son de LED's con ctodo comn. Se pueden emplear displays pequeos y medianos sin problema. Para el uso de displays grandes deber emplear algn driver de corriente como el ULN2803A o similar. La alimentacin puede ser tanto 5 como 6 voltios. No se requiere que est estabilizada y se puede emplear un adaptador universal, siempre que sea de calidad aceptable. La corriente requerida es de 300mA.

CODIGO FUENTE ASSEMBLER


;Contador de 4 digitos. indo pc status fsr ptoa ptob rota trisa trisb dig1 dig2 dig3 dig4 loops loops2 z ram c w reset equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ org goto org movwf movlw movwf nop nop nop nop nop nop decfsz goto decfsz goto retlw clrf incf movf xorlw btfsc clrf return s100 clrf incf movf xorlw dig3 dig2 dig2, w 0ah 00h 02h 03h 04h 05h 06h 0fh 85h 86h 10h 11h 12h 13h 1dh 1eh 02h 05h 00h 00h 00 inicio 05h loops d'110' loops2 ;subrutina de retardo ;la variable de trabajo contiene la cant. ;de ms a demorar ;registro de indireccion ;contador de programa ;registro de estado ;registro de seleccion ;puerto a ;puerto b ;variable para desplazamiento de display ;configuracion puerto a ;configuracion puerto b ;acumulador miles ;acumulador centenas ;acumulador decenas ;acumulador unidades ;variables usadas en retardos ;flag de cero ;bit de seleccion de pagina de memoria ;flag de acarreo ;bit de destino a variable de trabajo

retardo top2 top

loops2 top loops top2 0 dig2 dig1 dig1, w 0ah status, z dig1

;controla si termina 1mS ;controla si termina el retardo completo

s1000

;rutina de incremento x 1000 ;pone a cero las centenas ;incrementa el contador de miles ;carga en work el conteo de los miles ;si work era 10, entonces quedara en cero ;si es cero, el flag z queda alto ;inicializa los miles ;rutina de incremento x 100 ;pone a cero las decenas ;incrementa el contador de centenas ;carga en work el conteo de las centenas ;si work era 10, entonces quedara en cero

btfsc call return s10 clrf incf movf xorlw btfsc call return subir incf movf xorlw btfsc call movlw call return tabla addwf work retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw inicio bsf movlw movwf movlw movwf bcf clrf clrf clrf clrf movlw apagar movwf empe btfss call movlw movwf movlw

status, z s1000

;si es cero, el flag z queda alto ;incrementa los miles ;rutina de incremento x 10 ;pone a cero las unidades ;incrementa el contador de decenas ;carga en work el conteo de las decenas ;si work era 10, entonces quedara en cero ;si es cero, el flag z queda alto ;incrementa las centenas ;rutina de incremento ;incrementa el contador de unidades ;carga en work el conteo de las unidades ;si work era 10, entonces quedara en cero ;si es cero, el flag z queda alto ;incrementa las decenas ;retardo de 100ms

dig4 dig3 dig3, w 0ah status, z s100

dig4 dig4, w 0ah status, z s10 d'250' retardo

pc b'00111111' b'00011000' b'01110110' b'01111100' b'01011001' b'01101101' b'01101111' b'00111000' b'01111111' b'01111101' status, ram b'00010000' trisa 00h trisb status, ram dig1 dig2 dig3 dig4 00 ptoa ptoa, 4 subir 08h rota dig1

;genera los numeros sobre el display ;agrega al cont. programa el valor de ;genera ;genera ;genera ;genera ;genera ;genera ;genera ;genera ;genera ;genera el el el el el el el el el el 0 1 2 3 4 5 6 7 8 9

;programa principal ;selecciona el banco de memoria alto ;configura el puerto a ;bit 4 entrada, demas bits salidas. ;configura el puerto b ;como salidas ;selecciona el banco de memoria bajo ;inicializa acumuladores

;envia ceros a los transistores para ;todos los displays ;chequea el pulsador ;llama la rutina de incremento ;iniciar un 1 en el registro de rotacion ;con el registro selector (fsr) se apunta

disp

movwf movlw movwf movf movwf movf

fsr 00h ptob rota, w ptoa indo, w tabla ptob 03h retardo rota, 0 empe status, c rota fsr disp

;al primer dato que se va a mostrar ;colocar en cero el dato del display ;para apagarlos ;pasa rotacion del 1 a la variable work ;enciende el transistor (display) ;lee el dato del registro apuntado por ;genera el digito de 7 segmentos ;envia el digito al puerto b ;retardo de 3ms para visualizacion ;controla si terminaron las cuatro ;si termino, vuelve desde el comienzo ;carry en cero para no afectar las ;desplaza el 1 que enciende los displays ;incrementa el puntero. Apunta el proximo ;digito a mostrar

fsr call movwf movlw call btfsc rotaciones goto bcf rotaciones rrf incf goto end

HEXADECIMAL

:020000003B289B :06000A009D006E309E0017 :100010000000000000000000000000009E0B082807 :100020009D0B062800349101900A10080A3A031922 :10003000900108009201910A11080A3A031913204D :1000400008009301920A12080A3A03191A200800BC :10005000930A13080A3A03192120FA3005200800F0 :1000600082073F34183476347C3459346D346F341D :1000700038347F347D34831610308500003086009C :100080008312900191019201930100308500051EB9 :10009000282008308F0010308400003086000F08C0 :1000A0008500000830208600033005200F184728FF :0800B00003108F0C840A4D2897 :00000001FF