Autor Tema: Dimmer con TMR0  (Leído 10758 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Dimmer con TMR0
« en: 20 de Mayo de 2007, 02:47:03 »
saludos acabo de hacer este codigo para controlar un dimmer (10 pasos) usando el TMR0 e INT EXT para el paso por cero; el detector produce un cambio de estado en su salida cada vez qeu cruza por cero, qeudo asi:

Código: [Seleccionar]
#include <16f88.h>
#fuses HS,NOWDT,NOLVP,PUT,MCLR,NOBROWNOUT
#use delay(clock=8000000)

int j=0,count=0;
signed int disparo=0;

#INT_EXT
void CrucePor0()
{
   set_timer0(5);
   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
   }
}

#INT_TIMER0
void tmr_handler()
{
   count++;
   set_timer0(5);
   if(count==10)
   count=0;
   if(count==disparo)
   {
      output_high(PIN_B4);
      delay_us(300);
      output_low(PIN_B4);
   }
}

void main()
{
   set_tris_a(0xff);
   set_tris_b(0xef);
   setup_adc_ports(NO_ANALOGS);
   setup_timer_0(RTCC_DIV_8|RTCC_INTERNAL);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_EXT);
   ext_int_edge(L_TO_H);
   enable_interrupts(GLOBAL);
   do
   {
      if(input(PIN_A0))
      {
         delay_ms(20);
         while(input(PIN_A0))
            delay_ms(20);
         disparo++;
         if(disparo==10)
            disparo=9;
      }
      if(input(PIN_A1))
      {
         delay_ms(20);
         while(input(PIN_A1))
            delay_ms(20);
         disparo--;
         if(disparo==-1)
         disparo=0;
      }
   }while(true);
}

lo que hago es incrementar y decrementar un contador de disparo con pulsadores en A0 y A1 respectivamente; el timer genera interrupcion cada 1ms, si el disparo (variable modificada por A0 y A1) es igual al contador de interrupciones (count), entonces se genera un pulso para disparar el triac, y asi sucesivamente, en el programa principal se controla los pulsadores. Hago esto porque quisiera incluirle un mando IR, y el buen amigo nocturno me mencionó alguna vez que para usar el mado debop usar el timer y sus interrupciones, voy por buen camino? algo para corregir? o es qeu escribi codigo malo talvez? no puedo ver una simulación precisa.

Talvez me ocupo todo el tiempo para ver las interrupciones del timer0 y no pueda ver al mando IR, puedo apagar TMR0 despues de disparar el triac y encender en INT EXT (cuando detecte cruce por cero), talvez sea mas efectivo, o como le hago? alguna sugerencia??

gracias. adios.
.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Dimmer con TMR0
« Respuesta #1 en: 20 de Mayo de 2007, 03:10:28 »
Yo creo que vas bien Cryn.
Y no temas no poder simularlo; este tipo de aplicaciones no se pueden hacer con un simulador, sino con un circuito real.
Ánimo.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Dimmer con TMR0
« Respuesta #2 en: 20 de Mayo de 2007, 13:21:03 »
holas, gracias por la respuesta, me das animos, jeje, pero mira nose si recuerdas qeu hace unos meses hice un dimmer sin mando IR y con retardos ciclicos (osea usando delay_ms(xxx)), ahi si podia simular, porque observaba la señal AC en un puerto del osciloscopio, y la señal de disparo en el otro puerto, y se lograba ver que cuando aumentaba o disminuía el disparo (con pulsadores) el tren de disparo se desfazaba, hasta llegar al limite de ida y vuelta, y pues llevandolo a la practica fue un regalo, jeje, y ahora no puedo ver el desface qeu te menciono, pues es algo raro, nose, pienso que deberia lograr ver lo mismo, weno, pero no importa lo probare con circuito real despues, pues me he quedado sin tiempo ahora por examenes pero despues vuelvo a la marcha.

Pero por ahora que te parece la idea que mencione?:
Talvez me ocupo todo el tiempo para ver las interrupciones del timer0 y no pueda ver al mando IR, puedo apagar TMR0 despues de disparar el triac y encender el tmr0 en INT EXT (cuando detecte cruce por cero), talvez sea mas efectivo, o como le hago?

y que te parece hasta ahora el codigo, lo leiste?? crees que funcione???

muchas gracias, adios, os comentare los resultados en cuanto lo pruebe
.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Dimmer con TMR0
« Respuesta #3 en: 20 de Mayo de 2007, 15:32:09 »
Me refiero a que es imposible simular la captura de tramas IR, pero no al dimmer.
Yo no he mirado tu código en profundidad, pero aunque podría ser depurado, parece que vas bien. No te preocupes demasiado por interferencias entre ambas interrupciones; se producen muy de cuando en cuando y no ocupan mucho tiempo de proceso, por lo que no deberían interferirse.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Dimmer con TMR0
« Respuesta #4 en: 21 de Mayo de 2007, 08:29:30 »
Tengo una duda, desde mi ignorancia.  ¿que sería el "mando IR"?  Pregunto porque tal vez pueda aportar alguna forma de simularlo.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Dimmer con TMR0
« Respuesta #5 en: 21 de Mayo de 2007, 10:06:23 »
me referia a un mando IR, por un control remoto de la TV o Radio, cualquiera, que usan un LED IR para transmisión del boton pulsado

ok mocturno, seguire trabajando en ello, espero funcione, aunque como te mencione no vi muchos cambios en los pulsos de disparo en mi simulación; weno hay les aviso, adios!
.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Dimmer con TMR0
« Respuesta #6 en: 21 de Mayo de 2007, 12:37:37 »
me referia a un mando IR, por un control remoto de la TV o Radio, cualquiera, que usan un LED IR para transmisión del boton pulsado

¿Pero porqué dicen que no se puede simular? yo he simulado recepciones de usart por software completas con el MPSIM simulando cada bit de la trama.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Dimmer con TMR0
« Respuesta #7 en: 21 de Mayo de 2007, 13:43:02 »
Bueno, quizás más que "no se puede simular" debería haber dicho "yo no sé cómo simularlo" porque no lo he hecho nunca, Mauricio.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Dimmer con TMR0
« Respuesta #8 en: 21 de Mayo de 2007, 14:49:14 »
Bueno, quizás más que "no se puede simular" debería haber dicho "yo no sé cómo simularlo" porque no lo he hecho nunca, Mauricio.

Bueno, por eso pregunté de qué hablaban , hay cosas que son muy complicadas de simular o imposibles y otras que no lo son tanto.

En el mpsim por ejemplo, se le pueden agregar estímulos de pin, hechos con timings , y con eso se pueden simular entradas muy muy complejas.  Cosas que con proteus por ejemplo no se puede y esa es la principal razón por la cual lo usé un par de horas y lo tuve que descartar (al menos para estas cosas).  :?

El MPSIM mejoró y mucho solo que está muy muy mal documentado.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Dimmer con TMR0
« Respuesta #9 en: 25 de Mayo de 2007, 00:27:48 »
saludos maunix, pues muy interesado he quedado con lo que mencionas sobre el estimulus MPSIM, y presisamente necesitare un estimulo para comenzar, un reloj, para el dimmer, sera el qeu emule al detector de cruce de cero, que cambia de estado cada vez qeu detecta un cruce por cero, entonces el estimulo que necesito es un reloj constante de un periodo de 10 ms a 50% de ciclo de trabajo, que irá al Pin RB0 (int EXT), he intentado y no lo he logrado, me podrias ayudar porfavor con ello?? o nose si supieras de algun manual donde se expliqeu ello, pues seria muy interesante tb hacer el estimulo para el mando IR. Bueno espero tu respuesta adios, y gracias.
« Última modificación: 25 de Mayo de 2007, 00:39:07 por Cryn »
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dimmer con TMR0
« Respuesta #10 en: 25 de Mayo de 2007, 15:09:39 »
Bueno, quizás más que "no se puede simular" debería haber dicho "yo no sé cómo simularlo" porque no lo he hecho nunca, Mauricio.

Bueno, por eso pregunté de qué hablaban , hay cosas que son muy complicadas de simular o imposibles y otras que no lo son tanto.

En el mpsim por ejemplo, se le pueden agregar estímulos de pin, hechos con timings , y con eso se pueden simular entradas muy muy complejas.  Cosas que con proteus por ejemplo no se puede y esa es la principal razón por la cual lo usé un par de horas y lo tuve que descartar (al menos para estas cosas).  :?

El MPSIM mejoró y mucho solo que está muy muy mal documentado.

yo luché un rato tratando de hacer funcionar unos estimulos para el CAD y que va, incluso leyendo unas guias del foro de microchip, me venció.. de momento  :(
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Dimmer con TMR0
« Respuesta #11 en: 14 de Julio de 2009, 14:35:11 »
saludos..he venido tratando de asimilar el codigo q postearon...entonces disculpen si me equivoco:
en cada cruce por cero se activa el TIMER0 para q genere una interrupcion cada 1mS, en cada interrupcion del TIMER0 se incrementa la variable "count", entonces "count" es como un contador de mS y "disparo" será la variable que determine el tiempo de disparo al ser comparada con "count", es decir si count=5=5mS y si disparo=5=nivel de intensidad 5, y detectado el cruce por cero entonces se le da un disparo al triac 5mS despues de el cruce por cero.....estoy en lo cierto??
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Dimmer con TMR0
« Respuesta #12 en: 14 de Julio de 2009, 16:17:13 »
paso tiempo de esto :mrgreen:

mmm a ver deja y recuerdo un poco:

la frecuencia de la energía eléctrica suministrada en mi país es de 50Hz, entonces el periodo es de 20ms, de los cuales 10ms son para la señal senoidal positiva, y los otros 10m son para la senoidal negativa, y nuestro triac encenderá la lampará (de 15W que usé aquella vez) según el disparo que se le de en su gate, entonces el disparo se lo debe hacer cada 10ms, para darle siempre el semiciclo positivo o negativo a la lámapara, mediante el triac.

si por ejemplo, disparo al inicio del primer semiclo, debo esperar 10ms y volver a disparar, para el siguiente semiciclo, y así sucesivamente.

ahora, para saber cuando disparar usé unos pulsadores que incrementaban y decrementaban una variable llamada disparo, ya que retardaba el disparo, es decir me movía a lo largo de todo el semiciclo, nose esperaba 5ms y recien disparaba, y pasado los 10ms del semiciclo volvía a disparar, de esta manera solo tendría medio semiciclo entregado a la lámapara, por tanto se veía la atenuación de la lampara correspondiente al 50% del total.

y si, la variable count cuenta cada 1ms, en los desbordes del tmr0, y la interrupción por el cruce por cero le re-establecía la cuenta el tmr0.

Creo que era eso, espero no haberte confundido, y si no lo comprendiste, me avisas

saludos.
.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Dimmer con TMR0
« Respuesta #13 en: 14 de Julio de 2009, 17:22:55 »
gracias....ya tengo un poco mas claro esto...me tome el atrevimiento de copiar tu codigo y tratar de ajustarlo a lo que quiero para realizar una prueba, basicamente y por disposicion de hardware el cruce por cero lo detecto activando la interrupcion por cambio de nibble en B4 y el pulso de disparo lo saco por B0, aqui en colombia la frecuencia es 60Hz, asi q hice lo siguientes cambios...corrigeme por favor si tengo algo malo sobre todo en la carga del timer0, tambien debe estar a 1mS con reloj de 4Mhz

Citar
#byte port_b=6

int j=0,count=0;
signed int disparo=0;



//#############################INTERRUPCION CAMBIO NIBBLE##################################
#int_RB
void  RB_isr(void)
{
   #asm movf port_b,0
   #endasm
   set_timer0(128);
}
//######################################################################################


//#############################INTERRUPCION EXTERNA##################################
#int_RTCC
void  RTCC_isr(void)
{
   count++;
   set_timer0(128);
   if(count==10)
   count=0;
   if(count==disparo)
   {
      output_high(PIN_B0);
      delay_us(300);
      output_low(PIN_B0);
   }
   
}
//######################################################################################


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_RB);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   do
   {
      if(input(PIN_A0))
      {
         delay_ms(16);
         while(input(PIN_A0))
            delay_ms(16);
         disparo++;
         if(disparo==10)
            disparo=9;
      }
      if(input(PIN_A1))
      {
         delay_ms(16);
         while(input(PIN_A1))
            delay_ms(16);
         disparo--;
         if(disparo==-1)
         disparo=0;
      }
   }while(true);

}
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Dimmer con TMR0
« Respuesta #14 en: 14 de Julio de 2009, 18:21:18 »
como la frecuencia acá es 50Hz, mi semiciclo es de 10ms, e hice posible disparos cada 1ms dentro del semiciclo, lo que me daba 10 tonalidades desde encendido completo a apagado, aunque recuerdo que este de apagado no me salía como debería, pero era cuestión de ajustar, por escaso tiempo para la presentación no pude mejorarlo, jeje.

en tu caso tu semiciclo son de aprox 8.33ms lo que daría quizá una nueva forma de verlo, para tratar de dividir tu semiciclo en partes iguales en alumbramiento, quedaría entonces en 0.833ms para dividir en 10 tonalidades, que al menos según recuerdo se veía bien las atenuaciones.

eso ya dependerá de ti, si trabajas a 1ms en los disparos solo tendrás 8 estado posibles.

tu rutina del timer0 esta bien, asi como tu precarga en el timer.

La que no me convence es tu rutina de interrupción por cambio de estado en el puerto B, para qeu usas esa instrucción en asm? si no me equivoco mueve el contenido del puerto b al registro acumulador W del micro, pero nose porque si en ningún otro momento lo usas... quizá en otra parte de tu codigo que no esta a la vista verdad?

Cual es tu detector de cruce por cero?

espero te sirva de ayuda, un saludo
.