Quizás una de las aplicaciones mas usual para un micro controlador sea la elaboración de un contador de turnos o de personas atendidas. En este caso decidimos diseñar un circuito que requiera la menor cantidad posible de componentes y que cumpla con las prestaciones típicas 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 dígitos a ser mostrados sobre los displays de 7 segmentos de LED's. Para reducir la cantidad de circuitos integrados a sólo uno hemos optado por generar los dígitos 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 tamaño, mayor cantidad de pistas y perforaciones. El funcionamiento es por demás simple. Los cuatro dígitos 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 demás segmentos. Para que no se encienda sobre los cuatro dígitos el mismo número se multiplexa el encendido por medio de los cuatro transistores. Para que el display se ilumine no solo tiene que haber un uno lógico en el segmento a encender, sino que también se requiere que el transistor este en conducción 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 están iluminados simultáneamente, cuando en realidad sólo uno se ilumina por vez. Por ejemplo, para hacer aparecer en los displays la secuencia 1 2 3 4 habría que hacer la siguiente rutina: Generar el dígito 1 Encender el primer display Generar el dígito 2 Encender el segundo display Generar el dígito 3 Encender el tercer display Generar el dígito 4 Encender el cuarto display Repetir la secuencia a velocidad suficiente. Esto es el concepto básico. Para entender mejor el sistema será necesario consultar el archivo en assembler que contiene el código 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 pulsación se ha implementado un retardo de 100mS luego de la pulsación del interruptor marcado como 'I'. Si se quiere hacer avanzar el conteo hasta una posición no es necesario presionar y soltar el pulsador repetitivamente, bastará con mantenerlo presionado y el conteo avanzará rápidamente. 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, también se puede emplear una red RC, porque en este proyecto no se requiere gran precisión 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 cátodo común. Se pueden emplear displays pequeños y medianos sin problema. Para el uso de displays grandes deberá emplear algún driver de corriente como el ULN2803A o similar. La alimentación 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. codido assembler: ;Contador de 4 digitos. indo equ 00h ;registro de indireccion pc equ 02h ;contador de programa status equ 03h ;registro de estado fsr equ 04h ;registro de seleccion ptoa equ 05h ;puerto a ptob equ 06h ;puerto b rota equ 0fh ;variable para desplazamiento de display trisa equ 85h ;configuracion puerto a trisb equ 86h ;configuracion puerto b dig1 equ 10h ;acumulador miles dig2 equ 11h ;acumulador centenas dig3 equ 12h ;acumulador decenas dig4 equ 13h ;acumulador unidades loops equ 1dh ;variables usadas en retardos loops2 equ 1eh z equ 02h ;flag de cero ram equ 05h ;bit de seleccion de pagina de memoria c equ 00h ;flag de acarreo w equ 00h ;bit de destino a variable de trabajo reset org 00 goto inicio org 05h retardo ;subrutina de retardo movwf loops ;la variable de trabajo contiene la cant. top2 movlw d'110' ;de ms a demorar movwf loops2 top nop nop nop nop nop nop decfsz loops2 ;controla si termina 1mS goto top decfsz loops ;controla si termina el retardo completo goto top2 retlw 0 s1000 ;rutina de incremento x 1000 clrf dig2 ;pone a cero las centenas incf dig1 ;incrementa el contador de miles movf dig1, w ;carga en work el conteo de los miles xorlw 0ah ;si work era 10, entonces quedara en cero btfsc status, z ;si es cero, el flag z queda alto clrf dig1 ;inicializa los miles return s100 ;rutina de incremento x 100 clrf dig3 ;pone a cero las decenas incf dig2 ;incrementa el contador de centenas movf dig2, w ;carga en work el conteo de las centenas xorlw 0ah ;si work era 10, entonces quedara en cero btfsc status, z ;si es cero, el flag z queda alto call s1000 ;incrementa los miles return s10 ;rutina de incremento x 10 clrf dig4 ;pone a cero las unidades incf dig3 ;incrementa el contador de decenas movf dig3, w ;carga en work el conteo de las decenas xorlw 0ah ;si work era 10, entonces quedara en cero btfsc status, z ;si es cero, el flag z queda alto call s100 ;incrementa las centenas return subir ;rutina de incremento incf dig4 ;incrementa el contador de unidades movf dig4, w ;carga en work el conteo de las unidades xorlw 0ah ;si work era 10, entonces quedara en cero btfsc status, z ;si es cero, el flag z queda alto call s10 ;incrementa las decenas movlw d'250' ;retardo de 100ms call retardo return tabla ;genera los numeros sobre el display addwf pc ;agrega al cont. programa el valor de work retlw b'00111111' ;genera el 0 retlw b'00011000' ;genera el 1 retlw b'01110110' ;genera el 2 retlw b'01111100' ;genera el 3 retlw b'01011001' ;genera el 4 retlw b'01101101' ;genera el 5 retlw b'01101111' ;genera el 6 retlw b'00111000' ;genera el 7 retlw b'01111111' ;genera el 8 retlw b'01111101' ;genera el 9 inicio ;programa principal bsf status, ram ;selecciona el banco de memoria alto movlw b'00010000' ;configura el puerto a movwf trisa ;bit 4 entrada, demas bits salidas. movlw 00h ;configura el puerto b movwf trisb ;como salidas bcf status, ram ;selecciona el banco de memoria bajo clrf dig1 ;inicializa acumuladores clrf dig2 clrf dig3 clrf dig4 movlw 00 ;envia ceros a los transistores para apagar movwf ptoa ;todos los displays empe btfss ptoa, 4 ;chequea el pulsador call subir ;llama la rutina de incremento movlw 08h ;iniciar un 1 en el registro de rotacion movwf rota movlw dig1 ;con el registro selector (fsr) se apunta movwf fsr ;al primer dato que se va a mostrar disp movlw 00h ;colocar en cero el dato del display movwf ptob ;para apagarlos movf rota, w ;pasa rotacion del 1 a la variable work movwf ptoa ;enciende el transistor (display) movf indo, w ;lee el dato del registro apuntado por fsr call tabla ;genera el digito de 7 segmentos movwf ptob ;envia el digito al puerto b movlw 03h ;retardo de 3ms para visualizacion call retardo btfsc rota, 0 ;controla si terminaron las cuatro rotaciones goto empe ;si termino, vuelve desde el comienzo bcf status, c ;carry en cero para no afectar las rotaciones rrf rota ;desplaza el 1 que enciende los displays incf fsr ;incrementa el puntero. Apunta el proximo goto disp ;digito a mostrar end
Contador de 4 dígitos con PIC
Datos archivados del Taringa! original
1puntos
1,157visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
6visitas
0comentarios
Dar puntos: