nocturno, no me gusta llevarte la contraria, pero habria que tener cuidado de que led pongas, y sobre todo las resistencias... el transistor es para cuando consumes mas de 20mA del pic, asi que habria que buscar la resistencia adecuada... pero hace unos dias compre un led rgb de 3W, que consumen alrededor de 350mA por color... ESTOY DESEANDO QUE ME LLEGUE PARA HACER LAS PRUEBAS!!!Tienes razón, si pasa de 20mA habrá que "transistorizarlo". Yo daba por hecho que era normalito.
en el caso de cryn es poco probable que su led consuma demasiado, ya que habra de patas del led, y estos suelen ser los normales, con consumos maximos de 20-25mA por color, siempre que se le coloque la resistencia correspondiente, claro.
manolo, aprobechando que te tengo aqui me gustaria hacerte unas preguntitas sobre tu ejemplo de led rgb:Rojo recibe un valor que se introduce por teclado. Las teclas recibidas están en Buffer. En cada iteración, hacemos lo siguiente:
en la rutina de "procesaRGB", en el if que procesas el valor numerico introducido haces el siguiente calculoCódigo: Cy queria saber (si puede ser :mrgreen:) que significa todo eso...
Rojo=Rojo*10+Buffer[i]-48;
tambien tenia una duda con la rutina de "demo", porque me da la impresion que solo muestras unos 1500 colores, aunque tu ALARDEAS de poder visualizar toda la gama cromatica (16 millones de colores) :P... y a un milisegundo por color como tienes en el codigo, enseñar todos los colores tardaria 4 horas y 40 minutos... :D :D :DObviamente en la demo no se ven todos porque tardaría mucho. Donde se ven todos es tecleando directamente el código RGB de cada color. En ese caso, como tienes la opción de dar a cada color un valor entre 0 y 255, tienes 256^3 colores = 16M colores.
y ahora, despues de criticarte duramente, me gustaria hacerte otra pregunta :5}Ea, pues ahora no tengo ganas de contestarte, por criticón. :D
si por ejemplo tengo una variable INT8, y le voy sumando 1, luego 1, y asi hasta que desborda, luego que ocurre? despues del 255 continua contando por el 0? y si a 250 le sumo 10, me daria 4 como resultado? eso no da ningun problema ni nada? es que yo recuerdo de VB que si se me desbordaba una variable se finalizaba el programa... aqui en C no hay problema?
gracias y salu2
Estoy estrenando unos RGB, de catodo comun, y pues tienen una muesca por una de las patas, y pensaba que ese era el comun pero no!, el comun es uno de alado :D :D y pues esto es normal??Hola Cryn amigo :mrgreen:
ahora pretendo hacer mas o menos algo como las muchas muestras que hay en youtube, solo ver la gama de colores que se puede ver, y talvez unos pulsadores para incrementar verde azul y rojo, como otra opcion
ahora vi el ejemplo de nocturno sobre generar 3 pwm usando un timer, y pretendo hacerlo con ello, ya que hare el programa para un 16f648a (que solo tiene un canal pwm o 2 creo)
- que frecuencia debo usar?? periodo
- es necesario usar transistores a la salida del pic a los pines del rgb?
un saludo, y con vuestras respuestas me pongo a trabajar en el codigo, para lo que pretendo
ah! una ultima cosa... porque pones punto y como ";" despues de los corchetes del IF del timer0 ISR, y despues del WHILE del main? signigica algo?Efectivamente, no son obligatorios. Los pongo por coherencia con el resto de estructuras en C.
yo no los pongo, y CREO que funciona igual...
y por cierto... pones el timer en 140 para que desborde cada 58uS, que en 256 ticks serian casi unos 15mS de periodo de PWM, lo que nos daria una frecuencia de unos 67 ciclos por segundo. estos valores son fruto de pruebas o simplemente lo hiciste asi porque te gustaban esos numeros?No hay base teórica detrás de esa frecuencia, sólo empírica.
entiendo que a partir de una determinada frecuencia, el ojo ya no ve los leds parpadear, pero supongo que habra algun valor optimo, no? o mientras la frecuencia sea mayor a la que perciben nuestros ojos cualquiera vale?
No hay base teórica detrás de esa frecuencia, sólo empírica.
No hay base teórica detrás de esa frecuencia, sólo empírica.creo que no lo hay, cierto? pero de esa formula creo que se puede optar por cualquier frecuencia, arriba de la cual la retina de nuestro ojo ya no distinga el parpadeo y maximo hasta una freceuncia que pueda ver el led, ya que si es muy muy alta y el led no distingue supongo que el led no reaccionaria (pero cual la frecuencia maxima? dice en la hoja de datos?).
Citar- que frecuencia debo usar?? periodo
Si vas a trabajar con leds RGBs tienes que tener en claro que pueden coexistir tres frecuencias diferentes:
a) la frecuencia de refresco propiamente dicha que es la que me imagino que mencionas.
b) la frecuencia del pwm de los leds para darles diferente valor (que no es lo mismo que color, más abajo lo explico).
c) la frecuencia de actualización en donde puedes cambiar la información del led.
Tú puedes tener por ejemplo la frecuencia de refresco de 100 hertz para que no se observe parpadeo, la frecuencia de actualización de información de 60 hertz para emular el sincronismo de actualización del NTSC, y la frecuencia pwm de los valores del led en digamos 5 MHz para poder desplegar digamos (es un decir, hay que hacer cálculos exactos) 4096 colores.
#include <16f648a.h>
#FUSES NOWDT,INTRC_IO,NOPROTECT,BROWNOUT,PUT,NOLVP,MCLR,NOCPD
#use delay(internal=4000000)
#define Rojo PIN_B0
#define Verde PIN_B1
#define Azul PIN_B2
int caida_rojo,caida_verde,caida_azul,count_pwm;
#int_Timer0
void tmr0_handle()
{
count_pwm++;
if(count_pwm==caida_rojo)
output_low(Rojo);
if(count_pwm==caida_verde)
output_low(Verde);
if(count_pwm==caida_azul)
output_low(Azul);
if(count_pwm==20)
{
output_b(0x07);
count_pwm=0;
}
set_timer0(131);
}
void demo()
{
}
void main()
{
output_b(0);
set_timer0(131);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
setup_oscillator(OSC_4MHZ);
//enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while(true)
{
if(input(PIN_A0))
{
delay_ms(20);
while(input(PIN_A0))
delay_ms(20);
enable_interrupts(INT_TIMER0);
//output_b(7);
caida_rojo++;
if(caida_rojo==21)
caida_rojo=0;
}
if(input(PIN_A1))
{
delay_ms(20);
while(input(PIN_A1))
delay_ms(20);
enable_interrupts(INT_TIMER0);
//output_b(7);
caida_verde++;
if(caida_verde==21)
caida_verde=0;
}
if(input(PIN_A2))
{
delay_ms(20);
while(input(PIN_A2))
delay_ms(20);
enable_interrupts(INT_TIMER0);
//output_b(7);
caida_azul++;
if(caida_azul==21)
caida_azul=0;
}
if(input(PIN_A3))
{
output_b(7);
enable_interrupts(int_timer0);
demo();
}
}
}