/********************************************************/
/* Proyecto regulaDOr de luces para belén                */
/********************************************************/
#include <12F683.h>
#FUSES NOWDT, HS, NOCPD, NOPROTECT, MCLR, PUT, BROWNOUT, IESO, NOFCMEN
#use delay(clock=20000000)
#use fast_io(A)

#define MaximoLuz 12
#define MinimoLuz 93 // Absoluto

#byte port_a = 5
#bit  TRIAC1 = port_a.0
#bit  TRIAC2 = port_a.1

/******************************************************/
/* Declaración de variables                           */
/******************************************************/
// Variable auxiliar
int cuenta;
int disparo = 1;
// Va contando nivel de disparo
int nivel = 0;

int periodoDia = MinimoLuz; //Empieza apagado
int periodoNoche = MaximoLuz; // Empieza encendido
// Diferencia de periodo entre cada paso
int paso = 2;
// Cuenta los segundos que pasan
int segundos = 0;

// Segundos entre cambio de ciclo
int cambio = 35;

// Variable para contar el tiempo transcurrido - Se incrementa en cada INTerrupción externa: 1/100 segundos
int16 tiempo = 0;

#INT_TIMER0
void disparo() // El timer cuenta 1 cada 51.2 us. Con 2 tics saltará cada 102.4us
{
	set_timer0 (254); // Salta cada 102.4us

	if(nivel == periodoDia)
		output_low(PIN_A0);
	if(nivel == periodoDia+5)
		output_high(PIN_A0);

	if(nivel == periodoNoche)
		output_low(PIN_A1);
	if(nivel == periodoNoche+5)
		output_high(PIN_A1);

	nivel++;
}

#INT_EXT
void EXT_isr()
{
	set_timer0 (255);

	nivel = 0;

	if (cuenta == 0)
	{
		ext_int_edge (H_TO_L); // La próxima interrupción será de bajada
	}
 	else
	{
		ext_int_edge (L_TO_H); // La próxima interrupción será de subida
 	}
	cuenta = !cuenta;

	tiempo++; // Cuenta 1 / 100 segundos más.

	if(tiempo == 100) // 1 segundo
     {
     	tiempo = 0;
     /*	if(periodoDia > MaximoLuz)
	     	periodoDia -= paso;
		else if(periodoDia < MaximoLuz)
			periodoDia = Maximoluz;*/

		segundos++;

		if(segundos > 0 && segundos <= cambio)
		{
			//periodoDia = MinimoLuz+((30-segundos)*paso);
  			periodoDia = periodoDia-paso;
			periodoNoche = periodoNoche+paso;
		}
		if(segundos == cambio+1)// && segundos <= 60)
		{
			periodoDia = MaximoLuz;
			periodoNoche = MinimoLuz;
		}
		if(segundos > 2*cambio && segundos <= 3*cambio)
		{
			periodoDia = periodoDia+paso;
			periodoNoche = periodoNoche-paso;
 		}
		if(segundos == 3*cambio+1)// && segundos < 120)
		{
               periodoDia = MinimoLuz;
               periodoNoche = MaximoLuz;
  		}

      	if(segundos == 4*cambio)
         		segundos = 0;
	}
}

void main()
{
	setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
 	enable_interrupts(INT_EXT);
	enable_interrupts(GLOBAL);
 	enable_interrupts(INT_TIMER0);

     set_tris_A(0b111100);

// Desactivamos las salidas
 	output_high(PIN_A0);
	output_high(PIN_A1);

//	periodoDia = MaximoLuz;

  	for(;;)
	{
	}
}

