#include <12F675.h>
#FUSES WDT // No Watch Dog Timer
#FUSES INTRC_IO // >>> Oscilador interno, no CLKOUT
#FUSES PUT // Power Up Timer
#FUSES NOMCLR // Master Clear pin used for I/O
#FUSES BROWNOUT // Reset when brownout detected
#FUSES PROTECT // Code not protected from reading
#FUSES NOCPD // No EE protection
static int1 EstadoPrevio; //Para indicar el estado previo que tenia
#use delay(int=4000000,wdt) // Especifica al compilador que hace uso del OSC interno
void PWM(int8 x)
{
output_high(PIN_A0);
delay_us(x);
output_low(PIN_A0);
delay_us(256-x);
}
void Automatico()
{
int8 i; //Solo para variar el brillo
// Pregunto inicialmente si cambio el estado que tenia el switch. Ya que sino no me molesto en cambiar nada
if(EstadoPrevio != input_pin(PIN_A3))
{
//Actualizo
EstadoPrevio = input_pin(PIN_A3);
if(input_pin(PIN_A0)) //Para saber si esta encendido o no
{
// Esta encendido por lo cual debo apagarlo
for(i=255;i>0;i--)
{
//restart_wdt();
PWMsoft(i);
}
output_low(PIN_A0); // Lo dejo en apagado si o si
}
else
{
//Estaba apagado, por lo cual encendemos
for(i=0;i<256;i++)
{
//restart_wdt();
PWMsoft(i);
}
output_high(PIN_A0); // Lo dejo encedido al finalizar.
}
}
}
void main()
{
setup_wdt(WDT_1152MS);
setup_adc_ports(sAN1|VSS_VDD); //Todos digitales CAMBIAR!
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Para poder generar 200ms
setup_comparator(NC_NC); // Todo digital
output_low(PIN_A0);
EstadoPrevio = 0;
while(TRUE)
{
restart_wdt();
/*
* Primero que nada revisamos que sea manual, aunque considero que la seleccion de
* de manual o automatico deberia ser externo al micro. Es decir desactivando al micro.
*/
if(input_pin(PIN_A2))
{
EstadoPrevio = input_pin(PIN_A3);
output_bit(PIN_A0,EstadoPrevio); //En caso que sea manual solo responde a la puerta, segun como este el switch de la puerta actua
}
else
{
// En caso que se seleccione en automatico, es decir actua el PWM
Automatico();
}
}
}