Вы находитесь на странице: 1из 2

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
}
}
}

Вам также может понравиться