Dimmer con PIC

bueno gente espero me puedan ayudar ya se que esto es un tema muy repetido y e buscado hasta donde no mas estoy realizando mi proyecto de grado y para esto necesito un dimmer digital, lo estoy desarrollando con un pic 16f877a, e visto muchos vídeos y códigos pero no logre que ninguno me funcionara así que te tome la iniciativa de hacer mi propio código.

el problema es que no logro sincronizar el micro para poder generar el pwm estoy manejando el timer0 para generar el pulso pero se me estan generando dos pulsos, no se que formula usar para poder setear el timer0 coloco mi código espero me puedan ayudar

Código:
#include <16F877.h> 
//#device adc=10

#fuses XT,NOPROTECT
#fuses NOWDT//permite trabajar el micro a menos de 4v
#fuses NOPUT//permite trabajar el micro a menos de 4v
#fuses NOBROWNOUT
#fuses NOLVP
#use delay (clock = 4000000)     // a trabajar con 4MHz
//#use standard_io(B)
#use standard_io(A)
#use standard_io(C)
#use standard_io(D)
#use rs232(baud=9600,xmit=PIN_C6,RCV=PIN_C7,bits=8,parity=N)

//#include <lcd.c>

int cambio=0;
unsigned int fase = 255;

#INT_EXT       //Interrupción externa.
void ext_isr()
{ 

 if(cambio==0){
 cambio=1;
 ext_int_edge(H_TO_L);
 }
 else{
 cambio=0;
 ext_int_edge(L_TO_H);
 }
 
 enable_interrupts(INT_TIMER0); //Cambia para que la proxima la interrupción sea en flanco de bajada
 set_timer0(fase);

 output_low(PIN_C4);


}


#int_timer0
void timer0_isr()
{
   disable_interrupts(INT_TIMER0);
   output_high(PIN_C4);
}

void main(){
 //restart_wdt(); 
 //lcd_init();        
 
 
 enable_interrupts(INT_EXT);
 ext_int_edge(L_TO_H);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
 disable_interrupts(INT_TIMER0);
 enable_interrupts(GLOBAL);      
 
 delay_ms(100);
while(True){
}
}

si le doy un valor menor a 255 al timer0 no se genera el pulso adjunto imagen del la simulación en proteus

gracias
 

Adjuntos

  • Captura de pantalla 2012-07-31 a la(s) 0.49.23.png
    Captura de pantalla 2012-07-31 a la(s) 0.49.23.png
    116.6 KB · Visitas: 30
Última edición por un moderador:
Hola, Raro el còdigo jeje para que usas la #INT_EXT?
Intenta no usar dos interrupciones para esto, con el Timer bàsta para generar PWM...

Una idea es que genères la frecuencia por còdigo y que establescas el DutyCycle del PWM por medio de la interrupciòn del Timer.

(1) Inicias el Pin en "1" -> Inicias la interrupcion del Timer -> Inicias un delay que establece la frecuencia.
(2) Cuando el timer proboca la interrupciòn, pones el pin en "0" y detienes la interrupciòn.
(3) Cuando el delay por còdigo termina pasa al punto (1), asi para siempre.

Ten en cuenta que el tiempo que demore el Timer en provocar la interrupciòn debe de ser menor al delay por còdigo...

Es una idea.

Saludos
 
Hola, Raro el còdigo jeje para que usas la #INT_EXT?
Intenta no usar dos interrupciones para esto, con el Timer bàsta para generar PWM...

Una idea es que genères la frecuencia por còdigo y que establescas el DutyCycle del PWM por medio de la interrupciòn del Timer.

(1) Inicias el Pin en "1" -> Inicias la interrupcion del Timer -> Inicias un delay que establece la frecuencia.
(2) Cuando el timer proboca la interrupciòn, pones el pin en "0" y detienes la interrupciòn.
(3) Cuando el delay por còdigo termina pasa al punto (1), asi para siempre.

Ten en cuenta que el tiempo que demore el Timer en provocar la interrupciòn debe de ser menor al delay por còdigo...

Es una idea.

Saludos

te agradezco la idea la voy a tener en cuenta y en respuesta a tu pregunta en mi código utilizo la interrupciones externas #INT_EXT para tratar de sincronizar el pic con el cruce por cero
 
Atrás
Arriba