Alarma pic16f84

Hola, buenas estoi un poco verde en este de programar ya que estoy empezando, queria saber si alguien me podria echar una manilla,la cosa es que quiero realizar una alarma para una casa con dos sensores un teclado de 9 teclas y una pantalla de 2 lineas,si alguien pudiese ayudarme con el programita aunque sobre todo mi principal problema es que no se como crear la clave que kiero ponerle de 4 digitos, profavor si alguien pudiese ayudarme, MUCHAS GRACIAS DE ANTEMANO
 
Buenas edu!!

Primero deberias ser un poco mas explicito en que quieres hacer, para que los que lo leamos nos hagamos una idea clara y sepamos darte una mejor solucion!!
sobre tu problema principal, tu programas el pic con una contraseña que quieras, por ejemplo, 5683. luego haces que si se pulsa el 5, el programa coja una direccion, y si no es 5 coja otra; cuando pasa el segundo nivel, si se le da a 6, pasa al tercero, sino pasa a error....

simplificado: haces un subprograma para reconocer cada numero y enlazado a la siguiente fase, y un subporgrama para error. si se pica bien el codigo va pasando entre los subporgramas de numero hasta que al final supongo que ira a otro subprograma para activar o desactivar algo, y si se pica mal el numero, se va a error y vuelve al principio!!

Por otro lado, antes de que sigas desarollando la idea con un pic16f84, deberias calcular si te llega... este pic dispone de 12 I/O, el teclado matricial de 9 te gastara 6 I/O, los 2 sensores otras 2 ( minimo...) y imgino que la finalidad sera activar o desactivar algo, osea que minimo otra salida entrada mas ocupada... esto hace : 12-6-2-1=3 Eso significa que te quedan 3 entradas/salidas para controlar una pantalla de 2lineas ( supongo que te referiras a un LCD de 2 lineas) . Estoy bastante verde en LCD's, pero creo que son pocas salidas para controlar un lcd!!

Si quieres expon mejor tu idea e igual entre todos sacamos una idea mas factible, ya que desde mi punto de vista, no vas a poder hacer todo eso con un solo pic16f84...

Saludos!!!
 
Hola jaso, gracias por tu interes e exo cazlculos y con el pic16f84 si me da, el puerto B lo comparten la pantalla y el teclado el teclado va conectado desde RB0 A RB6 y la pantalla de RB4 A RB7, cada vez que tenga que utilizar teclado o pantalla tengo k configurar dicho puerto, y el puerto A estaria compuesto por RB0 Y RB1 para los pines de la pantalla de habilitacion y de cambio de modo caracter y modo comando, y los pines RB2 A RB4 irian para los dos sensores finales de carrera y un zumbador.

Respecto a la clave podria ser 1234, el caso es que tengo echo algo entre lo que e leido de un libro que tengo y lo que e visto x internet pero no em funciona y no se darle solucion lo que yevo exo para la clave es lo siguiente te lo adjunto mi proyecto para que puedas verlo y que me des tu opinion, muchas gracias de nuevo.
 

Adjuntos

  • prueba2.rar
    42.6 KB · Visitas: 174
Buenas de nuevo!!! primero de todo, viendo que eres nuevo en el foro ( yo tambien eh :p) intenta no escribir como si fuera un mensaje de texto de mobil, quitando letras y haciendo abrebiaciones, a mi personalmente me da igual pero te llamaran la atencion!!

respecto a tu proyecto, tela, no he podido analizar a conciencia el programa principal y todos los subprogramas, pero si le he hechado un ojo rapido a todos, fijandome como usan tanto el puertoA como el B. imagino que cuando dices RB0 y RB! para pantalla y RB2 y RB3 para sensores, realmente te refieres a RA1 RA2 RA3 Y RA4.

por lo que he podido ver, el LCD tambien usa el RA3, asi que no lo podrias usar para sensor... luego no he localizado donde asiganas el codigo y la manera de leerlo, dime en que subprograma esta y me lo miro :)

saludos
 
Gracias por avisarme de eso, sí perdon con lo de la pantalla y los sensores me referia a los pines del PUERTO A, y no la pantalla no yeva uno a ra3 porque ese siempre lo tendre a amsa poque no em ahce falta leer nada de la pantalla, el principal problema que tengo es para la creacion de la clave que he probado aqui pero no se bien como hacerlo, lo que quiero es una simple clave de 1234 pero no consigo hacerlo como ves en el diseño de mplab aunque e hecho algunos cambios pero sigue sin funcionar. Con lo de de donde asigno el codigo y de donde lo leo, no se a que te refieres. Gracias.
 
Acabo de revisar tu proyecto y me parece que te estás complicando...lo que te voy a decir tomatelo como una crítica contructiva:

1. Veo que usas muchísimas rutinas con muchos llamados dentro de sí y además de eso usas interrupciones con rutinas que usan llamados (es decir call...) que gastan mas posiciones de pila...puede que la pila del microcontrolador no sea tan extensa para que tu programa fucnione correctamente...(solo son 8 posiciones de pila)

2. Lo de almacenar una clave, solamente debes guardarla en la EEPROM interna del pic [no me he fijado si este 16f84 tiene EEPROM]... tu en algun lado usas una conversion de millares, decenas, centenas....eso es para comparar la contraseña almacenada anteriormente?...es mas facil si guardas la contrasña en 4 posciones de memoria EE' y luego cuando necesites comparar solamente accedes a esas 4 posiciones y comparas con una xor....

3. Tus rutinas de retardos son ineficientes, porque son difíciles de recalibrar si cambias el cristal del sistema...no sería mas cómodo usar los timers del pic? esto te dá mas precisión en los tiempos.....aunque para este proyecto no es tan necesario, si te puede servir para otro proyecto que vayas a realizar.

Para que me entiendas la idea de la EEprom...en realidad necesitas 1 clave predeterminada e inmutable [clave p] y 1 clave cambiable [clave c]. El propósito de la clave p, es para permitir un cambio en la clave c... de tal manera que sea posible cambiar la contraseña[clave c] sin reprogramar el pic. La clave c simplemente es la contraseña del sistema.

si no entiendes me avisas
 
Pues la verdad es que como te dije soy nuevo en esto, y e leido por ahi eso de guardar la clave en la eeprom, pero no se como tengo que hacerlo, y solo tengo de momento en mente poner una clave fija que no se cambie ni nada, porque como no se ni guardar una en la eeprom como para tener que andar aciendo apra que peuda cambiarse y todo, lo siento por mis pocos conocimientos sobre esto
 
Edu, si no vas a usar el RA3 para la pantalla, deberias ajustar el programa de la LCD para que no lo use... sino tendras problemas y te hara cosas raras :S lo de la contraseña, si la quieres fija, es bien facil, guardas un numero de 4 dijitos en una posicion de la memoria y luego a medida que se clica ahi, que se compare si es correcto. por poner un ejemplo, al principio del porgrama deberias asignar en 4 literales los 4 numeros en binario y luego que se comprobaran ahi algo tipo asi:

movlw 1 : primer digito de la contraseña
movwf 20 :posicion de la memoria donde se guardara
movlw 2 :segundo digito de la contraseña
movwf 21 :posicion de la memoria donde se guarda
etc etc hasta los 4 digitos

Saludos
 
pero una vez que tengo guardado los 4 digitos en cuatro registros que he creado los puedo comparar aciendo uan resta y si salta el bit z de status pues ya esta, pero si tengo mlos 4 digitos guardados en 4 registros como ago apra que la tecla que yo pulse me la reconozca y me la compare, lo siento es que estoy muy perdido
 
se supone que el programa de del teclado matricial ya reconoce si pulsas 1, o 7... una ves que sabes que numero se ha picado en el telcado, lo comparas con la posicion de memoria que has guardado previamente
 
Hola buenas mira esta es mi libreria para el teclado, la cosa es que cuando ejecuto la subrutina lee_tecla analiza la tecla que e pulsada y la guarda en w(registro de trabajo), pero al compararla con el codigo binario que anteriormente he guardado en registro no me funciona es como si no iciera nada:S:S, aqui dejo mi libreria aver si alguien puede echarle un ojo aver si ve algun fayo o algo muchas gracias.

;**************************** Librería "TECLADO_16F84A.INC" ***********************************
;
; Librería de subrutinas para la gestión de un teclado organizado en una matriz de 4 x 3 y
; conectado al Puerto B según la disposición siguiente:
;
; RB4 RB5 RB6
; ^ ^ ^
; |----|----|----|
; RB0 -->| 0 | 1 | 2 |
; |----|----|----|
; RB1 -->| 3 | 4 | 5 |
; |----|----|----|
; RB2 -->| 6 | 7 | 8 |
; |----|----|----|
; RB3 -->| 9 | 10 | 11 |
; |----|----|----|
;
; Los números que se han dibujado dentro de cada cuadrado, son el orden de las teclas,
; que no tienen por qué coincidir con los números reales de las mismas. El paso del número de orden
; de la tecla al valor real de la misma se hace con una tabla de conversión.
;
; **************************************** ZONA DE DATOS ***********************************
;
CBLOCK
ORDEN_TECLA ;Orden de la tecla a chequear.
CONTADOR1
CONTADOR2
ENDC

ULTIMA_TECLA EQU .11 ;Valor de orden de la última tecla utilizada.
COMPROBAR EQU b'11110000' ;Valor que se utilizará para comprobar si una tecla ha sido
;pulsada o no
; ***********************************Subrutina "LEE_TECLA"***********************************
;
; Cada tecla tiene asignado un número de orden que es contabilizado en el registro
; ORDEN_TECLA. Para convertir a su valor según el tipo de teclado en concreto, se
; utiliza una tabla de conversión.
; A continuación se expone la relación entre el número de orden de la tecla y los
; valores correspondientes para el teclado utilizado.
;
; ORDEN DE TECLA: TECLADO UTILIZADO:
; 0 1 2 1 2 3
; 3 4 5 4 5 6
; 6 7 8 7 8 9
; 9 10 11 * 0 #
;
; Así, en este ejemplo, la tecla "7" ocupa el orden 6, y la tecla "0" el orden 10.

;La secuencia a seguir para esta aplicación será:
; Entrada: En (W) el orden de la tecla pulsada.
; Salida: En (W) el valor decimal y ASCII para este teclado concreto.
;********************************************************************************************




;********************************************************************************************
;La siguiente subrutina configura el Puerto B para la conexión al teclado, programando RB <0:3> como salidas y RB <4:6> como entradas
;********************************************************************************************
CONFIGURAR_TECLADO

BANCO1 ; Selecciona banco 1 para manipular TRISB.
movlw 00h ; Configuramos el pueto B como salida
movwf TRISB ; (para poder escribir el contenido de su registro).

BANCO0
; Seleccionamos banco 0 para manipular PORTB
movlw 0xF0 ; Ponemos a 1 los bits RB7, RB6, RB5, RB4.
movwf PORTB ; Cuando uno de estos pins se ponga a 0 (mediante teclado)
; el registro RBIF se pone a 1, si GIE es 1 y RBIE es 1, el
; programa ejecuta la subrutina de atencion a interrupciones
;********* ; para realizar la lectura de la tecla pulsada.

BANCO1
bcf OPTION_REG,7 ;Habilita resistencia de Pull-Up del Puerto B.


movlw b'11110000' ; Carga W con el binario especificado
movwf TRISB ; Configura RB7 a RB4 como entradas y RB3 a RB0 como salidas
; Se bloquea el nibble alto de PORTB,
; es decir, no podemos modificar el valor
; de PORTB<7:4> mediante instrucciones
; MOVWF PORTB.

return ;Retorno de subrutina.

;**************************************************************************************

LEE_TECLA

call ORDEN_TECLAS ;Lee el Orden de la tecla pulsada.
btfss STATUS,C ;Si se pulsa alguna tecla, hacemos C=1 y ejecutaremos la instrucción call ORDEN_EN_CARACTER
goto FIN_LEE ;Si no se pulsa ninguna tecla se habrá acabado la lectura del teclado
call ORDEN_EN_CARACTER ;Si se ha pulsado alguna tecla la subrutina ORDEN_EN_CARACTER la
;convierte en su valor real mediante una tabla.
bsf STATUS,C ;De nuevo se le da el valor 1 a C porque la instrucción "addwf PCL,F" lo pone a "0".
FIN_LEE
return ;Retorna para ejecutar la instrucción call LCD_CARACTER

ORDEN_EN_CARACTER ;Según el teclado utilizado resulta:
addwf PCL,1
retlw b'00110001'
retlw b'00110010'
retlw b'00110011'
retlw b'00110100'
retlw b'00110101'
retlw b'00110110'
retlw b'00110111'
retlw b'00111000'
retlw b'00111001'
retlw b'00101010'
retlw b'00110000'
retlw b'00100011'
FIN_TABLA
;
; Esta tabla se debe situar al principio de la librería con el propósito de que no supere la
; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera
; visualizaría el siguiente mensaje de error en el proceso de ensamblado:
;
IF (FIN_TABLA > 0xFF)
ERROR "Atención: La tabla ha superado el tamaño de la subpágina de los"
MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
ENDIF
;********************************************************************************************
;La subrutina Pausa_20ms genera un retardo de 20 ms.
;********************************************************************************************

PAUSA_20ms
BANCO0
movlw .26 ;Carga W con el decimal 26
movwf CONTADOR2 ;Carga CONTADOR2 con 1Ah
BUCLE2
movlw .255 ;Carga W con el decimal 255
movwf CONTADOR1 ;Carga CONTADOR1 con 0FFh
BUCLE1
decfsz CONTADOR1,1 ;Decrementa CONTADOR1
goto BUCLE1 ;Decrementa hasta que CONTADOR1 es cero
decfsz CONTADOR2,1 ;Decrementa CONTADOR2
goto BUCLE2 ;Decrementa hasta que CONTADOR2 es cero
nop ;Consume 1 Ciclo de Instrucción
return ;Retorno de subrutina

;*******************************************************************************************

;
;************************************* Subrutina "ESPERA" ***************************************
;
;Permanece en esta subrutina mientras se mantenga pulsada cualquier tecla.


ESPERA
movlw COMPROBAR ;Con estas dos instrucciones se ponen a cero las cuatro líneas de
movwf PORTB ;salida del Puerto B

SIGUE_ESPERANDO
call PAUSA_20ms ;Espera a que se estabilicen los niveles de tensión al pulsar
movfw PORTB ;Lee el Puerto B pasando su valor a W.
sublw COMPROBAR ;Realiza la operación COMPROBAR, menos contenido de W. Si los valores son los mismos es que no ;hay pulsada ninguna tecla
btfss STATUS,Z ;Comprueba el bit Z de STATUS. Si el resultado de la resta anterior es 0, entonces Z = 1 y no ;se leerá la instrucción goto
goto SIGUE_ESPERANDO ;Si Z = 0, es que hay una tecla pulsada y hay que esperar
return ;Retorno de subrutina. El PC se posiciona en la dirección posterior a call ESPERA



;**************************************Subrutina "ORDEN_TECLA"*********************************
;
; Lee el teclado, obteniendo el orden de la tecla pulsada.

ORDEN_TECLAS
clrf ORDEN_TECLA ;Se borra el registro ORDEN_TECLA
movlw b'11111110' ;Se carga FEh en W. Con este valor se activará la fila 1

CHEQUEA_COLUMNAS
movwf PORTB ;Activa la fila correspondiente.
nop
COLUMNA1
btfss PORTB,4 ;Chequea la 1ª columna buscando un cero.
goto GUARDA_VALOR ;Si el bit 4 del Puerto B fuese cero, guardará el valor del registro ORDEN_TECLA en W y saldrá. ;En caso contrario incrementará el registro ORDEN_TECLA
incf ORDEN_TECLA,F ;Si no encuentra un cero, incrementará el registro ORDEN_TECLA y chequeará la siguiente columna

COLUMNA2 ;El proceso es el mismo para todas las columnas
btfss PORTB,5
goto GUARDA_VALOR
incf ORDEN_TECLA,F

COLUMNA3
btfss PORTB,6
goto GUARDA_VALOR
incf ORDEN_TECLA,F

;=============================================================================
;La siguiente subrutina permite saber si se ha chequeado la última tecla. Para ello comprueba si
;el contenido del registro ORDEN_TECLA es igual al número de teclas del teclado.
;=============================================================================

TERMINA_COLUMNAS
movlw ULTIMA_TECLA ;Carga W con el valor 11 decimal
subwf ORDEN_TECLA,W ;(W) = (ORDEN_TECLA)-(ÚLTIMA_TECLA).
btfsc STATUS,C ;Si C=0, W es negativo, y ORDEN_TECLA<12, y no se leerá goto
goto TECLA_NO_PULSADA ;Si C=1, W es positivo o cero y se habrá completado el chequeo.
bsf STATUS,C ;Para chequear la siguiente fila habrá que poner C a 1
rlf PORTB,W ;La fila anterior se pone a 1 y la siguiente a 0.
goto CHEQUEA_COLUMNAS

TECLA_NO_PULSADA
bcf STATUS,C ;Posiciona C=0, indicando que no ha pulsado
goto FIN_TECLADO ;tecla alguna y sale.

GUARDA_VALOR
call ESPERA
movfw ORDEN_TECLA ;Guarda el orden de la tecla pulsada en (W) y sale.
bsf STATUS,C ;Como hay tecla pulsada, pone C=1.

FIN_TECLADO
return ;Retorna para leer la instrucción posterior a call ORDEN_TECLAS
 
apuf.... personalmente.... me parece demasiado rebuscado, yo ahora mentalmente creo que lo programaria mucho mas cortoy sencillo... aunque lo digo con la boca pequeña porque solo me lo estoy imaginando en la cabeza...
me llevara unos dias estudiarlo, para comprenderlo ... seria interesante que colgaras los diagramas a partir de los que has desarrollado el programa, para facilitar que el usuario que lo vea se situe con mas facilidad :)
 
es que esta es la libreria que nos ha facilitado el profesor para los que icieramos un proyecto que incluyera un teclado pero yo soloa go mirarla y no le voe ningun fayo no se...es que en la subrutina orden-caracter esta los codigos binarios que se guardan en el acumulador al pulsar cada tecla pero si guardo en un registro cualquiera de esos codigos no funciona al compararlos entre si, no se estoy muy liado, aver si alguien puede darme una solucion, gracias
 
Atrás
Arriba