Professional Documents
Culture Documents
Bueno, me toco hacer un proyecto para un ramo en la u y eleg este porque igual es
entretenido, si alguien necesita hacerlo para la u o por amor al arte les detallo a
continuacin todo lo necesario para hacerlo realidad.
Software y materiales:
Dado que el control de este circuito es con un micro-controlador se necesita el
software para programar y compilar el programa para luego cargarlo al micro
Ac un link con el tutorial de instalacin para el software MicroCodeStudio, su
compilador y todo el cuento
AQUI
PARA QUEMAR O GRABAR EL PIC SE NECESITA UN GRABADOR DE ESTE
TIPO
AQUI
yo uso un clon del Pickit2 lo recomiendo es econmico , cualquiera que sea
compatible sirve he incluso andan dando vuelta los esquematicos para fabricarlo uno
mismo.
PROTEUS PARA LA SIMULACIN
AQUI
MATERIALES :
- MICROCONTROLADOR PIC16F877A puede ser otro de 40 o menos pines, puede
usted modificar el PCB segn sus necesidades.
- DISPLAY LCD 16x2
- TECLADO MATRICIAL 4x4 RECOMIENDO ESTOS MODELOS 1 y 2 , me gusta mas
la segunda opcion ya que es adhesivo y es mucho mas estetico que el primero,
respecto al funcionamiento, solo de deben activar las resistencias pull-up internas del
pic en la programacion, el primer modelo las tiene incluidas en el pcb.
;INICIO DE PROGRAMA
INIT ;_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
High LED_INDICADOR ;ENCIENDE LED
pause 500
MSJ_CLAVE ;_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pause 45
LCDOUT $FE, 1 ' LIMPIAR LCD
FOR B0 = 0 TO 12
LOOKUP B0,["INGRESA CLAVE"],B1
LCDOUT $FE,$0C,B1
PAUSE 45
NEXT
LCDOUT $FE, $C0 'COLOCAR EL CURSOR EN LA SEG LNEA
FOR B0 = 0 TO 9
LOOKUP B0,["4 DIGITOS:"],B1
LCDOUT $FE,$0C,B1
PAUSE 45
next
GOTO TECLAUNO ; IR A COMPARAR CLAVES_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
MSJ_VERIF ; _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pause 200
LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE, $82, "VERIFICANDO" 'ESCRIBIR EN LA PRIMER LNEA
LCDOUT $FE, $C4, "CLAVE" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
pause 500
HIGh LED_OPEN
PAUSE 200
LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE, $82, "VERIFICANDO" 'ESCRIBIR EN LA PRIMER LNEA
LOW LED_OPEN
LCDOUT $FE, $C2, "..........." 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
PAUSE 500
GOTO MSJ_OPEN ;_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
MSJ_ERROR
pause 200
LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE, $82, "VERIFICANDO" 'ESCRIBIR EN LA PRIMER LNEA
LCDOUT $FE, $C4, "CLAVE" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
pause 500
HIGh LED_OPEN
PAUSE 200
low LED_OPEN
LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE, $82, "VERIFICANDO" 'ESCRIBIR EN LA PRIMER LNEA
LCDOUT $FE, $C2, "..........." 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
PAUSE 1000
LCDOUT $FE, 1 ; LIMPIAR VISOR
LCDOUT $FE, $84, "CLAVE" 'ESCRIBIR EN LA PRIMER LNEA
LCDOUT $FE, $C2, "INCORRECTA!" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C 'APAGAR EL CURSOR
High LED_ERROR ;ENCIENDE LED
pause 500
low LED_ERROR ;APAGA LED
pause 200
High LED_ERROR ;ENCIENDE LED
pause 500
low LED_ERROR ;APAGA LED
PAUSE 1500
GOTO MSJ_CLAVE
pause 10
Goto BARRIDO
;_________programa anti rebotes de teclas___________
PTECLA:
HIGH LED_INDICADOR
PAUSE 200 ;DURACION 50MS
LOW LED_INDICADOR
ESPACIO: ;PROGRAMA DE ANTIRREBOTE DE TECLAS
IF C1 = 0 THEN ESPACIO
IF C2 = 0 THEN ESPACIO ;SI SIGUE PULSADA LA TECLA IR A ESPACIO
IF C3 = 0 THEN ESPACIO
PAUSE 45
RETURN ;RETORNA SI SE SUELTAN LAS TECLAS
;______________COMPARACION DE CLAVES_______________________
TECLAUNO:
GOSUB BARRIDO ; IR A BARRIDO Y RETORNAR CON UN VALOR
GOSUB PTECLA ; ENVIA A PROGRAMA ANTIREBOTES
LCDOUT $FE, $CA, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
IF NUMERO = 1 THEN TECLADOS ; SI EL NUMERO ES = A 1 IR A "TECLADOS"
GOTO FALSO ; SI NO ES IGUAL A 1 IR A LAZO FALSO
TECLADOS:
GOSUB BARRIDO
GOSUB PTECLA
LCDOUT $FE, $CB, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
IF NUMERO = 2 THEN TECLATRES ;SI EL NUMERO ES = A 2 IR A "TECLATRES"
LCDOUT $FE, $CB, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
GOTO FALSO1
TECLATRES:
GOSUB BARRIDO
GOSUB PTECLA
LCDOUT $FE, $CC, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
IF NUMERO = 3 THEN TECLACUATRO ; SI EL NUMERO ES = A 3 IR A
"TECLACUATRO"
LCDOUT $FE, $CC, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
GOTO FALSO2
TECLACUATRO:
GOSUB BARRIDO
GOSUB PTECLA
LCDOUT $FE, $CD, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
IF NUMERO = 4 THEN OPENGE ;SI EL NUMERO ES IGUAL A 4 CONECTAR RELE
LCDOUT $FE, $CD, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
GOTO FALSO3
OPENGE: PAUSE 200
GOTO MSJ_VERIF
MSJ_OPEN
HIGH LED_OPEN
PAUSE 1000
high RELE
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, $81, "PUERTA ABIERTA" 'ESCRIBIR EN LA PRIMER LNEA
PAUSE 4000
LOW LED_OPEN
LOW RELE
GOTO MSJ_CLAVE ; IR NUEVAMENTE A COMPARAR CLAVES
;_______________LAZO FALSO____________
FALSO:
GOSUB BARRIDO
GOSUB PTECLA ;ESTAS TECLAS NO COMPARAN NINGUNA CLAVE
LCDOUT $FE, $CB, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
FALSO1: ; SOLO ESPERA QUE TERMINE DE PULSAR LAS 4 TECLAS.
GOSUB BARRIDO
GOSUB PTECLA
LCDOUT $FE, $CC, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
FALSO2:
GOSUB BARRIDO
GOSUB PTECLA
LCDOUT $FE, $CD, "*" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C
FALSO3:
pause 200
GOTO MSJ_ERROR
end
Teoria y aplicacion
MICROCONTROLADOR PIC16F877A
El PIC16F877A es un micro controlador con memoria tipo flash, lo que permite una
gran facilidad en el desarrollo de prototipos ya que no requiere ser borrado con luz
ultravioleta como las versiones EPROM, si no que permite ser reprogramado
nuevamente sin ser borrado con anterioridad.
Dispositivo de la empresa MICROCHIP technology fabricado en tecnologa CMOS, su
consumo de potencia es muy bajo, El encapsulado ms comn para este micro
controlador es el DIP (Dual In-line Pin) de 40 pines, propio para usarlo en
experimentacin.
La referencia completa es:
PIC16F877-04 para el dispositivo que utiliza cristal oscilador de hasta 4 MHz
PIC16F877-20 para el dispositivo que utiliza cristal oscilador de hasta 20 MHz
PIC16F877A-I para el dispositivo tipo industrial que puede trabajar hasta a 20 MHz
DISTRIBUCIN DE PINES:
La mxima capacidad de corriente de cada uno de los pines de los puertos en modo
sumidero (sink) o en modo fuente (source) es de 25 mA.
La mxima capacidad de corriente total de los puertos es:
PUERTO A PUERTO B PUERTO C PUERTO D
Modo sumidero 150mA 200mA 200mA 200mA
Modo fuente 150mA 200mA 200mA 200mA
El consumo de corriente del micro controlador para su funcionamiento depende del
voltaje de operacin, la frecuencia y de las cargas que tengan sus pines.
Para un oscilador de 4 MHz el consumo es de aproximadamente 2mA aunque este se
puede reducir a 40 A cuando se est en el modo sleep (en este modo el micro se
detiene y disminuye el consumo de potencia).
DESCRIPCION DE PINES
El oscilador externo
Todo micro controlador requiere un circuito externo que le indique la velocidad a la
que debe trabajar. Este circuito, que se conoce como oscilador o reloj, es muy simple
pero de vital importancia para el buen funcionamiento del sistema.
El PIC16F877 puede utilizar cuatro tipos de oscilador diferentes. Estos tipos son:
RC. Oscilador con resistencia y condensador (baja precisin).
XT. Cristal (por ejemplo de 1 a 4 MHz, utilizado en este proyecto)
HS. Cristal de alta frecuencia (por ejemplo 10 a 20 MHz).
ETAPA DE PROGRAMACIN:
Para el desarrollo del programa que controlara todo el dispositivo se necesitaba de un
lenguaje que fuese muchsimo ms amigable que el lenguaje assembler (lenguaje de
bajo nivel), por lo tanto se utilizo el entorno de desarrollo MicroCodeStudio junto con
una programacin en lenguaje BASIC (lenguaje de alto nivel).
Porque BASIC y no Assembler?
Si bien assembler en un lenguaje ms optimizado para trabajar con micro
controladores, tiene tiempos de ejecucin ms rpidos y permite una mayor
optimizacin de la memoria interna del pic, para alguien que no conoce el lenguaje se
le complicara demasiado poder entenderlo para casos de modificaciones o
soluciones de problemas que puedan presentarse.
En cambio el lenguaje BASIC es muchsimo ms amigable, se reduce
considerablemente las lneas de cdigo para un mismo fin, aunque consume ms
memoria interna esto ya no es un problema porque cada vez los PIC contienen mas
memoria para soportar programas ms pesados.
Un ejemplo claro seria un programa para generar tonos telefnicos DTMF (Dual-Tone
Multi-Frequency), en assembler serian 260 lneas de cdigo, el tiempo en estudiar y
calcular cada una de las frecuencias sera demasiado y si lo que se busca es
optimizar tiempos y resultados no es lo ideal, en cambio para el lenguaje BASIC
dentro del entorno MCS resulta algo bastante simple y que no requiere ms de un par
de segundos para obtener todos los tonos DTMF, por ejemplo la siguiente lnea de
cdigo:
DTMFOUT portb.3, [0,9,6,1,3,6,5,6,4] ;genera tonos telefnicos por el pin RB.3
Por lo tanto tenemos una gran flexibilidad para poder desarrollar proyectos complejos
en un corto tiempo y con una gran eficacia, que para el caso de assembler requerira
de mucho tiempo y conocimientos especficos.
Para nuestro programa definimos la siguiente configuracin de fuses que nos permite
su ptimo funcionamiento en base a la configuracin sugerida por el fabricante, para
esto se debe editar el archivo .INC dentro de la carpeta pbp, este archivo contiene la
configuracin defecto que adquiere nuestro programa, a continuacin el cdigo a ser
modificado:
__config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF (GENERALMENTE
VIENE TAL CUAL)
(Indica que el tipo de oscilador ser de tipo XT cristal de cuarzo, Perro guardin
activado y la proteccin de cdigo desactivada, eso es para que el programa
pueda ser modificado posterior a la grabacin)
- CONFIGURAR VARIABLES Y DEFINCION DE PUERTOS I/O
Dentro de las configuraciones est la de definir caractersticas y variables, esto se
logra mediante el comando DEFINE, VAR y a continuacin se detallan
configuraciones del programa de control de acceso:
DEFINE OSC 4 ; OSC_XT 4MHz; Establecemos que el oscilador ser de 4Mhz
; CONFIG PORT_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Cmcon=7 ; PORTA COMO I/O DIGITAL POR DEFECTO VIENE COMO ENTRADA
ANALOGICA.
TRISA=0 ; PORTA SALIDA
TRISC=0 ; PORTC SALIDA
TRISB=0 ; PORTB SALIDA
TRISD=%11110000; RD0, RD1, RD2, RD3 = OUTPUT = FILAS
; RD4, RD5, RD6, RD7 = INPUT = COLUMNAS
*DENTRO DEL REGISTRO STATUS DEL MICROCONTROLADOR EXISTE LA
FUNCION TRIS QUE NOS PERMITE DEFINIR SI UN PIN ES ENTRADA O SALIDA.
; DEFINICION DE VARIABLES_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
B0 var byte ; VARIABLE QUE ALMACENA BYTE O LETRAS EN EL CASO
CUANDO SE DESPLIEGA UN MENSAJE LETRA POR LETRA.
B1 var byte
LED_INDICADOR var PORTC.4; INDICAMOS QUE EL PUERTO C4 SE LED
INDICADOR O STATUS
LED_OPEN VAR PORTC.5; SALIDA PARA LED OPEN POR PUERTO C5
LED_ERROR VAR PORTC.6; SALIDA PARA LED ERROR POR PUERTO C6
RELE var PORTC.3; SALIDA PARA RELE POR PUERTO C3
Luego de definir todas las variables podemos decir que el PIC16F877A queda con las
siguientes configuraciones para trabajar:
- Oscilador de tipo XT cristal de cuarzo de 4mhz
- Reset por pulso bajo nivel por defecto.
- Configuracin de Puerto B como salida, donde se enviaran los datos al LCD
- Configuracin de los 4 bit menos significativos del puerto C (0.1.2.3) como salida que
corresponden a las filas del teclado, y los 4 bit ms significativos (4.5.6.7) como
entradas que corresponden a las columnas, no se activan resistencias internas PULLUP ya que el teclado las tiene agregadas al PCB.
PROGRAMACIN GENERAL
En esta etapa se exponen fragmentos de cdigo donde se generan los procesos de
todas las funciones del dispositivo
INIT ;
High LED_INDICADOR; ENCIENDE LED: ESTA LINEA INDICA QUE SE SEBEN
SACAR 5V CON UNA CORRIENTE DE 25mA POR EL PUERTO C4, YA QUE LO
DEFINIMOS AL PRINCIPIO EN LAS CONFIGURACIONES DE PUERTOS I/O.
Pause 500
Low LED_INDICADOR; APAGA LED
Pause 200 : ESTO SIGNIFICA QUE SE GENERA UNA PAUSA DE 200ms
PARA ENCENDER NUEVAMENTE EL LED
High LED_INDICADOR; ENCIENDE LED
Pause 200
Low LED_INDICADOR; APAGA LED
Pause 200 ; RETARDO DE TIEMPO PARA PREPARAR DISPLAY
LCDOUT $FE, 1 ; COMANDO PARA LIMPIAR DISPLAY LCD
LCDOUT $FE, $82, "INICIANDO" 'ESCRIBIR EN LA PRIMER LNEA
LCDOUT $FE, $C2, "CERRADURA" 'ESCRIBIR EN LA SEGUNDA LNEA
LCDOUT $FE, $0C 'APAGAR EL CURSOR
PAUSE 500
Estas lneas de cdigo sirven para generar lo primero que sucede al encender el
dispositivo, se enva un pulso para encender el led indicador por un periodo de
500ms, luego se apaga y vuelve a encender por un periodo de 200ms y vuelve a
apagarse, luego se espera otro periodo de 200ms suficiente para que se prepare el
display para recibir su primera instruccin de borrado de pantalla, luego se le indica
que debe desplazar el cursor y desplegar la palabra INICIANDO, luego se le indica
que debe desplazarse a la segunda lnea en la Posicin C2 y escribir CERRADURA,
luego apaga el cursor y espera un tiempo de 500ms a la espera de la siguiente
instruccin.
Informacion completa con ejemplos sobre programar un display LCD , tabla de
posicion de memoria, comandos ,efectos etc.
MSJ_CLAVE
Pause 45
LCDOUT $FE, 1 ' LIMPIAR LCD
FOR B0 = 0 TO 12
LOOKUP B0,["INGRESA CLAVE"],B1
LCDOUT $FE,$0C,B1
PAUSE 45
NEXT
LCDOUT $FE, $C0 'COLOCAR EL CURSOR EN LA SEG LNEA
FOR B0 = 0 TO 9
LOOKUP B0,["4 DIGITOS:"],B1
LCDOUT $FE,$0C,B1
PAUSE 45
Next
GOTO TECLAUNO; IR A COMPARAR CLAVES
Este fragmento es cuando se le indica al usuario ingresar su clave de cuatro dgitos,
los comandos para desplegar los mensaje cambian respecto a los anteriores porque
ahora se aplica el efecto de despliegue letra por letra, todo con retardos de 45ms
suficientes para preparar a la memoria RAM de la pantalla para que reciba la
informacin, Al final en la lnea que dice GOTO TECLAUNO, es simplemente IR A
TECLA UNO lo que se llama salto incondicional, no requiere una condicin para ir a
ese punto del programa.
Luego se vuelve a la lnea MSJ_OPEN espera 1 segundo y enva 5 volt al pin donde
est conectado el rel mediante un transistor 2n3904 que al recibir el pulso entra en
estado de saturacin permitiendo la circulacin de corriente por la bobina y activando
los contactos internos del rel, tambin se mantiene encendido el LED_OPEN y se
enva un mensaje al LCDindicando que se abri la puerta:
DISPLAY LCD
Los LCD tienen la capacidad de mostrar cualquier carcter alfa numrico, vienen con
la lgica de control pre programada de fbrica, el consumo de corriente es menor a 5
mA.
En total se pueden visualizar 2 lneas de 16 caracteres cada una, es decir, 2x16=32
caracteres. A pesar de que el display slo puede visualizar 16 caracteres por lnea
(esto est sujeto al tipo de display que se est utilizando), puede almacenar en total
40 por lnea. Es el usuario el que especifica que 16 caracteres son los que se van a
visualizar.
CONEXIONES:
definimos que se usara un bus de 4 bit en este caso lo ms altos (4 al 7), tambin
que se usara el pin B.1 como RS y el B.2 como Enable.
TECLADO MATRICIAL
El teclado matricial est compuesto por filas y columnas, en este caso es un teclado
4x4, se uso uno con resistencias pull-up integradas al PCB ya que el microcontrolador
detecta voltajes y no impedancias por lo tanto detectara cuando una columna cambie
a 0 como se explico anteriormente en el funcionamiento del programa, se puede
conectar un teclado sin resistencias pull-up, estas se deben activar en la
programacin del micro y se debe consultar el datashet del modelo de pic a usar o del
Pic16f877A en este caso.
ESQUEMATICO PARA PROTEUS
La pantalla se puede cambiar de posicin , se puede soldar con un cable tipo IDE o
flex , yo lo sold directo a la placa.