#include <12F683.h>
#FUSES INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD,NOIESO,NOFCMEN
#use delay(internal=8MHZ) //Oscilador interno 8MHz
#use rs232(baud=4800,rcv=PIN_A3) //Velocidad limitada por receptor el receptor infrarrojo
#use fast_io(A)
#zero_ram
#priority timer0,int_ra
//************************************************************//
#define debug // Comment line out for no debug
#define Carga1 pin_A0
#define Carga2 pin_A1
#define Carga3 pin_A4
#define LED_status pin_A5
//************************************************************
char intensidad[5]={0,159,191,224,254}; //Equivale a 0%,25%,50%,75%,95%
char nivel_intensidad;
char desborde_T0;
char cruce_detectado;
char zero_HtoL;
char dato_recibido;
//************************************************************
void main(){
// setup_comparator(NC_NC_NC_NC); //Comparadores desactivados
// SETUP_ADC_PORTS(NO_ANALOGS);
output_a(0); //Precargar Latch de Salida
set_tris_a(0b001100); //Configurción de pines
//A0=Out-Carga 1
//A1=Out-Carga 2
//A2=In -Cruce por Cero
//A3_MCLR=In -Detector Infrarrojo
//A4=Out-Carga 3
//A5=Out-LED de Estado
SETUP_TIMER_0(T0_INTERNAL);
SETUP_TIMER_0(T0_DIV_128); //incremento cada 64us si Osc = 8MHz
ENABLE_INTERRUPTS(INT_EXT); //Initerrupcion externa por A2
EXT_INT_EDGE(H_TO_L); //flanco de bajada
ENABLE_INTERRUPTS(INT_RA3); //Interrupcion por cambio de estado usada para Recepción Serial
ENABLE_INTERRUPTS(GLOBAL); //Habilitar Interrupciones
//*********************************************************
//******* Programa Principal **********************//
//*********************************************************
while(1){
if(cruce_detectado==TRUE){
cruce_detectado=FALSE;
if(nivel_intensidad!=0){ //Si el nivel de intensidad es 0 entonces siempre apagado
SET_TIMER0(intensidad[nivel_intensidad]); //Se actualiza timer
ENABLE_INTERRUPTS(INT_TIMER0); //Habilitar Interrupción por desborde de Timer0
while(desborde_T0==false); //Esperar a que desborde el timer0
DISABLE_INTERRUPTS(INT_TIMER0); //Deshabilitar Interrupción por desborde de Timer0
desborde_T0=FALSE;
output_high(Carga1); //Disparo1= ON
delay_us(50);
}//if intensidad
output_low(Carga1); //Disparo1= OFF
}//if cruce detectado
sleep(); //
}//end_while
}//end_main
//**********************************************************
//****** Interrupciones *******************************//
//**********************************************************
#int_ext
void z_cross(){
if(zero_HtoL==TRUE){
EXT_INT_EDGE(L_TO_H); //por flanco de subida
zero_HtoL=FALSE;
}//if
else{
EXT_INT_EDGE(H_TO_L); //por flanco de bajada
zero_HtoL=TRUE;
}//else
cruce_detectado=TRUE;
#ifdef DEBUG
output_toggle(LED_status); //Solo para pruebas
#endif
}//int cruce por cero
//************************************************************
#int_timer0
void overflow_T0(){
desborde_T0=TRUE; //Ocurrio desborde de timer0
}//int desborde timer0
//************************************************************
#INT_RA
void recepcion(){ //Interrupcion por cambio de estado en pines
if(input(PIN_A3)==0){ // Bit de inicio ??? pin A3 es 0 ?
dato_recibido
=getc(); //Recibir dato nivel_intensidad=dato_recibido-0x30; // Se resta 0x30 para pasar a decimal
}//if bit de inicio
} //int_ra3 recepcion serial
//************************************************************