Hola estoy haciendo un temporizador para controlar el encendido de 2 ventiladores usando el timer del 16f628a.La idea es que encienda y pare a intervalos de 15 min. Tengo problemas con el codigo ya que si habilito la interrupcion del tmr0 antes de cargar el valor del timer, el sistema arranca apagado a pesar de que habilito la salida de rb0 que controla los motores y el otro problema es que el tiempo de arranque y parada se hace aleatorio. Si cargo el timer antes de habilitar la interrupcion, el sistema parece que no entra nunca en el servicio de interrupcion y nunca para el motor. Hice una base de tiempo de 1 seg, cargando .239 a timer. Tengo un registro llamado Mtiempo que contiene la bandera para saber cuando llego a la cantidad de segundos que quiero y que se pone en 1. Para saber si llegue al valor de segundos lo comparo con un valor fijo en la rutina "comparar". este es el codigo que queda siempre encendido.
;_____________________________________________________________
;Programa para hacer un tiner para un aromatizador que controla
;unos ventiladores por medio de un transistor conectado a RB0
;Se activa y desactiva cada 15 min con 16f628a
;...
list p=16f628a
Mtiempo equ 26h; Registro de la bandera de tiempo
Ftiempo equ 00h;bandera de tiempo cumplido
Dato_A_L equ 20H
Dato_A_H equ 21h
Dato_B_L equ 22h
Dato_B_H equ 23h
Resultado_L equ 24h
Resultado_H equ 25h
org 00h
goto programa
org 04h
goto ActivaMotor
#include "p16f628a.inc"
#include "Sum16bit.inc"
Comparar
movf Resultado_H,w
sublw 00h
btfss STATUS,Z
goto seguir
movf Resultado_L,w
sublw 04h ;cantidad de segundos
btfss STATUS,Z
goto seguir
bsf Mtiempo,Ftiempo
seguir RETURN
ActivaMotor
bsf STATUS,RP1;BANCO 2
bcf STATUS,RP0
movlw .239
movwf TMR0 ;cargo el timer con 239 para que cuente 16 y se desborde
bcf STATUS,RP1;BANCO 0
bcf STATUS,RP0; Banco 0
bcf INTCON,2 ; limpio la bandera del timer
movf Resultado_L,w
movwf Dato_A_L;cargo dato A
movf Resultado_H,w
movwf Dato_A_H;cargo dato A
call suma_16_bits; sumo 1 al contador de segundos
call Comparar
btfss Mtiempo,Ftiempo
goto finserv
clrf Resultado_L
clrf Resultado_H
btfsc PORTB,0
goto gotoparar
bsf PORTB,0
goto finserv
gotoparar bcf PORTB,0
finserv bcf Mtiempo,Ftiempo
RETFIE
programa bsf STATUS,RP0;BANCO 1
movlw b'11111111'
movwf TRISA
movlw b'11111110'
movwf TRISB; RB0 como salida al transistor
bsf PCON,3
movlw b'00000101'
movwf OPTION_REG; pongo el prescaler en 64
clrf PIE1 ; Deshabilito las interrupciones que no uso
bcf STATUS,RP0;BANCO 0
bsf PORTB,0
movlw 00000111; deshabilito los comparadores
movwf CMCON
bsf STATUS,RP1;BANCO 2
bcf STATUS,RP0
movlw .239
movwf TMR0 ;cargo el timer con 239 para que cuente 16 y se desborde
bcf STATUS,RP0;BANCO 0
bcf STATUS,RP1
movlw b'10100000'
movwf INTCON; habilito las interrupciones
clrf Dato_A_L; borro los operandos de la suma
clrf Dato_A_H
clrf Dato_B_L
clrf Dato_B_H
bcf Mtiempo,Ftiempo; pongo bandera de tiempo en 0
incf Dato_B_L; cargo el dato con el 1 que voy a sumar
clrf Resultado_L
clrf Resultado_H
espera nop
goto espera
end