Paso 11: PIC controlada lightdimmer: el software
Si desea utilizar este circuito con un microcontrolador PIC, el software en este enlace puede ayudarle a obtener más:
http://www.edaboard.com/thread265546.html
Un buen artículo sobre cero detección de cruce con un PIC se puede encontrar aquí:
http://tahmidmc.blogspot.nl/2012/10/Zero-Crossing-...
El escritor Syed Tahmid Mahbub da un programa básico que detecta el paso por cero y luego se activa el LED con un retardo de 20 ms.
Aunque nunca he trabajado con PIC de antes y no soy ninguna grieta en programación en C. Me decidí a ver si podía construir en su programa y que permiten variar la intensidad de la luz, en lugar de sólo darle un valor (el retardo de 20 MS).
Pronto descubrí que las funciones delay_ms y delay_us en C, son un poco complicado, es decir, que no acepta una variable. El tiempo de retardo debe ser conocido en el momento de compilación como lo es duro codificada. VI algunas soluciones complicadas, pero me pareció una solución más simple sería hacer una función que da 75 Estados Unidos demora (hacer que 65 para 60Hz) y que llame con un parámetro de determinar cuánto se enlaza ese retraso.
El número máximo de veces que el retraso se coloca es de 128. Eso es porque he elegido al azar que la luz debe ser atenuada en 128 pasos (con 0 en y fuera de 128).
Aunque una advertencia: no tengo ningún programador PIC y no estoy planeando (todavía) entrar en fotos, felices como estoy con la serie Atmega y Attiny. Por lo tanto no puedo probar el programa. Sólo puedo decir que compila sin problemas, y si desea utilizar el circuito en una foto, te ayudará a empezar. También puede encontrar proyectos completos, incluyendo un programa, aquí y aquí, incluyendo un control remoto IRy aquí
//---------------------------------------------------------------------------------------------------------
Programador: DIY_Bloke
Fuertemente basado en un programa de 0 X de Syed Tahmid Mahbub
Compilador: mikroC PRO para PIC v4.60
Blanco Foto: PIC16F877A
Programa para el control de ángulo de fase
cero señal de cruce en el pin RB0/INT 33
bloquean señal a MOC3021 por 220-470R de pin RD0 19/PSP0
Tal X 4 MHz
//---------------------------------------------------------------------------------------------------------
unsigned char FlagReg;
int x;
int maal;
atenuación de int = 20; / '20' es sólo un ejemplo. Regulación debe contener un
valor entre 0 y 128 y se puede tomar de ejemplo un
resistor variable o LDR o un valor que sale de un programa
SBIT ZC en FlagReg.B0;
{} void interrupt()
Si (INTCON. INTF) {//INTF bandera levantada, por lo que se produjo la interrupción externa
ZC = 1;
INTCON. INTF = 0;
}
}
{} void retardo (int maal)
para (x = 1; x < maal; x ++) {}
delay_us(75); 65 para 60Hz
}
}
void main() {}
PORTB = 0;
TRISB = 0 X 01; RB0 entrada para interrupción
PORTA = 0;
ADCON1 = 7; Desactivar la ADC
TRISA = 0XFF; Hacer todas las entradas de PORTA
PORTD = 0;
TRISD = 0; Todo PORTD salida
OPTION_REG. INTEDG = 0; interrupción en flanco descendente
INTCON. INTF = 0; limpiar bandera de interrupción
INTCON. INTE = 1; activar interrupción externa
INTCON. GIE = 1; habilitar interrupción global
mientras que {} (1)
Si (ZC) {//zero cruce ocurrió
Delay(dimming); '20' es un ejemplo
PORTD. B0 = 1; Enviar un pulso de
delay_us(250);
PORTD. B0 = 0;
ZC = 0;
}
}
}