¿Que tal algo asi?
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES CPD //Data EEPROM Code Protected
#FUSES PROTECT //Code protected from reads
#FUSES MCLR
#FUSES HS
#use delay(clock=4MHz)
#DEFINE LEDESTADO PIN_A1
#DEFINE ENCLAVO PIN_A0
#DEFINE BTN PIN_B0
const unsigned long setpoint = 24576;
int A=0;
int1 FBYN1_PRESS = 0;
#INT_TIMER1
void TIMER1_isr(void)
{
set_timer1(setpoint);
if(--A == 0){
disable_interrupts(INT_TIMER1);
OUTPUT_LOW(ENCLAVO);
OUTPUT_LOW(LEDESTADO);
}
}
void main()
{
SET_TRIS_A(0b00000);
OUTPUT_LOW(ENCLAVO);
OUTPUT_LOW(LEDESTADO);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_8);
SETUP_CCP1(CCP_OFF);
SETUP_COMPARATOR(NC_NC_NC_NC);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(!INPUT(BTN)){
OUTPUT_HIGH(ENCLAVO);
OUTPUT_HIGH(LEDESTADO);
A=2; // 20 segundos
SET_TIMER1(setpoint); //24576
enable_interrupts(INT_TIMER1);
while(!INPUT(BTN));
}
}
}
Los cambios que realice fueron los siguientes:
- Cambie el codigo de la interrupcion, unicamente cuando llega "A" a 0 es que apaga todo e incluso deshabilita la interrupcion, asi no se ejecuta mas.
- Los botones por ahora para probar (asi no entra muchas veces) le puse un while, pero basicamente carga los datos que son "A" que es el contador de veces que entra en la interrupcion y recarga el Timer1. Asi comenzar correctamente los segundos. Recien ahi habilita la interrupcion.
Observa que si se presiona de nuevo el boton estarias reiniciando esos 10s de la interrupcion, y los valores que obtendrias no serian los correctos.
Considero que uno de los problemas que tenias en tu codigo es que cuando presionas el boton no arrancas de 0 a contar, sino que si la interrupcion habia ocurrido hace 4s, vos lo activas y tenes esos 6s + las 2 interrupciones. Por lo tanto tenias esos 26s en ves de 20s. Obviamente este rango podia variar de 20s a 30s segun cuando tuvieras la suerte de apretar el boton.