unsigned char FlagReg; //declara la variable FlagReg como indefinida
sbit CRUCE0 at FlagReg.B0; //utiliza la vaiable CRUCE0 para el registro de
bandera (registro de la seal del cruce de cero) en el puerto B0 unsigned int i=0; //declara la variable i como entera indefinida bit estado; //variable para detectar el estado del boton int angulo=0; //declaracin de variables float R=0, E=0;
void interrupt(){ //DETECCIN DEL CRUCE DE CERO
if (INTCON.INT0IF) //la bandera INTF se activa y por lo tanto se produce la interrpcion externa { CRUCE0 = 1; //almacena el dato en la variable CRUCE0 para usarla como condicional para el disparo del triac INTCON.INT0IF = 0; //recetea la bandera de interrupcin para volverla a utilizar en el siguiente cruce de cero }
void main() //CONFIGURACIN DE PUERTOS Y DE INTERRUPCIN COMO SEAL
EXTERNA { ANSELB=0X00; //configura las E/S del puerto B como digitales ANSELD=0X00; //configura las E/S del puerto D como digitales PORTB = 0X00; //declara como I/O el puerto B TRISB = 0xff; //declara el puerto B0 como entrada para la interrucin PORTD = 0; //declara puerto D en bajo TRISD = 0; //configura el puerto D como salida INTCON2.INTEDG0=0; //declara la interrupcin sobre el flanco descendente INTCON.INT0IF = 0; //borra el dato de la bandera de interrupcin INTCON.INT0IE = 1; //habilita la interrupcin externa y permite que ocurra INTCON.GIE = 1; //habilita las interrupciones estado=0; //estado del boton en bajo
while (1) { if (Button(&PORTB, 1, 1, 1)) //DETECCIN DE UN 1 LOGICO {
estado = 1; //variable para indicar que se
presiono el boton (estado del boton) } if (PORTB.B1=0 && estado ) //detecta la transiscion de 1 a 0 y el estado bajo del puerto B1 { estado = 0; delay_ms(20); //regresa a 0 la variable del estado del boton i = i + 1; //suma 1 cada ves que se preiona el boton if ( i >= 11) //si el numero de pulsos llega a 11, la variable i se iguala a 0 { i=0; } } if (CRUCE0 && i>0) //DISPARO DEL TRIAC SI EL CRUCE DE 0 OCURRE { angulo=(180-(18*i)); //calculo del angulo de disparo en base al numero de pulsos (0 a 180) R=((angulo*8.33)/180); //calculo de tiempo de retardo del disparo E=8.33-R; //calculo de tiempo de pulso en alto en el puerto D0 Vdelay_ms(R); //aplica tiempo de retardo PORTD=1; //puerto D0 en alto Vdelay_ms(E); //aplica tiempo de encendido PORTD=0; //puerto D0 en bajo CRUCE0 = 0; //reinicia la variable CRUCE0 a 0 } } }