Consulta de alarma con Pic 16f84

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!!!
 
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
 
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!!!
 
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
 
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?
 
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
 
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.
 
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
 
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
 
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!!!
 
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....
 
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)
 

Adjuntos

  • alarma_184.bmp
    87.6 KB · Visitas: 341
  • alarma_181.txt
    1.1 KB · Visitas: 170
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...
 
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...
 
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.
 
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
 
Atrás
Arriba