Super Dimmer, hasta 16 lámparas con un solo PIC

Ok gracias dino, voy a ver como lo arreglo, lo de los 8 bit es xq cada dimmer usa 4combinaciones 0% 30% 60% 100%,
Y tengo 255(xq la 00000000 no la uso) 255/4=dimmer que puedo comandar por el bus de 8bits.. Dps cuando este en la compu veo q hacer y te consulto talvez..
Gracias!!
Un saludo..
 
Última edición:
ahora entiendo, vas a controlar dos dimers independientes con un solo PIC... es un buen reto, exito en el proyecto companero :apreton:
 
hola dino.. estuve intentando comprender tu programa para poder modificarlo a mis necesidades.
tengo varias dudas, aca te dejo tu codigo y mis dudas marcadas en cada parte que no entiendo:
-----
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT
#use delay(clock=16000000)
int1 flanco=1;
int dly=100; ----1-¿esto significa que dly comienza en 100, o sea puede comenzar en 255 o 254(luz off)?
#int_EXT
void EXT_isr(void)
{
output_a(0b00000000);
if (flanco==1)
{
ext_int_edge(h_to_l);
set_timer0(255-dly);
while(get_timer0()>0); //espera hasta que timer0 se desborde
flanco=0;
output_a(0b00001111);
}
else
{
set_timer0(255-dly);
while(get_timer0()>0); //espera hasta que timer0 se desborde
ext_int_edge(l_to_h);
flanco=1;
output_a(0b00001111);
}
}
void main()
{
set_tris_a(0x00); ----2-¿necesito configuar los port aca, o puedo hacerlo #byte trisA=(.nro.)?
set_tris_b(0xff);
enable_interrupts(global);
enable_interrupts(int_ext | l_to_h);
setup_timer_0(rtcc_internal | rtcc_div_128 | rtcc_8_bit);//prescalador 1:128 TMR0 desbordara cada 8ms ----3-Aca no entiendo nada!je ¿como sería para 50Hz?

while(true)
{
if(input(pin_b1)==0)
{
dly++;
if (dly==255) dly=254; //no puede pasar de 255 ----4-¿xq no puede ser 255, que es realmente el 0% de luz?

}
if(input(pin_b2)==0)
{
dly--;
if (dly==0) dly=1; //no puede bajar a cero ----5-¿idem anterior, dly=0 es luz al 100%, esta mal?

}
delay_ms(25); //demora antirebote ----6-¿el valor 25 es por algo en especial o solo es un tiempo pequeño "x", no me queda claro el por que de este delay?
}
}
------
voy a enloquecer, más dudas! :p
7-¿La INT EXT solo interrumpe enla parte de "void EXT_isr(void)"? o sea ¿lo que esta dentro de "Void main()" se ejecuta a la par?
8-¿para 50hz de linea podre usar lo 4mhz internos del pic o es indispensable que use 20mhz cristal externo?
9-¿flanco 1 y 0 son los semiciclos positivo y negativo verdad?
Bueno perdón por ser tan molesto, e ignorante, es que hace poco que empece con esto de los pic y con el lenguaje c, soy nuevo en todo y ademas me encuentro en un "mal tiempo" y necesito mejorar mis ingresos ya..
me senti muy identificado con tus frases "(...)desde ese día aprendí que los malos momentos te obligan a ser mejor." je..
si me contestas las 9 preguntas me salvas la vida!jajaj
un abrazo!
gracias...
 
voy a tratar de aclarar tus dudas nf mv. empezare desde el principio

1. Afirmativo, puede empezar en 255, luz OFF
2. no es necesario que configures el puerto A, pero te recomiendo que lo dejes tal como esta
3. lo que hago es configurar el timer para que se desbore cada 8ms, en caso de que la red sea de 50Hz el timer debera desbordarse cada 10ms para ello necesitaras un cristal de 20Mhz.
4. afirmativo, el valor 255 es lampara off. en un codigo mas actualizado que subi, si llega hasta 255
5. idem al anterior
6. si no hubiera ese delay el codigo se ejecutaria tan rapido que seria imposible controlarlo con los botones atenuar/iluminar. es como hacer una pausa para que las cosas no ocurran tan rapido...(quita ese delay y observa en simulacion lo que ocurre)
7.cada vez que el voltaje cruza por cero, el pic entra en interrrupcion es decir en "Void EXT_isr(void).. mientras tanto ejecuta lo que esta en main()
8.yo creo que si puedes utilizar el cristal interno de 4 mhz... pero tendrias que cambiar la configuracion del timer0. (habria que ver...)
9.flanco=1 es un bit que indica que el cruce por cero ocurre cuando el volataje alterno va en aumento, es decir cruza negativo a positivo
flanco0=0 es lo contrario cuando el voltaje pasa desde positivo a negativo

espero que te haya ayudado.. no dudes en preguntar, saludos!!
 
Última edición:
muchos me han preguntado si se puede tener mas de un dimmer en un solo PIC; la respuesta es si; yo personalmente he controlado hasta seis dimmers con un solo PIC.

esta ves voy aportar con este ejemplo en el cual controlo dos dimmers completamente individuales el uno del otro; con un pic 18F4550.

saludos! companeros
 

Adjuntos

  • 10.SuperDimer3.rar
    60.5 KB · Visitas: 261
Hola amigo dino.. como va? eh estado con poco tiempo, pero aca la sigo luchando con adaptar tu dimer a 50hz de red.. jeje
esta es tu configuracion para el timer0:
setup_timer_0(rtcc_internal | rtcc_div_128 | rtcc_8_bit);//prescalador 1:128 TMR0 desbordara cada 8ms
Y esta es la que me quedaria a mi con osc interno de 4mhz:

setup_timer_0(rtcc_internal | rtcc_div_64 | rtcc_8_bit);// me da 16,3ms y necesito 10ms...

a ver si mi razonamiento esta bien.. el dly de tu programa va de 0 a 255, o sea 255=16,3ms(en mi caso).
que tal si no lo dejo llegar a 255 y lo corto en 157, .... (regla de tres):
16,3ms---255
10ms --- x
y "x" es aproximadamente 157
bueno te pongo parte del codigo (el resto es igual al tuyo); estoy entre 2 opciones y no se cual seria correcta, si es q la hay!je
1-si el dly va de 255 a 0 seria asi:
---
Código:
setup_timer_0(rtcc_internal | rtcc_div_64 | rtcc_8_bit);// desborda cada 16,3ms
    while(true)
    {
    if(input(pin_b1)==0)
        {
         dly++;
         if (dly==255) dly=255; //no puede pasar de 255
        }
    if(input(pin_b2)==0)
        {
         dly--;
         if (dly==98) dly=98;//xq(255-157=98) hasta los dly=98 varío 10ms si bajo mas agrego                 tiempo!
        }
    delay_ms(25);               //demora antirebote
    }
----
1-si el dly va de 0 a 255 seria asi:
----
Código:
setup_timer_0(rtcc_internal | rtcc_div_64 | rtcc_8_bit);// desborda cada 16,3ms
    while(true)
    {
    if(input(pin_b1)==0)
        {
         dly++;
         if (dly==157) dly=157; //hasta dly=157 pasan 10ms de los 16,3ms q cuenta el timer en total, si llegara a 255
        }
    if(input(pin_b2)==0)
        {
         dly--;
         if (dly==0) dly=0;//
        }
    delay_ms(25);               //demora antirebote
    }
----
que opinas???
un gran saludo.!!
 
Última edición por un moderador:
entiendo que el desborde del timer0 ocurre cada 16ms y tu lo estas recortando para que se desborde cada 10ms, tiene mucha logicalo que estas haciendo.. habria que ver la simulacion :unsure::unsure:

otra opcion es cargar un valor al timer0 para que no empiece desde cero utilizando la instrucion:

set_timer0(value); //esta instruccion deberia ir en la rutina de interrupcion
//asi el dly varia desde 0 a 255 y no pierdes resolucion
//suerte!!
 
Última edición:
hola nf mv.. observa este error en tu codigo:

if(input(pin_b2)==0)
{
dly--;
if (dly==0) dly=0;// // esto esta mal, ya que la proxima vez que decremente ira a 255... lo correcto seria:

if (dly==255) dly=0;

o tambien

if (dly==0) dly=1;
 
Última edición:
hola dino ya lo solucione.. ahora tengo otros problemas pero creo que son del circuito, ahora no estoy en mi pc, pero despues si queres subo el programa completo.. en la simulacion de proteus isis anda bien, pero al grabar el pic y armar el circuito no funciono...! cosas que pasan.. je

if(input(pin_b2)==0)
{
dly--;
if (dly==0)
dly++;
}
bueno, estamos en contacto, despues te cuento como me fue..
un saludo..!
 
Hola dinoelectro, muchas gracias por tu aporte, me sirvio bastante

Te comento una duda, ojala puedas ayudarme.

Realize tu dimmer pero quiero controlarlo con rs232, entonces agregue la int_RDA y con gets(); recibo el comando, despues la variable dly la cargo con el dato y WUALA, el brillo cambia, entonces mi problema es que si continuo mandando datos, la 3, 4, 5 o a veces desde la segunda vez en pic se "traba", crees que sea el problema por la programacion, o que sea algo fisico en el circuito?

De antemano, gracias !!
 
hola estuve probando la idea de #nf-mv para utilizar este dimmer con 50 hz y 220 volt, pero la simulacion se me da un tanto inestable, hay alguien que haya probado la idea de dinoelectro pero con la frecuencia antes mencionada? si es asi agradeceria su ayuda.
 
Para una frecuencia de red de 50Hz el desborde debe ser cada 10ms, se recomienda utilizar un cristal de 20 mhz. asi que deberas cambiar la configuracion del timer. en realidad no recuerdo como es la configuracion, pero si programas en PIC CCS puedes utilizar el "Wizard" asi el compilador te generara el codigo de configuracion automaticamente.

saludos
 
disculpa de nuevo, cual es la formula que ocupaste para calcular el desborde cada 8ms, me la puedes explicar por favor? mi otra interrogante es al implementar el circuito donde conecto el neutro de la red? porque la fase va con la resistencia al pic, pero la red?
de antemano gracias..
 
como conecto de la red electrica al pic? tengo que saber cual de los dos cables es la fase, coger este, y ponerle la resistencia y de ahi al pic? o tambien tengo que coger el neutro y unirlo a los 0V de mi fuente de 5?
 
Hola gente, compre una placa DMX hecha de 9 canales para hacer un dimmer (la compre porque no se programar) lo que quiero hacer es fabricar la placa de drivers-triacs para la linea alta tension, tengo pensada hacerla tal cual posteo el amigo dinoelectro con los opto aisladores o opto acopladores como quieran llamarlo, el tema es el siguiente.

quiero ponerle un pote para cada canal entre la controladora DMX y el opto para poder usarla tambien sin DMX, ahora bien, puede funcionar haciendo la parte del pote como muestra en la figura 4 del datasheet del opto? (http://pdf.datasheetcatalog.com/datasheet/QT/MOC3021.pdf) el pote lo pondria en lo que en el datasheet marca una fuente para variar el voltaje, y a la vez conectar el opto a la placa DMX (la placa dmx tiene driver irfz44n para la salida - salida 12v) esto me puede traer algun problema como que rompa los irf de la controladora o que al darle con el dmx rompa el transistor 2n3904?

Saludos y gracias.
 
quiero ponerle un pote para cada canal entre la controladora DMX y el opto para poder usarla tambien sin DMX, ahora bien, puede funcionar haciendo la parte del pote como muestra en la figura 4 del datasheet del opto? (http://pdf.datasheetcatalog.com/datasheet/QT/MOC3021.pdf) el pote lo pondria en lo que en el datasheet marca una fuente para variar el voltaje, y a la vez conectar el opto a la placa DMX (la placa dmx tiene driver irfz44n para la salida - salida 12v) esto me puede traer algun problema como que rompa los irf de la controladora o que al darle con el dmx rompa el transistor 2n3904?

Saludos y gracias.

NO es tan sencillo compañero, tienes que construirte un receptor DMX a base de microcontrolador, la conexion directa entre el Potenciometro y los optoacopladores no te funcionara..

saludos!
 
Última edición:
Hola, eh conectado los opto moc 3020 a la placa dmx que compre y a un triac bt 136 todo bien pero no funciona como yo quiero, varia la intensidad y todo de la lampara el tema es que desde que comienza a encender la lampara titila cuando llega a 255 la consoa dmx deja de titilar y enciende bien al maximo, el problema esta en la placa dmx porque me prestaron un dimmer bheringer y hice la prueba de desconectarle la controladora dmx que trae original y conectarle la mia y hace exactamente lo mismo o sea que el circuito del opto y triac que yo hice esta bien. el dimmer bheringer tambien trabaja con los moc 3020 pero con otro triac mas potente el bta25-600b

por otro lado la placa dmx que compre tiene irfz44n como driver de salida, no se si ese sera el problema, tambien hice la prueba de conectarle un led en paralelo al led del opto y el led anda perfecto no titila para nada varia la intensidad a la perfeccion.

alguien me puede dar una mano?
Gracias
 
dinoelectro es que lo que compre es un receptor DMX a base de ATMEGA8515 16PU1309, puede que me halla expresado mal.

ya me canse de hacer pruebas y no me funcionan, la placa dmx que compre tiene irfz44n como driver de salida, no se si ese sera el problema pero al conectarle un led en uno de sus canales de salida dimeriza a la perfeccion.

se solucionaria si en vez de usar un optoacoplador utilizo un transformador para aislar la placa dmx de la red electrica?
 
Atrás
Arriba