Criticas sobre primer proyecto

hola saludos a toda la comunidad. Les cuento, soy nuevo en este foro y en la programacion de microcontroladores tambies (puedo decir que o que se lo he adquirido leyendo muchas veces infrmacion en este foro) nunca he tenido un guia que me oriente al respecto solo sigo lo que mi ogica me dicta, es por esto que quiero compartir con ustedes m primer proyecto desarrollado por mi. Se trata de una alarma para automovil con un teclado 4x4 y un lcd (creo que en este foro las alrmas ya no son nada original y la mia creo tampoco lo es). Bueno quisiera pedirles criticas al respecto del diseño del asm y todo lo que pueda servir para mejorar en un proximo proyecto. La idea en u futuro es incorporar un codogo tal que permita llamar a un celular pero por el momento mis pocos conocimientos (soy totalmente nuevo en esto) he logrado armar esto.

Esperando muchisimas criticas (ojala con respeto igual me esforce harto) para mejorar como diseñador me despidoaca dejo los codigos asm y el diseño en isis

cualquier aporte es bien recibido
muchas gracias a toda la comunidad por su atencion:)

al parecer para muchos puede resultar aburrido descargar el archivo por lo tanto aqui escribo el asm

Código:
;se trata de una alarm apara automovil activada por un codigo ingresado por teclado
;la alarma cuando esta inactiva pasa al modo sleep hasta que se detecte que una tecla esta presionada
; si la puerta se abre y esta activada la alarma suena una sirena
;y muestra un mensaje de alerta
;para desactivarla pide un codigo el que esta guardado por programacion
;la tecla F funcioona como aceptar
;***********************************************************************************************************
include "p16f84a.inc"
__CONFIG _CP_OFF & _WDT_ON & _XT_OSC
;configuracion***********************************************
#DEFINE sirena PORTA,1 ;establece la sirena en RA1
#DEFINE led PORTA,3 ;establece el led de señalizacion on/off en RA3
#DEFINE puertas PORTA,4 ;establece la entrada de señal de puerta abierta
 
 
CBLOCK 0x0c ;aqui se guardan los datos o variables 
ENDC
 
ORG 0 
goto configuracion ;salta a configuracion para evitar el vector de reset
 
 
org 4 ;vector de reset
btfss STATUS,NOT_TO ;verifica si el reset fue a causa del watchdog
goto alarma ;si asi fue salta a alarma
goto interrupcion ;sino sigue interrupcion normalmente
 
include "Teclado.inc" ; incluye libreria de teclado
 
Mensajes ; se establecen los mensajes
addwf PCL,F
Mensajeclave
DT "INGRESE CLAVE",0X00
Mensajeclaveacep
DT "CLAVE ACEPTADA",0x00
Mensajeclaverech
DT "CLAVE RECHAZADA",0x00
Mensajealarmact
DT "ALARM ENCENDIDA",0x00
Mensajealarmdesact
DT "ALARM APAGADA",0x00
Mensajeactivar
DT " ENCENDER??",0x00
Mensajedesactivar
DT " APAGAR??",0x00
Mensajetecladobloq
DT " TECLADO BLOQ", 0X00
Mensajesirena
DT "ALARMA!!!!!!!!!",0x00
FinMensajes
 
 
;***************************************************************************************************
 
configuracion ;configuracion de puertos e inicializacion d componentes
 
bsf STATUS,RP0 ;acceso al banco1
bcf led ;establece led como salida (RA3)
bcf sirena ;establece sirena com salida (RA1)
movlw b'00001111' ;carga en option las opciones paara conseguir elmayor tiempo
movwf OPTION_REG; en el watchdog
bcf STATUS,RP0 ;acceso al banco0
call LCD_Inicializa ;rutina que configura el lcd
call Teclado_Inicializa ;rutina que configura el teclado
 
btfss STATUS,NOT_TO ;revisa si la interrupcion fue a causa del wdt
goto alarma ;va a alarma
movlw b'10001000' ;prepara para que se puedan ocupar las interrupciones
movwf INTCON
 
;programa******************************************************************************************
 
 
principal ;programa principal
 
principal0
 
clrwdt ;borra la cuenta del wdt pra evitar desbordamiento
sleep ;pasa a modo bajo consumo
goto principal0 ;vuelve a la rutina principal
 
;interrupciones******************************************************************************
 
interrupcion
 
 
CBLOCK ;definicion de variables
suma ;se almacena la suma de los dgtos ingresados
contador; cuenta los ingresos fallidos de contraseña
intentos
ENDC
 
interrupcion0 
 
clrf suma ;borra suma
clrf contador;borra contador
clrwdt
 
 
encender
 
bcf led ;apaga el led
movlw Mensajealarmdesact ; se visualiza en lcd alarma apagada
call LCD_Mensaje; rutina qu provoca que se visualice en el lcd el conetenido de w 
call LCD_Linea2 ;se posiciona cursor en linea dos
movlw Mensajeactivar; se visualiza encender???
call LCD_Mensaje
clrwdt
call Retardo; pequeño retardo de 2s
 
 
 
aceptar ; ruina para aceptar encender o apagar la alrma
 
clrwdt
call Teclado_LeeHex; usca tecla pusada la devuelve en w
sublw 0x0F; verifica si la teca es la F(aceptar)
btfss STATUS,Z;revisa flag z si es f salta 
goto aceptar; si no es f se devuelve hasta que sea apretada la f
clrwdt
call Teclado_EsperaDejePulsar ;evita que la tecla siga pulsada
call LCD_Borra ;borra pantalla del lcd
clrf intentos ;borra memoria intentos
clrwdt
 
lecturaclave
clrf contador
clrf suma 
clrwdt
 
lecturaclave0
call LCD_Borra
movlw Mensajeclave ;se visualiza ingrse clave
call LCD_Mensaje
call LCD_Linea2
 
 
lecturaclave1
clrwdt 
call Retardo_50ms
call Teclado_LeeHex; se devuelve el digito pulsado
btfss STATUS,C;comprueba si se pulso un digito
goto lecturaclave1;si no se pulso vuelve a revisar
addwf suma,F ;suma el contenido de w con el contenido de suma y lo guarda en este ultimo
call Teclado_EsperaDejePulsar
movlw "*" ;se visualiza un asterisco
call LCD_Caracter
call LCD_CursorIncr ;se muve un espacio
clrwdt
incf contador,f ;incrementa para setiar la cantdad de digitos a ingresar
movlw d'4' ;establece cantidad de digitos clave
subwf contador,w ;revisa si llego al limite de digitos de la clave
btfss STATUS,Z 
goto lecturaclave1 ;si no se devuelve y se sigue ingresando digitos
clrwdt
movfw suma ;revisa si se cumple la condicion de la clave es decir que los digitos sumen 24
sublw d'24' ;primera condicion clave
btfss STATUS,Z ;revisa si se cumple
goto claverechazada ;si no va a clave rechazada
 
 
claveaceptada
btfsc led ;revisa si esta encendida o no la alrma
goto apagar1 ;si es ta encendida va a apagar1
 
 
encender1
clrwdt
call LCD_Borra
movlw Mensajeclaveacep; se visualiza mensaje clave aceptada
call LCD_Mensaje
call LCD_Linea2
movlw Mensajealarmact;se visualiza alarma encendida
call LCD_Mensaje
clrf intentos
bsf led ;prende led señalizador
goto scaneo ;va a escaneo
 
apagar1
clrwdt
call LCD_Borra
movlw Mensajeclaveacep
call LCD_Mensaje
call LCD_Linea2
movlw Mensajealarmdesact ;visualiza alarm apagada
call LCD_Mensaje 
bcf led
bcf sirena ;apaga la sirena y el led
clrwdt
call Retardo
goto reset
 
claverechazada
clrwdt
call LCD_Borra
movlw Mensajeclaverech ;se visulaliza clave rechazada
call LCD_Mensaje
incf intentos,f ;incrementa intentos para controlar cantidad de ingresos fallidos
movlw d'3' ;establese cantidad max de 3 intentos
subwf intentos,w ;comprueba si hay tres intentos
clrwdt
call Retardo_2s
clrwdt
btfss STATUS,Z
goto lecturaclave;si no vuelve a intentar
 
tecladobloqueado
clrwdt
call LCD_Borra
movlw Mensajetecladobloq ;visualiza teclado bloqueado
call LCD_Mensaje
clrwdt
call Retardo_2s
clrwdt
bsf led ;enciende aarma y led
bsf sirena
goto desactivar ;va a rutina de desactivacion
 
 
 
 
 
apagar
 
desactivar
clrwdt
call LCD_Borra
movlw Mensajesirena ;visualiza mensaje alarma!!!!!!!!
call LCD_Mensaje
call LCD_Linea2
movlw Mensajedesactivar; viualiza desactivar?
call LCD_Mensaje
clrwdt
call Retardo_2s
clrwdt
goto aceptar ;vuelve a rutina aceptar
 
Retardo
clrwdt
call Retardo_2s
clrwdt
return
 
 
scaneo
call Retardo ;establece un retardo para permtir que se baje del auto
call Retardo ;una vez activada la alrma sin que esta se active
call Retardo
call Retardo
call Retardo
 
scaneo0
clrwdt
btfss puertas ;revisa si puertas abiertas
goto scaneo0 ;si no siue revisando
clrwdt
call Retardo
clrwdt
 
;lecturaclave ;este bloque ya esta comentado salvo algunasdiferencias señaladasy permite 
clrf contador ;ingrsar la clave para que no se detone la sirena
clrf suma
clrwdt
;lecturaclave0
call LCD_Borra
movlw Mensajeclave
call LCD_Mensaje
call LCD_Linea2
clrwdt 
 
 
lecturaclave11 
call Teclado_LeeHex
btfss STATUS,C
goto lecturaclave11
addwf suma,F
call Teclado_EsperaDejePulsar
movlw "*"
call LCD_Caracter
call LCD_CursorIncr 
 
incf contador,f
movfw suma ;otorga 2,8 seg mas para ingreesar el sgt digito correcto
sublw d'7'
btfss STATUS,Z
goto continuar
clrwdt
 
continuar
movfw suma; lo mismo anteriormente señalado
sublw d'9'
btfsc STATUS,Z
clrwdt
movfw suma
sublw d'15'
btfsc STATUS,Z
clrwdt
movlw d'4' ;establece cantidad de digitos clave
subwf contador,w
btfss STATUS,Z
goto lecturaclave11
 
;confirmacion clave
movfw suma
sublw d'24' ;primera condicion clave
btfss STATUS,Z
goto alarma
 
;claveaceptada
goto apagar1
 
alarma
clrwdt 
call LCD_Borra
bsf sirena ;activa la sirena
goto desactivar
 
reset
bcf led
bcf sirena
bcf INTCON,RBIF ;restblece flag
call LCD_Borra
goto configuracion
retfie
 
include "retardos.inc"
include "lcd_4bit.inc"
include "lcd_mens.inc"
 
END
 

Adjuntos

  • alarma auto.rar
    47.8 KB · Visitas: 25
  • 21321.gif
    21321.gif
    39.8 KB · Visitas: 45
Última edición por un moderador:
sammaael: Pues nuevo no lo eres... ya has hecho varias consultas al Foro.

Nos encantará ayudarte con tu nuevo proyecto pero necesitamos una imagen del circuito para asociar el programa con el hardware. Postea el circuito en formato Gif/jpg. Saludos
 
Gracias tecnogirl la verdad soy miembro de la comunidad hace menos de una semana pero he encontrado aqui un grupo muy bueno y valla que me ha gustado. Volviento al tema en el archivo adjunto esta el proyecto armado en isis donde lo simule y funcionaba(no puedo subir una imagen porque execde el tamañ max y no sse e ocurre de que otra forma postearlo). Los sensores en la puerta son microswitch usando sus contacto NC (puerta abierta 1 cerrada 0) el resto es una pantalla lcd Lm016l y un teclado 4x4 (uno mas pequeño ubiese servido pero este e uno que tengo por ahi), bueno respecto al codigo esta todo comentado para facilitar las cosas (de conocimento les sobra pero como a todos lo que les falta creo que es tiempo) asi que cualquir comentario desde la forma de escribir el codigo hasta su funcionamiento y hardware me sera muy util, es mi primer proyecto desarrollado por mi asi que quiero mejorar y comenzar a utilizar otros pic (creo que el 16f84 esta queando en el pasado) muchas gracias adios


P.D: si la bandera de chile es en forma de compartir el dolor de nuestro pueblo te lo agradezco las cosas aca estan dificiles gracias.
 
Como no todos usan Proteus y no pueden abrir el archivo ahí subí al post original una imágen del circuito...

Saludos.
 
muchisimas gracias vick por la ayuda la verdad es k no podia (o no sabia como subir la imagen) de nuevo gracias
ahora esero que puedan comentar con mas facilidad mi proyecto de verdad es importante para mi mejorar:apreton:
 
sammaael: Toma nota de lo siguiente:

1. Yo no usaria el display LCD. Si te fijas, el manejo del LCD ocupa casi el 50% del codigo. Ademas, es un componente muy costoso. Con leds y el buzzer puedes casi
que suples las funciones que hacias con la pantalla.

2. Elimina las siguientes lineas de codigo ya que no hacen nada.

CBLOCK 0x0C ;aqui se guardan los datos o variables
ENDC

Saludos.
 
gracias la verdd lo del lcd es pura practica queria incorporar lo que mas se me ocurriera de ahi ambien que utilice el watchdog muchas gracias por tu ayuda y tu tiempo contemplando aspectos generales y de diseño y sobretodo de programacion que te parece este proyecto (la verdad es que como tu dices es cierto, sobra el lcd solo es con fines didacticos)
 
1. Yo creo que el LCD esta bien usado, si usas displays de 7 segmentos te gastas casi lo mismo y necesitas más recursos del microcontrolador ya que necesitarías multiplexarlos y eso hace que el micro trabaje más, consuma más energía, y no puedes ponerlo en sleep.

2. No elimines el CBLOCK como indica tedcnogirl, por que si lo haces el programa ya no va a funcionar, les dejo de tarea que me digan por que no...

lamento no ayudar más pero por ahora no tengo mucho tiempo para analizar todo el código...

Saludos.
 
Vick: Te agradeceria me expliques por que no se puede eliminar el CBLOCK. En la simulacion con mpasm, esto no hizo nada.

Saludos.
Pista 1: Si observas, en el mismo código más adelante hay otro CBLOCK que no tiene dirección ¿por que no tiene dirección? ¿Si no tiene dirección que pasa? además en las librerías hay más CBLOCKs sin dirección... :confused:

Pista 2: Si quitas el primer CBLOCK e intentas ensamblar en MPLAB hay un mensaje... :confused:

¿Ahora si captas por que es necesario ese CBLOCK 0x0C... o no?

;)
 
Última edición:
Hola Vick. Voy a mirar con detalle esto. Claro que si no le pongo el valor de inicio a un CBLOCK, mpasm lo asigna automaticamente a 0. Creo que eso va a conveniencia del programador.

Gracias y Saludos.
 
Por ahí va el asunto...

Si el primer CBLOCK que encuentra el ensamblador no tiene dirección, entonces por defecto se asigna la dirección cero, así que si quitas el primer CBLOCK, al ensamblar el programa, el primer CBLOCK que encontrará el ensamblador no tiene dirección, por lo que al primer registro se le asignará la dirección 0x00, al segundo la 0x01... y así sucesivamente.

Y el programa no funciona, ya que esas primeras direcciones son de registros SFR, y como sabemos solo debes usar los registros del área GPR para tus datos, es por eso que aunque parezca que el primer CBLOCK no hace nada, si lo esta haciendo, simplemente define la dirección de inicio para los registros de usuario, de esa forma al encontrar los CBLOCKs sin dirección continuará desde la última en donde se quedó, en este caso desde la dirección 0x0C que define el primer CBLOCK, no importa que no defina ningún registro.

Espero haberme explicado...
 
sammaael: Toma nota de lo siguiente:

1. Yo no usaria el display LCD. Si te fijas, el manejo del LCD ocupa casi el 50% del codigo. Ademas, es un componente muy costoso. Con leds y el buzzer puedes casi
que suples las funciones que hacias con la pantalla.

2. Elimina las siguientes lineas de codigo ya que no hacen nada.

CBLOCK 0x0C ;aqui se guardan los datos o variables
ENDC

Saludos.

Con las aclaraciones pertinentes de Vick, el punto 2 de mi mensaje anterior quedará asi:

2. Cambia el comentario de:

Código:
CBLOCK 0x0c ;aqui se guardan los datos o variables
ENDC

por

Código:
CBLOCK 0x0c ; Asigna un valor inicial para los sucesivos CBLOCK en el programa.
ENDC ;  0x0C, es la primera direccion de memoria disponible para el usuario (GPR).
Asi queda mejor comentado esa parte del codigo.

Saludos
 
Última edición:
muchas gracias perdon por la tardanza en contestar pero tube unos cuantos problemas tecncos pero sin duda lograron despejar ciertas dudas ya que sabia que el uso de cblock es para asignar con mayor facilidad variables (bueno aveces no es tan facil) pero de todos modos muchas gracias por corregir mis errores espero algun dia poder aportar con un diseño realmente interesante

otra duda por motivos economicos como puedo usar este mismo codigo para un 16f628 ya que cuando trato de ensamblarlo para este pic me arroja una cantidad de errores que de ponerlos qui el comentario se volveria exageradamente grande
 
Última edición:
Atrás
Arriba