Consulta de alarma con Pic 16f84

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
 
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
 
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.
 
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!!!!!!
 
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
 
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
 
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.
 
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...
 
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
 
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..
 
Atrás
Arriba