Hola estoy diseñando un dimmer con pic, basandome en el minidimmer de nocturno, el problema es que no se como activar el tiristor, y voy a sustituirlo por un triac, os adjunto mi codigo para que me digas en que falla la regulación de la intensidad, gracias.
#include <16F84a.h>
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
#fuses HS,NOWDT
#byte PORTA = 0x05
#byte PORTB = 0x06
#bit TRIAC = PORTB.1
#bit SALIDAFREC = PORTB.4
#define LimiteInf 50
#define LimiteSup 160
#define Periodo 85
int PasosDimmer,intensidad,j;
#INT_TIMER0
void tempo()
{
set_timer0(Periodo);
PasosDimmer++;
SALIDAFREC=1;
if (PasosDimmer==Intensidad) // cuando se ha llegado a la altura del semiciclo deseada
TRIAC=0; // se enciende el triac
delay_us(300);
TRIAC=1; // cortamos la señal que se envía al TRIAC
// ya que permanecerá encendido hasta el próximo cruce por 0
SALIDAFREC=0;
}
/****************************************************************************/
/* El ciclo del TRIAC comienza de nuevo con cada cruce por 0 */
/* por ello en la interrupción externa se pone a 0 la cuenta de PasosDimmer */
/* y se cambia la detección de flanco de la entrada */
/****************************************************************************/
#INT_EXT
void CrucePor0()
{
PasosDimmer=0;
if (j==0){
j=1;
ext_int_edge(H_TO_L); // Cambio la detección del flanco, para que la proxima sea de bajada
}
else {
j=0;
ext_int_edge(L_TO_H); // La próxima interrupción será de subida
}
}
void subir()
{
INTENSIDAD++; //Decrementamos minuto2
if(intensidad > 160) //Si minuto2 es mayor de 5
{
intensidad = 50; //Minuto2 es igual a cero
if(intensidad < 50) //Si minuto2 es menor de 1
intensidad = 160;
}}
/****************************************************************************/
/* En el main lo único que hay es la inicialización */
/****************************************************************************/
main()
{
set_tris_B(0b11001101);
set_tris_A(0b00011100);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
set_timer0(Periodo);
while(1)
{
if (input(pin_a1))
{
subir();
}
}}