saludos amigos! por fin me ha quedado algo interesante mi proyecto sobre el manejo de un LED RGB, todo comenzo
aca, talvez sea muy poco, pues en el youtube vi que hasta hacen con una matriz 3x3x3 o mas grandes, muy buenos, y este se queda chiquito, pero weno, es un inicio

Ya lo traía hace tiempo, paso que tube algunos problemas y no podia acabarlo, y hace dos dias que lo acabe, y siento el viento chocar con mi cara

aca el codigo, lo hice con un 16f648a, y un pequeño video

me base en la teoria de Nocturno que es usar un timer, con el mismo Periódo para el PWM, queria hacerme codigo propio

ya saben que es mas valioso para uno mismo.
Aca lo dejo, por si a alguien le sirve, y pues estoy con los oídos abiertos (mejor con los ojos abiertos

), para que ustedes le den una ojeada y talvez pueda corregirse algo (o mejorarse), ya que tiene algunos problemillas en los límites, y a veces se traba, tb ire en ello, y habra seguramente una Fe de Erratas

#include <16f648a.h>
#FUSES NOWDT,INTRC,NOPROTECT,BROWNOUT,PUT,NOLVP,MCLR,NOCPD
#use delay(internal=4000000)
#use fast_io(a)
#use fast_io(b)
#define Rojo PIN_B0
#define Verde PIN_B1
#define Azul PIN_B2
#define Retardo 15
int16 caida_rojo,caida_verde,caida_azul,count_pwm;
int16 caida_rojo_2,caida_verde_2,caida_azul_2;
int i;
#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==255)
{
count_pwm=0;
if(caida_rojo_2==0 || caida_rojo==0)
output_low(Rojo);
else
output_high(Rojo);
if(caida_verde_2==0 || caida_verde==0)
output_low(Verde);
else
output_high(Verde);
if(caida_azul_2==0 || caida_azul==0)
output_low(Azul);
else
output_high(Azul);
}
set_timer0(231);
}
void demo()
{
caida_rojo=0;
caida_verde=0;
caida_azul=0;
for(i=0;i<=31;i++) // solo rojo++
{
caida_rojo=8*i;
delay_ms(Retardo);
}
caida_rojo=0;
for(i=0;i<=31;i++) // solo verde++
{
caida_verde=8*i;
delay_ms(Retardo);
}
caida_verde=0;
for(i=0;i<=31;i++) // solo azul++
{
caida_azul=8*i;
delay_ms(Retardo);
}
for(i=0;i<=31;i++) // azul(full) con rojo++
{
caida_rojo=8*i;
delay_ms(Retardo);
}
for(i=31;i>0;i--) // rojo(full) con azul--
{
caida_azul=8*i;
delay_ms(Retardo);
}
caida_azul=0;
for(i=0;i<=31;i++) // rojo(full) con verde++
{
caida_verde=8*i;
delay_ms(Retardo);
}
for(i=0;i<=31;i++) // rojo(full) con verde(full) con azul++
{
caida_azul=8*i;
delay_ms(Retardo);
}
for(i=31;i>0;i--) // azul(full) verde(full) rojo--
{
caida_rojo=8*i;
delay_ms(Retardo);
}
caida_rojo=0;
for(i=31;i>0;i--) // verde(full) azul--
{
caida_azul=8*i;
delay_ms(Retardo);
}
caida_azul=0;
for(i=31;i>0;i--) // verde--
{
caida_verde=8*i;
delay_ms(Retardo);
}
caida_verde=0;
}
void main()
{
setup_oscillator(OSC_4MHZ);
set_tris_a(255);
set_tris_b(0xf8);
output_b(0);
set_timer0(231);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while(true)
{
if(input(PIN_A0))
{
delay_ms(20);
while(input(PIN_A0))
{delay_ms(20);}
caida_rojo_2++;
caida_rojo=caida_rojo_2*16;
if(caida_rojo>255)
caida_rojo_2=0;
}
if(input(PIN_A1))
{
delay_ms(20);
while(input(PIN_A1))
{delay_ms(20);}
caida_verde_2++;
caida_verde=caida_verde_2*16;
if(caida_verde>255)
caida_verde_2=0;
}
if(input(PIN_A2))
{
delay_ms(20);
while(input(PIN_A2))
delay_ms(20);
caida_azul_2++;
caida_azul=caida_azul_2*16;
if(caida_azul>255)
caida_azul_2=0;
}
if(input(PIN_A3))
{
delay_ms(20);
while(input(PIN_A3))
{delay_ms(20);}
demo();
}
}
}Funciona con 4 pulsadores, uno para cada color (Rojo, Verde y Azul) y uno para el DEMO

aca el esquemita:

y el video

:
y por si acaso, todo comprimido en un rar:
http://www.4shared.com/file/35068382/e3282203/RGB.html (simulado con proteus 7.2 SP2)
beuno pues, ahi se los dejo, un saludo
