/************************************************
*
* main.c
*
*************************************************/
#include "main.h"
// Constantes
const int8 nTimer1_for_1_second=76;
// Variables en RAM
int8 nTimer1Overflow; // Contador de Interrupciones
int8 nSECS_for_Event_1; // Contador Segundos para Evento 1
int1 flag_for_Event_1; // Flag para detectar evento 1
int8 nTOFS_for_Event_2; // Contador Interrupciones para Evento 2
int1 flag_for_Event_2; // Flag para detectar evento 2
#int_TIMER1
void TIMER1_isr(void)
{
////////////////////////////////////////////////////////////////////////////////////////////////
// Cómputo de segundos completos (13,1072 milisegundos * _nTimer1_for_1_second = 996,1472 milisegundos)
// Todo lo que se controla dentro de este bloque sólo se computa por segundos completos.
////////////////////////////////////////////////////////////////////////////////////////////////
if(++nTimer1Overflow==nTimer1_for_1_second){
// Control de Evento Número 1
if(nSECS_for_Event_1!=0){ // si hay algo que contar ...
if(--nSECS_for_Event_1==0){ // Descuento un segundo y si he terminado ...
flag_for_Event_1=1; // Activo el flag de notificación del Evento 1.
}
}
// Restauro contador de interrupciones para cómputo de segundos completos
nTimer1Overflow=0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Cómputo de periodos de tiempo individualizados en NTOFS.
// Dentro de este bloque se computan periodos de n x 13,1072 ms.
////////////////////////////////////////////////////////////////////////////////////////////////
// Control de Evento Número 2
if(nTOFS_for_Event_2!=0){
if(--nTOFS_for_Event_2==0){
flag_for_Event_2=1;
}
}
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
//setup_timer_1(T1_DISABLED);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
set_tris_b(0x02);
set_tris_c(0x00);
// Pongo a cero todas las variables
nTimer1Overflow=0;
nSECS_for_Event_1=0;
flag_for_Event_1=0;
// Habilito las interrupciones
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
output_low(PIN_B7);
// Bucle infinito ...
do{
/////////////////////////////////////////////////////////////////////////////////////////////
// Detecto la pulsación del botón (con antirrebote incluido) y pongo en marcha
// el led y el Disparador de eventos
/////////////////////////////////////////////////////////////////////////////////////////////
if(input(PIN_C1)){ // Si pulso el botón ...
delay_ms(125);
if(input(PIN_C1)){ // Si 125 ms después sigue pulsado el botón ...
delay_ms(125);
if(input(PIN_C1)){ // Si 250 ms después sigue pulsado el botón ...
output_high(PIN_B7); // Activo lo que deseo activar, o sea mi led
flag_for_Event_1=0; // Pongo a cero el flag (por si acaso)
nSECS_for_Event_1=3; // Cargo los segundos que deseo esperar
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Detecta fin del lapsus del Evento 1 y
// desactivo el relé
/////////////////////////////////////////////////////////////////////////////////////////////
if(flag_for_Event_1==1){ // Si ha transcurrido el lapsus ...
flag_for_Event_1 =0; // Desactivo la notificación que he recibido
output_low(PIN_B7); // y actúo en consecuencia, desactivo el led.
}
}while(true);
}