Aburrido en el trabajo y para ayudar a un paisano argentino me puse a hacer que funcionara
Acá te dejo el programa. Tiene varias variaciones respecto al tuyo, sobre todo en las entradas y salidas. Después los comparás y te fijás donde estan las "7 diferencias"
También me tomé el atrevimiento de hacer parpadear el led mientras el temporizador está activo , y al transcurrir el tiempo se enciende fijo y activa el relay.
Si no te gusta, entonces simplemente borrá la subrutina que está entre las lineas punteadas -------------- y reactiva "; bcf PORTB,2 ;prendo led (indicador de funcionamiento)" quitándole la ";"
Otra cosa, usá cristal de 4mhz y prestá atención a los cambios del circuito ya que no uso el PORTA , los condensadores del xtal son de 15p o 22p y tampoco uso el RB7 sino que lo llevo directamente a masa. Tampoco utilizo las weak pullups porque tienen mala fama
.
Lo he simulado y funciona a la perfección , aunque no me he quedado 20 minutos esperando al resultado, lo he probado con menos temporización.
He querido subirte el archivo .dsn del proteus pero no me deja... bah, te adjunto circuito.
list p=16f84a
#include p16f84a.inc
;configuramos caracteristicas del pic
__config _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
cuenta17seg EQU 0x0c
cuenta20min EQU 0x0d
PDel0 equ 0x0E
PDel1 equ 0x0F
FLAG equ 0x10
ORG 0
goto inicio
ORG 5
inicio
bsf STATUS,RP0
movlw b'00000001' ;RB0 como ENTRADA el resto como salidas
movwf TRISB
movlw b'11010111' ;deshabilita la opcion de weak up pull-up & timer0 256 preescala
movwf OPTION_REG
bcf STATUS,RP0
bcf PORTB,1 ;arranco con el rele apagado
bsf PORTB,2 ; led apagado
;********************************
;* bucle de lectura de teclado *
;********************************
bucle
btfsc PORTB,0 ;se testea RB0 para comprobar S1
goto bucle
call retardo ;retardo antirrebotes
call timer20min_S1 ;correspondiente a S1
goto bucle
;********************************************************
;* Timer de 20 minutos indicando tecla apretada y buzzer*
;********************************************************
timer20min_S1
; bcf PORTB,2 ;prendo led (indicador de funcionamiento)
movlw .255 ;cargo variables
movwf cuenta17seg
movlw .72
movwf cuenta20min
; Con cristal de 4mhz el TMR0 incrementa (con este setting) cada 65ms
lazo1
movlw .1
movwf TMR0
bcf INTCON,T0IF
loop
btfss INTCON,T0IF
goto loop
;-----------------------------------------------------------------------------------------------------------
;He incluido esta rutina para hacer parpadear el LED cuando se ha activado el timer, si lo ves innecesario
; simplemente borrala. AL finalizar el retardo y activar el relé, el led enciende fijo.
btfss FLAG,0
goto ledon
goto ledoff
ledon bcf PORTB,2
bsf FLAG,0
goto continua
ledoff bsf PORTB,2
bcf FLAG,0
goto continua
;-----------------------------------------------------------------------------------------------------------
continua
decfsz cuenta17seg,1
goto lazo1
;En este punto han transcurrido 16,65 segundos (65ms * 255 = 16,6 segundos)
movlw .255 ;recargo variables
movwf cuenta17seg
decfsz cuenta20min,1
goto lazo1
;En este punto han transcurrido 19,92 minutos
;16,65 * 72 = 1198,8 segundos (19,92 minutos)
bsf PORTB,1 ;prendo relé
bcf PORTB,2 ;prendo led fijo
return
;Retardo 40ms
retardo movlw .93 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .71 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
end
Un abrazo y vamos ARGENTINA!!