You are on page 1of 12

Contador con pic

Introducción

Cuando deseamos hacer un contador simple de 0-9 podemos usar flip-flops o circuitos integrados
especiales para contadores, pero de cualquier manera tenemos que usar cierto número de
elementos los cuales pueden ir creciendo dependiendo de lo que vamos a usar. Pero cuando
usamos PICs todo se resuelve de manera más sencillo en el caso del Hardware los elementos son
minimos y por lo tanto el gasto es menor comparado si lo hicieramos con flip-flops y lo bueno es que
el PIC lo podemos reprogramar a nuestro antojo.

Descripción

En este pequeño proyecto utilizaremos un Display de 7 Segmentos para desplegar los números de 1
a 9 de manera que haremos un contador. Algo que tenemos que tener en cuenta es que
dependiendo si usamos un display anódo común o cátodo común el programa del PIC puede
cambiar. En este caso lo veremos con un display de cátodo común, lo que nos dice que para que
algún segmento encienda el pin tiene que recibir un 1 lógico. Por lo tanto para saber que es lo que
deseamos ver en el display necesitamos que el puerto B del PIC (RB0-RB7) tengan 1 lógicos ó 0
lógicos tal y como se ve en la siguiente tabla.

Funcionamiento

CODIGO DEL PROGRAMA

'DEFINIENDO VARIABLES 1 byte = 8 bits = 8 salidas > RB0-RB7


contador VAR byte
muestra var byte

'INICIANDO
TRISB = 0 'el PORTB como salida

inicio:
contador = 0 'inicializamos el contador a 0
programa:
gosub NUMERO 'se ve el numero elegido en
PORTB
PORTB = muestra 'PORTB toma el valor de
muestra
contador = contador + 1 'se incrementa contador con 1
pause 1000 'espera 1 segundo
if contador = 10 then inicio 'compara, si llega al #9
reinicia a #0
goto programa

NUMERO:
lookup contador, [63,6,91,79,102,109,125,7,127,111], muestra
'asigna valor
return

END 'fin del programa

Ahora explicaré el codigo del programa;

inicio:
contador = 0 'inicializamos el contador a 0

primero, contador será igual a 0 luego por la instrucción.

programa:
gosub NUMERO 'se ve el numero elegido
en PORTB
.
.
.
.

NUMERO:
lookup contador, [63,6,91,79,102,109,125,7,127,111], muestra
'asigna valor
return
END 'fin del
programa

con gosub numero nos direcciona a una subrutina (llamada NUMERO)que contiene el comando
lookup; el cual puede ser usado para obtener valores de una tabla de constantes de 8 bits, en este
caso usaremos contador y si contador es igual a cero, muestra toma el valor de la primera
constante ( que seria 63 y así sucesivamente hasta que tome todas las constantes disponibles)
luego regresá y toma la siguiente linea,

PORTB = muestra 'PORTB toma el valor de


muestra
contador = contador + 1 'se incrementa contador con 1
pause 1000 'espera 1 segundo
if contador = 10 then inicio 'compara, si llega al #9
reinicia a #0
goto programa

luego el valor que tomó muestra es colocado en PORTB y será el valor que se visualizará en el
DISPLAY, luego contador tendrá el valor que tenia anteriormente más uno, habra una pausa de 1
segundo para que podamos ver el resultado en el display y si contador es igual a 10 reinicia el
programa de lo contrario repetira la secuencia.

En la siguiente tabla se muestra las constantes que se usarón en el comando LOOKUP, usamos
decimales, aunque tambien se pueden colocar hexadecimales.

DIAGRAMA explicado

DIAGRAMA
Primero con Los teclado, Te dire que hay varios modelos aqui te dejo las posibles soluciones con
algunos de estos:

 Teclado MAtricial 4x4

Dispositivo de entrada de datos que consta de 16


teclas o pulsadores, dispuestos e interconectados
en filas y columnas. Dispone de un conector SIL
(Single In Line) macho de 8 pines que se
corresponden con las 4 filas y las cuatro
columnas de las que dispone.
 Funcionamiento

En la siguiente figura vemos el esquema de


conexionado interno del teclado matricial y
sus correspondientes pines de salida
numerados de izquierda a derecha mirando
el teclado tal y como se ve en la foto
anterior. Cuando se presiona un pulsador se
conecta una fila con una columna, teniendo
en cuenta este hecho es muy fácil averiguar
que tecla fue pulsada. También podemos
ver el conexionado típico con el puerto B
del µC PIC. 

Las resistencias de 2k2 son necesarias para


poder compartir el puerto del pic
independientemente del teclado y por
ejemplo poder conectar un LCD o una barra
de leds al mismo tiempo. Durante la fase de
lectura del teclado la mitad de la puerta B
es configurada como entrada y la otra
mitad como lectura y durante la escritura
en el lcd o otro sistema, la puerta B es
configurada como salidas. Entonces se
podrían cortocircuitar accidentalmente las
salidas de los puertos provocando su
destrucción, si pulsásemos alguna tecla es
ese momento con lo que al poner estas
resistencias evitamos este hecho y así si se
produjera el cortocircuito tan solo circularía
una pequeña corriente y el puerto del µC no
correría ningún riesgo.

 Rutina  KB_Port:

La siguiente librería configura las salidas y Configura los puertos B del PIC para ser
entradas para usar el teclado escanea las teclas usados con el teclado.
y si es pulsada alguna retorna el valor de tecla
en modo hexadecimal para ser mostrado  KB_Scan:
directamente en un display LCD. Las variables y
subrutinas utilizadas son: Escanea todas las teclas y devuelve la tecla
pulsada en formato Hexadecimal.

 Tecla

Variable en donde se devuelve la tecla


pulsada

Descripción: Para controlar el teclado, los


puertos del µC conectados a las filas se
programan como salidas y los conectados a las
columnas del teclado se programan como
entradas, también se activan las resistencias de
polarización internas en los puertos de salida.
Esto se hace mediante la llamada a la etiqueta
"KB_Port" que inicializa los puertos para ser
usados con el teclado matricial.

Código:
KB_Port    ;Inicializa la puerta B para las entradas del
                             ;teclado. Programa RB0-3 como salidas y RB4-7
                             ;entradas con las resistencias de polarización
                             ;habilitadas----------------------------------
                 BSF          STATUS,RP0       ;Selecciona Pagina 1 (Banco)
                 MOVLW   0F0h                     ;PB4-7 como entradas
                 MOVWF   TRISB                   ;y PB0-3 como salidas
                 BSF          OPCION,RBPU     ;Habilita R de polarización en
entradas
                 BCF          STATUS,RP0       ;Vuelve a la pagina 0 (Banco)
                 RETURN                               ;Retorna.

Ahora para saber que tecla esta siendo pulsada necesitamos escanear el teclado, y esto se
consigue mediante la siguiente rutina que consiste en ir poniendo una a una las líneas RB0 a RB3
(conectadas a las filas del teclado) a nivel bajo ya que estas salidas tienen conectada la resistencia
de polarización a Vcc y por lo tanto están siempre a nivel lógico alto. Cada vez que una fila se
pone a nivel bajo se hacen 4 comprobaciones para ver si una de las cuatro columnas se a puesto a
nivel bajo y así saber la tecla pulsada.

Código:
KB_Scan                                               ;Escanea el teclado
                 CLRF         Tecla                   ;Borra Tecla y
                 INCF          Tecla,f                 ;prepara Tecla para
primer código.
                 MOVLW    0Eh                      ;Saca 0 a la primera fila
                 MOVWF    PORTB                 ;de la Puerta B
                 NOP                                      ;Nada para
estabilización de señal.
Cheq_Col  BTFSS     PORTB,4              ;Primera columna = 0
                 GOTO      antirebotes           ;Sale si se ha pulsado tecla.
                 INCF         Tecla,f                 ;Si no tecla pulsada,
incrementa tecla.
                 BTFSS     PORTB,5              ;Segunda columna = 0
                 GOTO      antirebotes          ;Sale si se ha pulsado tecla.
                 INCF         Tecla,f                 ;Si no tecla pulsada,
incrementa tecla.
                 BTFSS     PORTB,6              ;Tercera columna = 0
                 GOTO      antirebotes          ;Sale si se ha pulsado tecla.
                 INCF        Tecla,f                  ;Si no tecla pulsada,
incrementa tecla.
                 BTFSS     PORTB,7              ;Cuarta columna = 0
                 GOTO      antirebotes          ;Sale si se ha pulsado tecla.
                 INCF        Tecla,f                  ;Si no tecla pulsada,
incrementa Tecla.

Ultima_Tecla                                         ;comprueba si se a
escaneado todo el teclado

                MOVLW   d'17'                     ;Carga W con el n£mero de


Teclas + 1.
                SUBWF    Tecla,w               ;y lo compara con el valor
actual de Tecla.
                BTFSC      STATUS,Z          ;Si Tecla + 1 = valor actual.
                GOTO       NTeclas              ;No ha sido pulsada ninguna
tecla.
                BSF          STATUS,C          ;Pone a 1 Bit C.
                RLF          PORTB,f              ;as¡ la Fila 1 pasa a 1 con
la rotaci¢n a izqda.
                GOTO      Cheq_Col 

                NTeclas   CLRF Tecla          ;Coloca variable Tecla a 0


                RETURN                               ;y regresa.

antirebotes      ;ahora se espera a que la tecla sea soltada para evitar


rebotes
                        ;y reactivaciones de tecla
                        ;esta parte puede ser eliminada si para nuestro
proyecto no es necesaria
                        ;o es un inconveniente.

Espera1   BTFSS   PORTB,4                ;Si no se suelta la tecla FILA 1


                GOTO    Espera1                 ;vuelve a esperar.
Espera2   BTFSS   PORTB,5                ;Si no se suelta la tecla FILA 2
                GOTO    Espera2                 ;vuelve a esperar.
Espera3   BTFSS   PORTB,6                ;Si no se suelta la tecla FILA 3
                GOTO    Espera3                 ;vuelve a esperar.
Espera4   BTFSS   PORTB,7                ;Si no se suelta la tecla FILA 4
                GOTO    Espera4                 ;vuelve a esperar.
                 

                MOVF    Tecla,w               ;pone en w el numero contenido


en la variable
                CALL     T_Conv                ;llama a la tabla de conversion
y retorna
                MOVWF Tecla                   ;con el valor en hexadecimal y
lo pone en la variable.
                RETURN                             ;vuelve al programa
principal que hizo la llamada.
;-----------------------------------------------------------------------------
-----------------------------

T_Conv   ADDWF   PCL,1


               RETLW    '0'                        ;Tecla nº0 = 0
               RETLW    '1'                        ;Tecla nº1 = 1
               RETLW    '4'                        ;Tecla nº2 = 4
               RETLW    '7'                        ;Tecla nº3 = 7
               RETLW    'A'                       ;Tecla nº4 = A
               RETLW    '2'                        ;Tecla nº5 = 2
               RETLW    '5'                        ;Tecla nº6 = 5
               RETLW    '8'                        ;Tecla nº7 = 8
               RETLW    '0'                        ;Tecla nº8 = 0
               RETLW    '3'                        ;Tecla nº9 = 3
               RETLW    '6'                        ;Tecla nº10 = 6
               RETLW    '9'                        ;Tecla nº11 = 9
               RETLW    'B'                        ;Tecla nº12 = B
               RETLW    'F'                        ;Tecla nº13 = F
               RETLW    'E'                        ;Tecla nº14 = E
               RETLW    'D'                        ;Tecla nº15 = D
               RETLW    'C'                        ;Tecla nº16 = C

La parte de código de Espera se puede ser eliminada sin ningún problema si no queremos que el
pic tenga que esperar a que soltemos la tecla para continuar con su ejecución normal.
Ideas y mejoras: Para disminuir el número de conexión a usar para detectar la tecla que se esta
pulsando, podemos modificar un teclado matricial tal y como se expone en la siguiente figura:

Solo usaremos las salidas correspondientes a las filas del teclado y de RB0 a RB4 serán
configurables como salida o entrada mientras que RB4 solo será entrada. Para saber la tecla que
se esta pulsando tendremos que configurar una línea como salida y ponerla a nivel alto y las
demás como entrada y comprobar el valor de las entradas para saber que columna se a pulsado.

Los diodos utilizados son del típico modelo 1N4148. hay que tener especial cuidado en no
programar mas de una puerta como salida ya que podría destruirse algún diodo debido a una
circulación excesiva de corriente en los mismos. Esto es debido a que el circuito no tiene
resistencias de limitación para protegerlos en estos casos, pero es totalmente viable el uso de
ellas, así que si queremos usar las puertas para controlar el teclado y también para alguna otra
cosa podemos poner unas resistencias de 2k2 en serie con las puertas RB0 a RB4.

lcd 2X16
Descripción: La pantalla de cristal liquido o LCD (Liquid Crystal Display) es un dispositivo
µControlado de visualización grafico para la presentación de caracteres, símbolos o incluso dibujos
(en algunos modelos), es este caso 
 
 
dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos
(pixels), aunque los hay de otro número de filas y caracteres. Este dispositivo esta gobernado
internamente por un microcontrolador Hitachi 44780 y regula todos los parámetros de
presentación, este modelo es el mas comúnmente usado y esta información se basará en el
manejo de este u otro LCD compatible.

Caracteristicas principales:
 -Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos.
 -Desplazamiento de los caracteres hacia la izquierda o la derecha.
 -Proporciona la dirección de la posición absoluta o relativa del caracter.
 -Memoria de 40 caracteres por línea de pantalla.
 -Movimiento del cursor y cambio de su aspecto.
 -Permite que el usuario pueda programar 8 caracteres.
 -Conexión a un procesador usando un interfaz de 4 u 8 bits
Funcionamiento: Para comunicarse con la pantalla LCD podemos hacerlo por medio de sus
patitas de entrada de dos maneras posibles, con bus de 4 bits o con bus de 8 bits, este ultimo es
el que explicare y la rutina también será para este. En la siguiente figura vemos las dos maneras
posibles de conexionar el LCD con un pic16F84
 

Conexionado con bus de 4 bits


tengo mas informacion si deseas dejame tu email

http://foro.elhacker.net/electronica/contador_con_pic16f84-t68594.0.html#ixzz1NhgCO2Cf

Contador de 4 dígitos configurable

Dada la versatilidad de este circuito se lo puede colocar virtualmente en


cualquier desarrollo o equipo.

El contador funciona alrededor de un µC de Microchip, el PIC16F84 cuyo


programa se encarga de llevar la cuenta de los impulsos recibidos así como
controlar los displays y demás aspectos que se verán a continuación...
Doble entrada de disparo:
Una con un pulsador hacia el positivo (para flancos de subida) y otra con un
pulsador hacia la masa (para flancos de bajada). En ambos casos la señal
puede ser TTL siempre que al circuito se lo conecte a 5V de tensión. Gracias a
que el sistema de anti rebote puede ser configurado la entrada de disparo
puede provenir tanto de un pulsador como de una barrera infra roja de cruce
peatonal como así también un censor de efecto Hall o cualquier otro
reproductor mecánico.
Anti rebote configurable:
Por medio del interruptor marcado como AR se puede seleccionar entre un anti
rebote por tiempo (esto quiere decir que entre pulsación y pulsación el µC
esperará un tiempo previamente definido) un un anti rebote por retorno a
reposo de la línea de disparo (cuando se produzca la vuelta a su estado de
reposo del pulsador o entrada). El caso del anti rebote por tiempo suele ser el
mas empleado cuando un contador es disparado por un pulsador dado que
éste presenta repiques mecánicos indeseados. El tiempo de retardo se puede
configurar por medio de los interruptores J1 y J2 los cuales en combinación
permiten hasta cuatro tiempos diferentes. En tanto, el anti rebote por retorno a
reposo de la línea de disparo es mas apropiado cuando se lo conecta a
barreras IR en líneas industriales, censores mecánicos o levas (entre varios
ejemplos). Si se selecciona por tiempo y el pulsador permanece presionado el
conteo irá avanzando de uno en fondo y el tiempo de espera entre cada avance
dependerá de como estén los interruptores J1 y J2. Estando ambos abiertos
(sus líneas en estado alto) el tiempo es breve, mientras que estando ambos
cerrados (sus líneas a masa) el tiempo es el mas largo posible. En tanto, si se
configura para esperar la vuelta a reposo de la línea de disparo por mas que el
pulsador permanezca presionado la cuenta no avanzará sino hasta que se lo
suelte. En este caso los interruptores J1 y J2 no cumplen ninguna función.
Descripción del circuito:
El µC en su interior tiene cuatro variables (dig1, dig2, dig3 y dig4) en las que va
acumulando la cantidad de veces que se disparo el sistema. Este disparo
puede producirse tanto por un flanco ascendente en el pin 2 como por un flanco
descendente en el pin 3. Debido a la limitada cantidad de líneas de E/S de este
chip se decidió implementar un integrado decodificador de BCD a display de 7
segmentos a fin de formar los números sobre los mismos. Este integrado
necesita solo cuatro líneas de entrada para mostrar el número en los
segmentos de un display. Por medio de cuatro transistores actuando como
llaves (corte/ saturación) se logra manejar cuatro dígitos independientes con
tan solo ocho líneas o cables. Al hacerse el encendido alternado de los dígitos
a gran velocidad para la vista pareciese que están los cuatro encendidos al
mismo tiempo, cuando en verdad solo uno lo esta. Cada display permanece
encendido aproximadamente 3 milisegundos. Las resistencias de 10K ohms se
encargan de fijar estados lógicos definidos. Las de 4.7K ohms se encargan de
limitar tanto la corriente en las bases de los transistores como así también la
carga sobre los pines del puerto B del microcontrolador. En tanto las de 150
ohms se encargan de limitar la corriente en los displays. Para mayor brillo se
puede probar con resistencias de 100 ohms o incluso 56 ohms. La alimentación
recomendada es de 5V y el consumo no llega a los 100mA. El pulsador
marcado como R es el que reinicia el micro, volviendo la cuenta a cero.
El firmware:
Este, como todo desarrollo micro controlado necesita de un firmware (o
programa de dispositivo) para funcionar. El mismo puede ser descargado en
versiones ASM (para ver y modificar si de desea) o HEX (listo para cargar en el
PICmicro). Como todo programa de estos dispositivos comienza definiendo
equivalencias para nombrar posiciones de la memoria así como valores
literales; luego configura los puertos de E/S (el A como entradas, el B como
salidas). Seguidamente se inicializan los acumuladores (dig1 o unidades, dig2
o decenas, dig3 o centenas y dig4 o millares) y se ponen en bajo todas las
líneas del puerto B consiguiendo con esto que ningún display quede iluminado.
Luego el programa queda en un ciclo infinito el cual comprueba si hay actividad
en las líneas de entrada (pines 2 y 3) y muestra el contenido actual de la
cuenta (haciendo una llamada a la sub-rutina display). Si no hay actividad en
ninguna de las dos líneas de entrada el ciclo solo se encarga de hacer que en
los displays se vean los acumuladores. Un pulso bajo en el pin 3 o uno alto en
el pin 2 hará que el programa salte a la sub-rutina "increm" la cual aumenta en
uno el acumulador de unidades (y maneja el acarreo de ser necesario). Esta
rutina, además, deriva al programa a otra sub-rutina la cual se encargará de
llevar a cabo el anti rebote que se haya configurado. En caso de ser un anti
rebote por retorno a estado de reposo lo único que se hace es quedar a la
espera que el pin 2 quede en estado lógico bajo y el pin 3 en alto. Mientras se
espera que esto suceda se llama a la rutina de display para que los dígitos
sigan mostrando el estado actual del conteo. Sin esta llamada los mismos
quedarían apagados. En tanto, en caso de ser configurado para un anti rebote
por tiempo el sistema primero determinará dicho tiempo cargando a W
inicialmente con 25 y agregándole mas valor según el estado de los pines 17 y
18. el número restante será la cantidad de veces que se ejecute la sub-rutina
de display antes de retornar al programa principal. Pero el retorno se produce
incondicionalmente, sin verificar en que estado se encuentran las líneas por lo
que si algún pulsador continua pulsado la cuenta se aumentará nuevamente.

You might also like