# Consulta de alarma con Pic 16f84



## aceki (May 6, 2007)

Gente, consulta estoy desarrolando una alarma, algo simple con un 16F84a, la cosa es la siguiente, uso el proteus 6 para simular el circuito, todo bien, le doy al primer pulsador (que es de armar/desarmar alarma), y el led 1 parpada en estado de armada, despues, preciono el pulsador 2, que simula el pulsador de cualquier puerta del auto, y perfecto preden, ahora bien mi problema radica en desarmarla, por que le doy al primer pulsador y se desarma, pero no se vuelta a armar otra ves que puede ser? aca les dejo el ASM que estoy asiendo...

LIST	p=16f84A

port_a  equ     0x05
port_b  equ     0x06
trisb   equ     0x06
trisa   equ     0x05
estado  equ     0x03 
banco   equ 	5
retar   equ     0x11

org 0

BSF estado,banco
MOVLW B'11111'
MOVWF trisa
MOVLW B'00000000'
MOVWF trisb
BCF estado,banco
goto inicio

inicio 	clrw
		clrf port_a
		clrf port_b
		btfsc port_a,0
		call armar
		goto inicio

armar	clrw
		movwf port_b
		btfsc port_a,0
		call desarmar
		btfsc port_a,1
		call sonar
		movlw b'10000000'
		movwf port_b
		goto armar

desarmar	movlw b'000000000'
			movwf port_b
			clrf port_a
			clrw
			goto incio

sonar	movlw b'01000000'
		movwf port_b
		btfsc port_a,0
		call desarmar
		clrw 
		movwf port_b
		goto sonar
end


Muchas gracias a todos por la ayuda!!!


----------



## Francisco Valdez (May 7, 2007)

Hola aceki, te puedo ayudar con tu programa solo que no entendi exactamente lo que quieres que haga...El LED que dices que parpadea me supongo que lo tienes en el bit 6 o 7 cierto??

Si me permites te puedo hacer algunas sugerencias...

1. Estas utilizando llamadas a subrutinas con la instrucción CALL, y haces saltos a otras subrutinas con el GOTO o regresas al inicio de la misma, no estas regresando con la instrucción RETURN, no usas una secuencia correcta en el proceso del programa.

2. Estas declarando el puerto A todo como entrada y solo utilizas el bit 0 y 1, te recomiendo solo declarar b'00011' estas como entradas y el resto como salidas.

3. Incluye una instrucción mas al inicio de las subrutinas armar y desarmar como te lo escribo a continuación esto para que evites el rebote del conmutador.

BTFSC PORTA,0 
GOTO $-1

4. En la subrutina de armar tu primera instrucción es un clrw, y luego cargas a B lo que tiene w....
Al final de esta, cargas con un 1 el bit 7 del puerto B, e inmediatamente despues regresas al inicio de la subrutina y lo apagas, esto no te da percepción de algo en el LED....

Espero haberte ayudado y si tienes algun comentario hazmelo saber por favor..

Saludos


----------



## aceki (May 7, 2007)

MUCHAS GRACIAS ME SALVASTE LA VIDA, ahora un pregunta, que hace esa sentencia 

BTFSC porta,1
goto $-1

se que el btfsc lee el bit 1 del puerto a, y lo salta si es cero, pero ese goto a donde va?,


Nuevamente muchas gracias!!!


----------



## Francisco Valdez (May 7, 2007)

El goto es la instrucción de salto el $-1 le dice hacia donde, en este caso se regresa una instrucción... Lo que hace es que en el contador del programa le resta 1 y la siguiente instrucción que ejecuta es la anterior.....

Saludos


----------



## aceki (May 7, 2007)

Fransisco, muchas gracias, te molesto, o al que sepa, tengo que hacer que cuando activo algo, espere 15 segundo y despues continue con las rutinas, como hago?


----------



## Francisco Valdez (May 7, 2007)

Crea una subrutina de retardo ya sea que uses el TMR0 o una subrutina simple con decrementos

retardo movlw 0xFF
            movwf UNO
espera  movlw 0xFF
            movwf DOS
            decfsz UNO,f
            goto $-1
            decfsz DOS,f
            goto espera

Saludos


----------



## aceki (May 7, 2007)

Fransico, sabes que es lo mismo que le ponga esa secuencia de retardo que la deje sin ella, mi idea es cuando apretas el boton de armado, espere 15 segundo, pero agrego tu secuencia y no, no espera nda tarda lo mismo, que puede ser, por ahi estoy ubicando mal la secuencia.


----------



## Francisco Valdez (May 8, 2007)

Esa subrtina te hace mas o menos 65 milisegundos, si le pones otro decremento de 0xFF te va a decrementar mas o menos 16 segundos...

Si pudieras pasarme tu programa en formato .txt te lo agradecería

Saludos


----------



## aceki (May 8, 2007)

aca te dejo el .asm fijate que estoy haciendo mal, muchas gracias!!!


----------



## Francisco Valdez (May 8, 2007)

Si me permites hacerte algunas observaciones en cuanto al programa que me enviaste.

1. Estas declarando todo el puerto A como entradas, fisicamente estas conectando los pins del micro que no usas
a tierra o Vcc?
2. No se requieren las dos últimas instrucciones para poner el bit 2 del puerto B en 1, en la rutina de inicio.
3. En la subrutina destello en el último decremento primero va la instrucción goto espera y luego al ultimo el return. Igual y de aquí viene el problema de tiempo que tienes...
4. En la subrutina desarmar no requieres las instrucciones para poner en 1 el bit 2 del puerto B dado que en
la rutina de inicio es lo primero que haces.
5. La subrutina armado no la llamas ni una vez...

Saludos


----------



## aceki (May 8, 2007)

1. Ya voy a poner los pines del puerto A en salidas, los tengo conectado a Vcc (el de activacion que es el bit 1 lo tengo puesto con un pulsador, que activa un rele que le da Vcc al bit 1)

Voy a probar con las cosas que me dijiste que corrijas, todo lo estoy probando con proteus 6, espero no tener ningun problema con ese soft

Muchas gracias por tu ayuda!!!


----------



## Francisco Valdez (May 8, 2007)

Por nada, en lo que te pueda ayudar con gusto


----------



## aceki (May 8, 2007)

Francisco, en que lugar podrias vos la llamada a Armado?


----------



## Francisco Valdez (May 8, 2007)

Según vi en tu programa no requieres esta subrutina dado que ya tienes completo el programa y utilizas la subrutina de destello como retardo y esto es correcto, solo hazle el cambio del return, y si quieres incrementa el valor de las variables, asi como te comentaba en uno de los mensajes anteriores el calculo del tiempo si tienes un cristal de 4Mhz.

Lo que estabas haciendo con: 
decfsz UNO,f
goto $-1
decfsz DOS,f
return
goto espera

decrementas UNO, cuando terminas decremantas uno la variable DOS y te sales de la subrutina, habiendo pasado solo 255 microsegundos aprox... es por eso que no ves la diferencia en tenerlo y no tenerlo....


----------



## aceki (May 9, 2007)

Francisco muchas gracias por tu ayuda, pero igual no pude hacer que tarde 15 s en encender, para solucinar eso, encontre unos modulos RF para armar/desarmar.

Para la persona que me pidio el diagrama aca se los dejo:



Tambien dejo el ASM (que esta renomabrado como Alarma.txt, para que jueguen un poco)


----------



## Francisco Valdez (May 9, 2007)

ahhh entonces quieres que el retardo lo haga al inicio de la rutina de inicio o cuando????


----------



## aceki (May 9, 2007)

La idea es que cuando vos precionas el boton de armado (bit 0 del puerto A), espere 15 segundo. Si no como hago para salir de auto, sin que suene la alarma, medio que se me complica... Muchas gracias...


----------



## Francisco Valdez (May 9, 2007)

Puedes poner una subrutina de retardo antes de activar el bit 1 del PTO B en la subrutina sonar, solo agregale otro decremento mas

RETARDO movlw 0xFF
movwf TRES
WAIT movlw 0xFF
movwf DOS
movlw 0xFF
ESPERA movwf UNO
decfsz UNO,f
goto $-1
decfsz DOS,f
goto ESPERA
decfsz TRES,f
goto WAIT
return

Solo ajusta los valores de las variables a que te den los 15 segundos...


----------



## aceki (May 9, 2007)

No, me rindo, no espera nda, puse tu rutina y solo cambia unos segundo, nimporta si le fot 0xFFFFFFFF a cualquier variable, muchas gracias igual por tu ayuda.


----------



## Francisco Valdez (May 9, 2007)

voy de acuerdo contigo pero si la pusiste como esta en el programa que posteaste, no te va a dar mas tiempo, por el RETURN esta mal ubicado, no te rindas asi es esto...

Copia la rutina que te puse antes y sustituyela por la de destello


----------



## aceki (May 9, 2007)

ya sustitui tu rutina retardo por la mia destello, ahora bien, estoy viendo la tuya y dice esto... 


RETARDO movlw 0xFF
movwf TRES
WAIT movlw 0xFF
movwf DOS
movlw 0xFF
ESPERA movwf UNO 
decfsz UNO,f
goto $-1
decfsz DOS,f
goto ESPERA
decfsz TRES,f
goto WAIT
return 

La etiqueta Espera, no deberia en el decremento de UNO?, por que si no cada vez que vas a Espera se vuelve a cargar el contenido de W, otra casa, para que se va al wait de vuelta, no daria un bucle infinito asi? estoy confundido!! jeje


----------



## Francisco Valdez (May 9, 2007)

Tienes razón, cometi un error ahi, la etiqueta espera va en la isntruccion anterior a movwf UNO, esto funciona de esta manera:

1. al entrar a la subrutina cargas las tres variables con 0xFF,
2. Se decrementa UNO, hasta que se vuelve cero, salta y se decrementa en uno DOS y saltas a espera, vuelves a cargar UNO con 0xFF
3. Se repite el paso anterior hasta que se DOS llega a cero y salta para decrementar TRES, se decrementa TRES en uno y saltas a la etiqueta WAIT, ahi se carga DOS con 0xFF, se carga UNO con 0xFF y vuelve al paso 2,
4. Esto lo hace hasta que TRES llega a cero, salta y sale de la subrutina RETURN...

Espero haber sido claro, ojala que ahora si te funcione... hazlo de esta manera y si tienes dudas preguntame...

RETARDO movlw 0xFF 
movwf TRES 
WAIT movlw 0xFF 
movwf DOS 
ESPERA movlw 0xFF 
movwf UNO 
decfsz UNO,f 
goto $-1 
decfsz DOS,f 
goto ESPERA 
decfsz TRES,f 
goto WAIT 
return


----------



## aceki (May 9, 2007)

RETARDO movlw 0xFF
movwf TRES
WAIT movlw 0xFF
movwf DOS
ESPERA movlw 0xFF
movwf UNO
decfsz UNO,f
goto $-1
decfsz DOS,f
goto ESPERA
decfsz TRES,f
goto WAIT
return

Haber, yo pongo un CALL RETARDO, bien, lo que hace es cargar 0xFF en tres, luego en dos, luego en uno, decremente uno, hace ese goto $-1 (que todabia no tengo muy claro para que es), decrementa dos, si es 0 vuelve a espera, si es 1, decrementa tres, y vuelvo obiamente retorna, por que nunca va a decrementar de una sola pasada tres, entoces salta la secuencia de WAIT y va directo a return...

Capas que estoy entendiendo mal... es muy mu posible.


----------



## Francisco Valdez (May 9, 2007)

Haber, yo pongo un CALL RETARDO, bien, lo que hace es cargar 0xFF en tres, luego en dos, luego en uno, decremente uno, hace ese goto $-1 (que todabia no tengo muy claro para que es), decrementa dos, si es 0 vuelve a espera, si es 1, decrementa tres, y vuelvo obiamente retorna, por que nunca va a decrementar de una sola pasada tres, entoces salta la secuencia de WAIT y va directo a return... 

Primero el goto $-1 simplemente salta a la instrucción anterior, la explicación larga sería que el $-1 le resta uno al contador, hay un contador del programa donde cada instrucción tiene un numero consecutivo el contador es el PC, si en el momento que se ejecuta goto $-1 el PC es igual a 10 la siguiente instruccion que realiza es la que se encuentra en el lugar PC=9. 

Siguiendo el punto, nunca se va a decrementar TRES de una sola pasada, es por eso que la instrucción va así

decfsz TRES,f
goto WAIT
RETURN

Se decrementa TRES en uno, y luego saltas a WAIT para cargar otra vez UNO y DOS porque para llegues a decrementar a TRES, UNO y DOS ya llegaron a cero. Cuando TRES llega a cero, la instruccion de goto WAIT ya no se ejecuta, se salta, y se ejecuta RETURN, con esto sales de la subrutina,´para esto ya transcurrio mucho tiempo.

Una pregunta, en tu programa ya cambiaste de lugar el goto WAIT y el RETURN???? Debe estar escrito asi como te lo puse arriba.

Me dices como vas!!!!!!


----------



## aceki (May 9, 2007)

Si lo puse como vos decis, pero no, apreto el boton el el proteus, y la alarma nunca se activa, por ahi me estoy mandando algun lio yo, pero es raro... es como que nuca saliera del ratado...

te paso el programa completo:


LIST	p=16f84A

port_a  equ     0x05
port_b  equ     0x06
trisb   equ     0x06
trisa   equ     0x05
estado  equ     0x03 
banco   equ 	5
UNO		equ		0x12
DOS		equ		0x12
TRE		equ   	0x14

BSF estado,banco
MOVLW B'00011'
MOVWF trisa
MOVLW B'00000000'
MOVWF trisb
BCF estado,banco

clrf port_a
clrf port_b

inicio	movlw b'00000100'
		movwf port_b
		btfsc port_a,0
		goto armar
		goto inicio

armar	     BTFSC port_a,0
		GOTO $-1
		movlw b'00000001'
		movwf port_b
		call RETARDO
		btfsc port_a,1
		goto sonar
		btfsc port_a,0
		goto desarmar
		movlw b'00000000'
		movwf port_b
		goto armar


desarmar	BTFSC port_a,0
		      GOTO $-1 
		      goto inicio

sonar	     clrf port_a
		clrf port_b
		movlw b'00000010'
		movwf port_b
		movlw b'00000000'
		movwf port_b
		btfsc port_a,0
		goto desarmar
		goto sonar

RETARDO	 movlw 0xFF
		movwf TRE
WAIT 	    movlw 0xFF
		movwf DOS
ESPERA 	   movlw 0xFF
		movwf UNO
		decfsz UNO,f
		goto $-1
		decfsz DOS,f
		goto ESPERA
		decfsz TRE,f
		goto WAIT
return

end


----------



## Francisco Valdez (May 9, 2007)

intenta bajando el valor de la variable TRES, empieza con valores bajos como 0x05 o menos para que descartes que sea por exceso de tiempo....

Saludos


----------



## aceki (May 9, 2007)

No, parpadea muy rapido, o sea preciono el boton, y se activa al toque.


----------



## Francisco Valdez (May 9, 2007)

Entonces por ahi va ve subiendo el valor de TRES hasta que tengas el tiempo que deseas...


----------



## aceki (May 9, 2007)

Nop, por mas que le ponga 0xFFFFFFFF, no me da ni 5 de bola, al toque se arma.


----------



## Francisco Valdez (May 10, 2007)

Pasame el programa como lo tienes ahorita....

Saludos


----------



## aceki (May 10, 2007)

LIST	p=16f84A

port_a  equ     0x05
port_b  equ     0x06
trisb   equ     0x06
trisa   equ     0x05
estado  equ     0x03 
banco   equ 	5
UNO		equ		0x12
DOS		equ		0x12
TRE		equ   	0x14

BSF estado,banco
MOVLW B'00011'
MOVWF trisa
MOVLW B'00000000'
MOVWF trisb
BCF estado,banco

clrf port_a
clrf port_b

inicio	movlw b'00000100'
		movwf port_b
		btfsc port_a,0
		goto armar
		goto inicio

armar	BTFSC port_a,0
		GOTO $-1
		call RETARDO
		movlw b'00000001'
		movwf port_b
		btfsc port_a,1
		goto sonar
		btfsc port_a,0
		goto desarmar
		movlw b'00000000'
		movwf port_b
		goto armar


desarmar	BTFSC port_a,0
			GOTO $-1 
			goto inicio

sonar	clrf port_a
		clrf port_b
		movlw b'00000010'
		movwf port_b
		movlw b'00000000'
		movwf port_b
		btfsc port_a,0
		goto desarmar
		goto sonar

RETARDO	movlw 0x9f
		movwf TRE
WAIT 	movlw 0x9f
		movwf DOS
ESPERA 	movlw 0x9f
		movwf UNO
		decfsz UNO,f
		goto $-1
		decfsz DOS,f
		goto ESPERA
		decfsz TRE,f
		goto WAIT


----------



## Francisco Valdez (May 10, 2007)

Lo unico que veo en el programa es que te falta el return al final de la rutina de RETARDO y el end, al final del programa

Fuera de eso debe hacerte el retardo...


----------



## aceki (May 10, 2007)

si no se por que no apareci pero estan, pero no arranca, le doy al pulsador y no, se queda sin armarce la alarma


----------



## aceki (May 10, 2007)

a por cierto, si descarto el CALL RETARDO, la alarma comple con lo que pido, pero si le incluyo el CALL RETARDO, no, le das al boton y nunca se arma.


----------



## Francisco Valdez (May 10, 2007)

La rutina debe estarse cumpliendo porque no veo algo donde se te quede ciclado el micro, dices que si le pones la rutina con el retardo nunca se cumple, cuanto tiempo te estas esperando?
Y si le bajas los valores de TRE que hace???

Prueba tambien quitando el call y mandalo a la subrutina con goto, y en la subrutina retardo en lugar del return ponle un goto para que te regreses a la rutina...


----------



## aceki (May 10, 2007)

No, no me anda, en fin, me rindo, igual ya consegui los modulos RF para hacer eso.


----------



## Francisco Valdez (May 10, 2007)

que raro que no te funcione debe ser otra cosa, si ya cambiaste las instrucciones de la rutina!!!, en fin

No te desanimes asi son las cosas en esto, ha habido programas en que he estado dias enteros hasta que me funcionan...

Estas cosas jalan... nomas hay que decirles que es lo que hagan....

Suerte


----------



## rocioArriagada (Jul 5, 2010)

hola queria preguntar sobre la misma alarma,  como se puede hacer una secuencia, para que el pic pueda diferenciar que es una clave... Para hacerlo con pulsadores por ejemplo se pulsan 132, y es correcta  y deja de sonar, si se equivoca sigue sonando...  si me pueden ayudar  gracias..


----------

