TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: MiCrOtRoNiC en 19 de Febrero de 2008, 02:06:16

Título: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 19 de Febrero de 2008, 02:06:16
Amigos buscando info en la red me tope con esto no se si alguien ya lo ha visto.pero aqui esat el link  RGB_LED_PWM (http://www.semifluid.com/?p=13)..el codigo esta hecho en un entorno que no conosco su extencion es .jal..seria bueno si lo pudieramos migrar a c de ccs para poder modificarlo y depurarle el codigo y agregarle mas efectos. no se a ustedes pero me agradan mucho los juegos de luces.. y bueno en ese lenguaje que esta hecho ni idea.. :mrgreen: :mrgreen: :mrgreen: :mrgreen:.}

(http://semifluid.com/PIC16F628_u8RGBLEDpwm.jpg)

Código: [Seleccionar]
include f628_4i -- Includes jpic628a.jal
-- (available at http://www.wahoo-wa.net/PICprojects)
include VarDelay
include nibsBPs

disable_comp
uart_init

var volatile byte rxDatatemp
var volatile byte theCount = 0
var volatile bit dataWaiting = low

--
-- LED3 - 1 |     | 18 - LED2
-- LED4 - 2 |     | 17 - LED1
--        3 |     | 16 - RED
--        4 |     | 15 - GREN
--  PS- - 5 |     | 14 - PS+
--        6 |     | 13 - LED8
--        7 |     | 12 - LED7
--        8 |     | 11 - LED6
-- BLUE - 9 |     | 10 - LED5
--
var volatile byte theLedsL is port_a_low = 0b1111
var volatile byte theLedsH is port_b_high = 0b1111
var volatile bit colorRed is pin_a7 = low
var volatile bit colorGreen is pin_a6 = low
var volatile bit colorBlue is pin_b3 = low

var volatile byte theLedsL_dir is port_a_low_direction = all_output
var volatile byte theLedsH_dir is port_b_high_direction = all_output
var volatile bit colorRed_dir is pin_a7_direction = output
var volatile bit colorGreen_dir is pin_a6_direction = output
var volatile bit colorBlue_dir is pin_b3_direction = output

var volatile byte led1Red = 16
var volatile byte led2Red = 12
var volatile byte led3Red = 10
var volatile byte led4Red = 8
var volatile byte led5Red = 6
var volatile byte led6Red = 4
var volatile byte led7Red = 2
var volatile byte led8Red = 1

var volatile byte led1Green = 0
var volatile byte led2Green = 0
var volatile byte led3Green = 0
var volatile byte led4Green = 0
var volatile byte led5Green = 0
var volatile byte led6Green = 0
var volatile byte led7Green = 0
var volatile byte led8Green = 0

var volatile byte led1Blue = 0
var volatile byte led2Blue = 0
var volatile byte led3Blue = 0
var volatile byte led4Blue = 0
var volatile byte led5Blue = 0
var volatile byte led6Blue = 0
var volatile byte led7Blue = 0
var volatile byte led8Blue = 0

procedure theDelay is
delay_10us(2)
end procedure

procedure getData is
async_rx (rxDatatemp,dataWaiting)
if dataWaiting then
-- Red
dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led1Red,led2Red)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led3Red,led4Red)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led5Red,led6Red)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led7Red,led8Red)

-- Green
dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led1Green,led2Green)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led3Green,led4Green)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led5Green,led6Green)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led7Green,led8Green)

-- Blue
dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led1Blue,led2Blue)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led3Blue,led4Blue)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led5Blue,led6Blue)

dataWaiting = low
while ! dataWaiting loop
async_rx (rxDatatemp,dataWaiting)
end loop
byteToNibs (rxDatatemp,led7Blue,led8Blue)
end if
end procedure

forever loop
theCount = theCount + 1
if theCount > 16 then theCount = 0 end if

-- Do Low LEDs
getData
colorRed = ( led1Red > theCount )
colorGreen = ( led1Green > theCount )
colorBlue = ( led1Blue > theCount )
theLedsL = 0b1110
theDelay
theLedsL = 0b1111

getData
colorRed = ( led2Red > theCount )
colorGreen = ( led2Green > theCount )
colorBlue = ( led2Blue > theCount )
theLedsL = 0b1101
theDelay
theLedsL = 0b1111

getData
colorRed = ( led3Red > theCount )
colorGreen = ( led3Green > theCount )
colorBlue = ( led3Blue > theCount )
theLedsL = 0b1011
theDelay
theLedsL = 0b1111

getData
colorRed = ( led4Red > theCount )
colorGreen = ( led4Green > theCount )
colorBlue = ( led4Blue > theCount )
theLedsL = 0b0111
theDelay
theLedsL = 0b1111

-- Do High LEDs
getData
colorRed = ( led5Red > theCount )
colorGreen = ( led5Green > theCount )
colorBlue = ( led5Blue > theCount )
theLedsH = 0b1110
theDelay
theLedsH = 0b1111

getData
colorRed = ( led6Red > theCount )
colorGreen = ( led6Green > theCount )
colorBlue = ( led6Blue > theCount )
theLedsH = 0b1101
theDelay
theLedsH = 0b1111

getData
colorRed = ( led7Red > theCount )
colorGreen = ( led7Green > theCount )
colorBlue = ( led7Blue > theCount )
theLedsH = 0b1011
theDelay
theLedsH = 0b1111

getData
colorRed = ( led8Red > theCount )
colorGreen = ( led8Green > theCount )
colorBlue = ( led8Blue > theCount )
theLedsH = 0b0111
theDelay
theLedsH = 0b1111
end loop
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: xootraoox en 20 de Febrero de 2008, 10:56:38
Amigo MiCrOtRoNiC, si te sirve, ya hay ejemplos de esto mismo en el foro y en la pagina de nuestro amigo nocturno.... si te interesa te paso una rutina que vengo usando ya hace como 2 años, la que va perfecta... ahora precisamente no la tengo aki para dejarla pero si es de interes dimelo y apenas pueda la coloco...
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 20 de Febrero de 2008, 11:09:27
Amigo MiCrOtRoNiC, si te sirve, ya hay ejemplos de esto mismo en el foro y en la pagina de nuestro amigo nocturno.... si te interesa te paso una rutina que vengo usando ya hace como 2 años, la que va perfecta... ahora precisamente no la tengo aki para dejarla pero si es de interes dimelo y apenas pueda la coloco...

pues bienvenida sea cualquier ayuda...
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: Nocturno en 20 de Febrero de 2008, 15:48:10
El ejemplo que yo tengo publicado sólo maneja un led rgb, pero estaré encantado de colgarlo si alguien hace una modificación para utilizar 8 a la vez, como en ese que habéis puesto.
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: doppel en 20 de Febrero de 2008, 15:53:41
El programa que has publicado está en JAL (just another language) que es una variante de BASIC.-

saludos

Hernán
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 21 de Febrero de 2008, 01:44:35
El ejemplo que yo tengo publicado sólo maneja un led rgb, pero estaré encantado de colgarlo si alguien hace una modificación para utilizar 8 a la vez, como en ese que habéis puesto.
mira estos MAESTRO NOCTURNO




y este pero es un POV LED RGB


JAJA mi futuro e stener mi cuarto asi  :mrgreen: :mrgreen: :mrgreen:
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: Meta en 21 de Febrero de 2008, 05:52:20
En el último vídeo me gusta tener una casa así. :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: Cryn en 23 de Febrero de 2008, 23:17:03
no esta nada mal el ultimo video, como adorno queda muy bien, pero ahí siempre he visto el mismo color en todos los leds, osea que si toca rojo, todo se pone rojo, si toca morado todo se pone morado, me entienden, en ello no creo que haya tanta dificultad, pero en cambio si existe cierta o mucha dificultad si quieres que un sector este de un color, o como en la imagen del primer post un ld rojo otro morado, otro amarillo, etc creo ahí está el reto, el penúltimo video tb es una muestra, excelente aplicación

espero un día poder hacer algo similar, si el tiempo me lo permite :mrgreen:
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: gu1llermo en 25 de Febrero de 2008, 02:57:22
Hola MiCrOtRoNiC, que curioso me puse a analizar el código y puedo decir que lo entendí  :shock: y espero poder pasarlo a C, el detallito es que no domino mucho C, así que tenganme un poquito de paciencia, pero me siento y lo hago. Una observación en el circuito no sé porque no le colocaron las resistencias correspondientes a cada color, yo creo que faltan. Bueno sé que lo que quieren es ver el código pero en cuanto lo tenga listo lo publico, aunque dependeré de alguién que lo monte en físico y me diga si le funciona. Estas noches me siento a tratar de convertirlo, me gustaron mucho los efectos de luces.  :mrgreen:

Estoy seguro que recibiré ayuda de su parte para corregir cualquier detallito u optimizar el código en C, sin embargo creo que les puedo comentar más o menos como entiendo que funciona:

El programa va multiplexando los 8 LEDS cada 20us, es decir enciende el LED1 durante 20us y luego lo apaga para encender el otro LED RGB 20us más y así sucesivamente, además el PIC consulta si tiene datos en la UART, si es así entonces está programado para recibir 12 bytes, luego cada byte lo separa en nibles, es decir la variable "rxDatatemp" que es de 8 bits (1 Byte) la separa en dos variables de 4 bits (1 Nible), luego esas variables pueden alcanzar un máximo valor de 15 (0 --> 15) es comparada con "theCount" y dependiendo si es mayor o menor, apaga o enciende el color correspondiente.

Bueno al menos es lo que e logrado entender porque también es 1era vez que veo éste JAL.

Aprovecho la oportunidad para preguntar como hacer en C para separar una variable de 8 bits en otra de 4, es posible esto? ó hay que valerse de algun truco?
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 25 de Febrero de 2008, 13:54:32
Hola MiCrOtRoNiC, que curioso me puse a analizar el código y puedo decir que lo entendí  :shock: y espero poder pasarlo a C, el detallito es que no domino mucho C, así que tenganme un poquito de paciencia, pero me siento y lo hago. Una observación en el circuito no sé porque no le colocaron las resistencias correspondientes a cada color, yo creo que faltan. Bueno sé que lo que quieren es ver el código pero en cuanto lo tenga listo lo publico, aunque dependeré de alguién que lo monte en físico y me diga si le funciona. Estas noches me siento a tratar de convertirlo, me gustaron mucho los efectos de luces.  :mrgreen:

Estoy seguro que recibiré ayuda de su parte para corregir cualquier detallito u optimizar el código en C, sin embargo creo que les puedo comentar más o menos como entiendo que funciona:

El programa va multiplexando los 8 LEDS cada 20us, es decir enciende el LED1 durante 20us y luego lo apaga para encender el otro LED RGB 20us más y así sucesivamente, además el PIC consulta si tiene datos en la UART, si es así entonces está programado para recibir 12 bytes, luego cada byte lo separa en nibles, es decir la variable "rxDatatemp" que es de 8 bits (1 Byte) la separa en dos variables de 4 bits (1 Nible), luego esas variables pueden alcanzar un máximo valor de 15 (0 --> 15) es comparada con "theCount" y dependiendo si es mayor o menor, apaga o enciende el color correspondiente.

Bueno al menos es lo que e logrado entender porque también es 1era vez que veo éste JAL.

Aprovecho la oportunidad para preguntar como hacer en C para separar una variable de 8 bits en otra de 4, es posible esto? ó hay que valerse de algun truco?

que bien amigo no llevan resistencias porq no es necesario por a velocidad de multiplexado de los leds..bueno tengo entendido eso..y me imagino que lo vas a implemetar con el ccs c compiler yo tambien me estoy iniciando en ccs..cualquier  novedad comentanos..salu2
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: gu1llermo en 26 de Febrero de 2008, 06:07:08
Bueno esta es una primera aproximación, la llamo así porque no la e probado y porque me imagino que el código tendrá sus detalles que corregir.

Código: [Seleccionar]
#include <16f877a.h>                         
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=20000000)                     // Oscilador a 20 Mhz
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06

#define theLedsL     ((myByte)port_a).low
#define theLedsH     ((myByte)port_b).high
#define dataWaiting  kbhit()

#bit colorRed     = port_a.7
#bit colorGreen   = port_a.6
#bit colorBlue    = port_b.3

#define   led1Red      led[0]
#define   led2Red      led[1]
#define   led3Red      led[2]
#define   led4Red      led[3]
#define   led5Red      led[4]
#define   led6Red      led[5]
#define   led7Red      led[6]
#define   led8Red      led[7]
   
#define   led1Green    led[8]
#define   led2Green    led[9]
#define   led3Green    led[10]
#define   led4Green    led[11]
#define   led5Green    led[12]
#define   led6Green    led[13]
#define   led7Green    led[14]
#define   led8Green    led[15]
   
#define   led1Blue    led[16]
#define   led2Blue    led[17]
#define   led3Blue    led[18]
#define   led4Blue    led[19]
#define   led5Blue    led[20]
#define   led6Blue    led[21]
#define   led7Blue    led[22]
#define   led8Blue    led[23]

// Declaración de Funciones
void theDelay(void);
void getData (int8 *);

// Rutina de retardo
void theDelay(void){
   delay_us(20);     // Retardo de 20 us
}

// Recepción de datos (12 Bytes)
void getData (int8 *led){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      *led1Red = rxDatatemp.low;
      *led2Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led3Red = rxDatatemp.low;
      *led4Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led5Red = rxDatatemp.low;
      *led6Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led7Red = rxDatatemp.low;
      *led8Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led1Green = rxDatatemp.low;
      *led2Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led3Green = rxDatatemp.low;
      *led4Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led5Green = rxDatatemp.low;
      *led6Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led7Green = rxDatatemp.low;
      *led8Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led1Blue = rxDatatemp.low;
      *led2Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led3Blue = rxDatatemp.low;
      *led4Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led5Blue = rxDatatemp.low;
      *led6Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led7Blue = rxDatatemp.low;
      *led8Blue = rxDatatemp.high;
   }
}


/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
   int8     led[24];// Son 24 Nibles a recibir (12 Bytes)
   
   led1Red=16;
   led2Red=12;
   led3Red=10;
   led4Red=8;
   led5Red=6;
   led6Red=4;
   led7Red=2;
   led8Red=1;
   
   led1Green=0;
   led2Green=0;
   led3Green=0;
   led4Green=0;
   led5Green=0;
   led6Green=0;
   led7Green=0;
   led8Green=0;
   
   led1Blue=0;
   led2Blue=0;
   led3Blue=0;
   led4Blue=0;
   led5Blue=0;
   led6Blue=0;
   led7Blue=0;
   led8Blue=0;
 
   set_tris_a(0b00000000);// Puerto A configurado como salida
   set_tris_b(0b00000000);// Puerto B configurado como salida
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>16) theCount=0;
     
      // Procesando los LEDs bajos
      getData(&led[0]);
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData(&led[0]);
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData(&led[0]);
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData(&led[0]);
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

Tengo una duda en cuanto a pasar el array por referencia, no sé si lo hice bien, si alguién podría corregir esa parte del código se lo agradecería.

MiCrOtRoNiC tu puedes probar para ver si esto funciona? ó cualquier otro forista interesado en el tema y así entre todos echemos andar este proyecto.

Saludos.
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 26 de Febrero de 2008, 09:55:38
Bueno esta es una primera aproximación, la llamo así porque no la e probado y porque me imagino que el código tendrá sus detalles que corregir.

Código: [Seleccionar]
#include <16f877a.h>                         
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=20000000)                     // Oscilador a 20 Mhz
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06

#define theLedsL     ((myByte)port_a).low
#define theLedsH     ((myByte)port_b).high
#define dataWaiting  kbhit()

#bit colorRed     = port_a.7
#bit colorGreen   = port_a.6
#bit colorBlue    = port_b.3

#define   led1Red      led[0]
#define   led2Red      led[1]
#define   led3Red      led[2]
#define   led4Red      led[3]
#define   led5Red      led[4]
#define   led6Red      led[5]
#define   led7Red      led[6]
#define   led8Red      led[7]
   
#define   led1Green    led[8]
#define   led2Green    led[9]
#define   led3Green    led[10]
#define   led4Green    led[11]
#define   led5Green    led[12]
#define   led6Green    led[13]
#define   led7Green    led[14]
#define   led8Green    led[15]
   
#define   led1Blue    led[16]
#define   led2Blue    led[17]
#define   led3Blue    led[18]
#define   led4Blue    led[19]
#define   led5Blue    led[20]
#define   led6Blue    led[21]
#define   led7Blue    led[22]
#define   led8Blue    led[23]

// Declaración de Funciones
void theDelay(void);
void getData (int8 *);

// Rutina de retardo
void theDelay(void){
   delay_us(20);     // Retardo de 20 us
}

// Recepción de datos (12 Bytes)
void getData (int8 *led){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      *led1Red = rxDatatemp.low;
      *led2Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led3Red = rxDatatemp.low;
      *led4Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led5Red = rxDatatemp.low;
      *led6Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led7Red = rxDatatemp.low;
      *led8Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led1Green = rxDatatemp.low;
      *led2Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led3Green = rxDatatemp.low;
      *led4Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led5Green = rxDatatemp.low;
      *led6Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led7Green = rxDatatemp.low;
      *led8Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led1Blue = rxDatatemp.low;
      *led2Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led3Blue = rxDatatemp.low;
      *led4Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led5Blue = rxDatatemp.low;
      *led6Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      *led7Blue = rxDatatemp.low;
      *led8Blue = rxDatatemp.high;
   }
}


/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
   int8     led[24];// Son 24 Nibles a recibir (12 Bytes)
   
   led1Red=16;
   led2Red=12;
   led3Red=10;
   led4Red=8;
   led5Red=6;
   led6Red=4;
   led7Red=2;
   led8Red=1;
   
   led1Green=0;
   led2Green=0;
   led3Green=0;
   led4Green=0;
   led5Green=0;
   led6Green=0;
   led7Green=0;
   led8Green=0;
   
   led1Blue=0;
   led2Blue=0;
   led3Blue=0;
   led4Blue=0;
   led5Blue=0;
   led6Blue=0;
   led7Blue=0;
   led8Blue=0;
 
   set_tris_a(0b00000000);// Puerto A configurado como salida
   set_tris_b(0b00000000);// Puerto B configurado como salida
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>16) theCount=0;
     
      // Procesando los LEDs bajos
      getData(&led[0]);
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData(&led[0]);
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData(&led[0]);
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData(&led[0]);
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData(&led[0]);
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

Tengo una duda en cuanto a pasar el array por referencia, no sé si lo hice bien, si alguién podría corregir esa parte del código se lo agradecería.

MiCrOtRoNiC tu puedes probar para ver si esto funciona? ó cualquier otro forista interesado en el tema y así entre todos echemos andar este proyecto.

Saludos.

claro paisa yo lo pruebo y te comento dejame comprar los diodos rgb porq no los tengo completos en este momento tengo como 2 solamente
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: gu1llermo en 26 de Febrero de 2008, 21:38:37
Bueno ésta es una 2da aproximación ya que no estoy muy seguro como trabajar con los parametros por referencia cuando es un array, declaré las variables implicadas como globales y listo, ahora restaría por verificar la comunicación.

Código: [Seleccionar]
#include <16f877a.h>                         
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=20000000)                     // Oscilador a 20 Mhz
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06

#define theLedsL     ((myByte)port_a).low
#define theLedsH     ((myByte)port_b).high
#define dataWaiting  kbhit()

#bit colorRed     = port_a.7
#bit colorGreen   = port_a.6
#bit colorBlue    = port_b.3

int8   led1Red=16,led2Red=12,led3Red=10,led4Red=8,led5Red=6,led6Red=4,led7Red=2,led8Red=1;
int8   led1Green=0,led2Green=0,led3Green=0,led4Green=0,led5Green=0,led6Green=0,led7Green=0,led8Green=0;
int8   led1Blue=0,led2Blue=0,led3Blue=0,led4Blue=0,led5Blue=0,led6Blue=0,led7Blue=0,led8Blue=0;

// Declaración de Funciones
void theDelay(void);
void getData (void);

// Rutina de retardo
void theDelay(void){
   delay_us(20);     // Retardo de 20 us
}

// Recepción de datos (12 Bytes)
void getData (void){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      led1Red = rxDatatemp.low;
      led2Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led3Red = rxDatatemp.low;
      led4Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led5Red = rxDatatemp.low;
      led6Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led7Red = rxDatatemp.low;
      led8Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led1Green = rxDatatemp.low;
      led2Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led3Green = rxDatatemp.low;
      led4Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led5Green = rxDatatemp.low;
      led6Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led7Green = rxDatatemp.low;
      led8Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led1Blue = rxDatatemp.low;
      led2Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led3Blue = rxDatatemp.low;
      led4Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led5Blue = rxDatatemp.low;
      led6Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led7Blue = rxDatatemp.low;
      led8Blue = rxDatatemp.high;
   }
}

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
 
   set_tris_a(0b00000000);// Puerto A configurado como salida
   set_tris_b(0b00000000);// Puerto B configurado como salida
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>16) theCount=0;
     
      // Procesando los LEDs bajos
      getData();
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData();
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData();
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

PD: MiCrOtRoNiC cuando todo te esté funcionando me gustaría ver un vídeo  :-/  :lol:
Título: Re: PIC16F628 Serial 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 27 de Febrero de 2008, 00:50:25
Bueno ésta es una 2da aproximación ya que no estoy muy seguro como trabajar con los parametros por referencia cuando es un array, declaré las variables implicadas como globales y listo, ahora restaría por verificar la comunicación.

Código: [Seleccionar]
#include <16f877a.h>                         
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=20000000)                     // Oscilador a 20 Mhz
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06

#define theLedsL     ((myByte)port_a).low
#define theLedsH     ((myByte)port_b).high
#define dataWaiting  kbhit()

#bit colorRed     = port_a.7
#bit colorGreen   = port_a.6
#bit colorBlue    = port_b.3

int8   led1Red=16,led2Red=12,led3Red=10,led4Red=8,led5Red=6,led6Red=4,led7Red=2,led8Red=1;
int8   led1Green=0,led2Green=0,led3Green=0,led4Green=0,led5Green=0,led6Green=0,led7Green=0,led8Green=0;
int8   led1Blue=0,led2Blue=0,led3Blue=0,led4Blue=0,led5Blue=0,led6Blue=0,led7Blue=0,led8Blue=0;

// Declaración de Funciones
void theDelay(void);
void getData (void);

// Rutina de retardo
void theDelay(void){
   delay_us(20);     // Retardo de 20 us
}

// Recepción de datos (12 Bytes)
void getData (void){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      led1Red = rxDatatemp.low;
      led2Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led3Red = rxDatatemp.low;
      led4Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led5Red = rxDatatemp.low;
      led6Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led7Red = rxDatatemp.low;
      led8Red = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led1Green = rxDatatemp.low;
      led2Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led3Green = rxDatatemp.low;
      led4Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led5Green = rxDatatemp.low;
      led6Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led7Green = rxDatatemp.low;
      led8Green = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led1Blue = rxDatatemp.low;
      led2Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led3Blue = rxDatatemp.low;
      led4Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led5Blue = rxDatatemp.low;
      led6Blue = rxDatatemp.high;
     
      //dataWaiting=0;
      while (!dataWaiting)
         delay_us(10);
      rxDatatemp = getc();
      led7Blue = rxDatatemp.low;
      led8Blue = rxDatatemp.high;
   }
}

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
 
   set_tris_a(0b00000000);// Puerto A configurado como salida
   set_tris_b(0b00000000);// Puerto B configurado como salida
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>16) theCount=0;
     
      // Procesando los LEDs bajos
      getData();
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData();
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData();
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

PD: MiCrOtRoNiC cuando todo te esté funcionando me gustaría ver un vídeo  :-/  :lol:
JAJAJ claro pero orita entre semana se me es dificil hacer la prueba tengo que comprar los leds rgb y orita ando corto de dinero :( :( :( sera el fin de semana... pense que ivas a utlizar el mismo micro el 628 pero no importa con el PIC16F877A esta bien....
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 27 de Febrero de 2008, 10:53:08
Si queremos usar el PIC16F628 entonces le cambiamos las 3 primera líneas y listo, quedando así:

#include <16f628a.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=4000000)

Y todo lo demás queda igual.

El CCS es una maravilla.  8)
Título: Re: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 27 de Febrero de 2008, 15:48:11
Si queremos usar el PIC16F628 entonces le cambiamos las 3 primera líneas y listo, quedando así:

#include <16f628a.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=4000000)

Y todo lo demás queda igual.

El CCS es una maravilla.  8)

si gu1llermo  eso es lo bueno...hasta orita me stoy documentando sobre el.. y me parece una maravilla...junto con el pic simulator ide en basic....apenas pueda montarlo en el protoboard lo subo....
Título: Re: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 01 de Marzo de 2008, 22:51:11
 :shock: :shock: lo simule en el proteus pero no se si es por la velocidad pero no alcanzo a ver la secuencia de encendido quiza por la velocidad de multiplezado, tendre que montarlo en el portoboard para verificar su funcionamiento...estoy buscando fuerza para comprar los leds rgb..apenas los consiga subo el video. :mrgreen:
Título: Re: 8 RGB LED PWM Controller
Publicado por: Cryn en 02 de Marzo de 2008, 02:24:50
la velocidad de simulación de proteus baja mucho, a veces demasiado cuando se multiplexa, por la frecuencia a la cual se manda los datos a cada led, eso siempre pasa, nose, talvez si se tiene una super computadora  :mrgreen: si se logre ver, aunque lo dudo pues el proteus debe ser el que no responde tan rápido.

Pero yo espero con ansias esos videos :mrgreen:   vamos, cuando puedas
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 02 de Marzo de 2008, 02:56:35
Hola, me he dado cuenta de algunos errores en el programa y los arreglé, y aproveché de agregarle  manejador de overrun, adicionalmente le coloqué una secuencia de multiplexado de 300ms para que lo simules en el proteus, pero recuerda cambiar a los 10us que recomienda el autor original, éste es el código resultante:

Código: [Seleccionar]
#include <16f628a.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_B2,rcv=PIN_B1)

#byte RCSTA=             0x018
#bit  CREN=              RCSTA.4      // Se activa para recepción continua
#bit  OERR=              RCSTA.1      // Error de Overrun

#use fast_io(A)
#use fast_io(B)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06

#define theLedsL     ((myByte)port_a).low
#define theLedsH     ((myByte)port_b).high
#define dataWaiting  kbhit()

#bit colorRed     = port_a.7
#bit colorGreen   = port_a.6
#bit colorBlue    = port_b.3


int8   led1Red=15;// 'F'
int8   led2Red=12;// 'C'
int8   led3Red=10;// 'A'
int8   led4Red=8;//  '8'
int8   led5Red=6;//  '6'
int8   led6Red=4;//  '4'
int8   led7Red=2;//  '2'
int8   led8Red=1;//  '1'

int8   led1Green=15;
int8   led2Green=12;
int8   led3Green=10;
int8   led4Green=8;
int8   led5Green=6;
int8   led6Green=4;
int8   led7Green=2;
int8   led8Green=1;

int8   led1Blue=15;
int8   led2Blue=12;
int8   led3Blue=10;
int8   led4Blue=8;
int8   led5Blue=6;
int8   led6Blue=4;
int8   led7Blue=2;
int8   led8Blue=1;

// Declaración de Funciones
void theDelay(void);
void getData (void);

// Rutina de retardo
void theDelay(void){
   delay_ms(300);// Coloqué 300ms solo para la simulación en proteus
   // pero para implementarlo en físico colocar delay_us(10)
}

// Recepción de datos (12 Bytes)
void getData (void){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      led1Red = rxDatatemp.low;
      led2Red = rxDatatemp.high;
     
      if (OERR) //  Si ocurre error por overrun nuestro pic no se cuelga
      {         //  y sigue esperando que le mandes de nuevo el byte
         CREN=0;//  que se le pasó
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Red = rxDatatemp.low;
      led4Red = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Red = rxDatatemp.low;
      led6Red = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led7Red = rxDatatemp.low;
      led8Red = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led1Green = rxDatatemp.low;
      led2Green = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Green = rxDatatemp.low;
      led4Green = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led5Green = rxDatatemp.low;
      led6Green = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Green = rxDatatemp.low;
      led8Green = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led1Blue = rxDatatemp.low;
      led2Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led3Blue = rxDatatemp.low;
      led4Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Blue = rxDatatemp.low;
      led6Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Blue = rxDatatemp.low;
      led8Blue = rxDatatemp.high;
   }
}

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000010);
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>15) theCount=0;
     
      // Procesando los LEDs bajos
      getData();
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData();
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData();
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

También se puede implementar el código con la función gets para recibir los 12 bytes de una sola vez, aunque no la e probado aún pero creo que si se puede.

He simulado éste código en el proteus y me funciona, aquí está una captura:

(http://img528.imageshack.us/img528/6343/rgbpg7.jpg)

Saludos.

PD: El único detalle es que hay que enviarle los datos uno a uno y no todos de una sola vez  :? sería cuestión de probar con la función gets.
Título: Re: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 02 de Marzo de 2008, 12:02:38
Hola, me he dado cuenta de algunos errores en el programa y los arreglé, y aproveché de agregarle  manejador de overrun, adicionalmente le coloqué una secuencia de multiplexado de 300ms para que lo simules en el proteus, pero recuerda cambiar a los 10us que recomienda el autor original, éste es el código resultante:

Código: [Seleccionar]
#include <16f628a.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_B2,rcv=PIN_B1)

#byte RCSTA=             0x018
#bit  CREN=              RCSTA.4      // Se activa para recepción continua
#bit  OERR=              RCSTA.1      // Error de Overrun

#use fast_io(A)
#use fast_io(B)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06

#define theLedsL     ((myByte)port_a).low
#define theLedsH     ((myByte)port_b).high
#define dataWaiting  kbhit()

#bit colorRed     = port_a.7
#bit colorGreen   = port_a.6
#bit colorBlue    = port_b.3


int8   led1Red=15;// 'F'
int8   led2Red=12;// 'C'
int8   led3Red=10;// 'A'
int8   led4Red=8;//  '8'
int8   led5Red=6;//  '6'
int8   led6Red=4;//  '4'
int8   led7Red=2;//  '2'
int8   led8Red=1;//  '1'

int8   led1Green=15;
int8   led2Green=12;
int8   led3Green=10;
int8   led4Green=8;
int8   led5Green=6;
int8   led6Green=4;
int8   led7Green=2;
int8   led8Green=1;

int8   led1Blue=15;
int8   led2Blue=12;
int8   led3Blue=10;
int8   led4Blue=8;
int8   led5Blue=6;
int8   led6Blue=4;
int8   led7Blue=2;
int8   led8Blue=1;

// Declaración de Funciones
void theDelay(void);
void getData (void);

// Rutina de retardo
void theDelay(void){
   delay_ms(300);// Coloqué 300ms solo para la simulación en proteus
   // pero para implementarlo en físico colocar delay_us(10)
}

// Recepción de datos (12 Bytes)
void getData (void){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      led1Red = rxDatatemp.low;
      led2Red = rxDatatemp.high;
     
      if (OERR) //  Si ocurre error por overrun nuestro pic no se cuelga
      {         //  y sigue esperando que le mandes de nuevo el byte
         CREN=0;//  que se le pasó
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Red = rxDatatemp.low;
      led4Red = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Red = rxDatatemp.low;
      led6Red = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led7Red = rxDatatemp.low;
      led8Red = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led1Green = rxDatatemp.low;
      led2Green = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Green = rxDatatemp.low;
      led4Green = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led5Green = rxDatatemp.low;
      led6Green = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Green = rxDatatemp.low;
      led8Green = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led1Blue = rxDatatemp.low;
      led2Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led3Blue = rxDatatemp.low;
      led4Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Blue = rxDatatemp.low;
      led6Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Blue = rxDatatemp.low;
      led8Blue = rxDatatemp.high;
   }
}

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000010);
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>15) theCount=0;
     
      // Procesando los LEDs bajos
      getData();
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData();
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData();
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

También se puede implementar el código con la función gets para recibir los 12 bytes de una sola vez, aunque no la e probado aún pero creo que si se puede.

He simulado éste código en el proteus y me funciona, aquí está una captura:

(http://img528.imageshack.us/img528/6343/rgbpg7.jpg)

Saludos.

PD: El único detalle es que hay que enviarle los datos uno a uno y no todos de una sola vez  :? sería cuestión de probar con la función gets.

epale gu1llermo puedes subir la simulacion del proteus quiero verificar algo a ver si estoy haciendo mal..porq no puedo simularlo..
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 02 de Marzo de 2008, 20:21:55
A mi también se me presentaron problemas en la simulación del proteus, por eso opté por utilizar el pic que siempre me ha simulado bien y es el 877, aquí está el código:

Código: [Seleccionar]
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#byte RCSTA=             0x018
#bit  CREN=              RCSTA.4      // Se activa para recepción continua
#bit  OERR=              RCSTA.1      // Error de Overrun

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

typedef struct  {

  int low   : 4;

  int high  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06
#byte port_c      = 0x07
#byte port_d      = 0x08
#byte port_e      = 0x09


#define theLedsL     ((myByte)port_d).low
#define theLedsH     ((myByte)port_d).high
#define dataWaiting  kbhit()

#bit colorRed     = port_c.0
#bit colorGreen   = port_c.1
#bit colorBlue    = port_c.2


int8   led1Red=15;
int8   led2Red=14;
int8   led3Red=13;
int8   led4Red=12;
int8   led5Red=11;
int8   led6Red=10;
int8   led7Red=9;
int8   led8Red=8;

int8   led1Green=15;
int8   led2Green=14;
int8   led3Green=13;
int8   led4Green=12;
int8   led5Green=11;
int8   led6Green=10;
int8   led7Green=9;
int8   led8Green=8;

int8   led1Blue=15;
int8   led2Blue=14;
int8   led3Blue=13;
int8   led4Blue=12;
int8   led5Blue=11;
int8   led6Blue=10;
int8   led7Blue=9;
int8   led8Blue=8;

// Declaración de Funciones
void theDelay(void);
void getData (void);

// Rutina de retardo
void theDelay(void){
   delay_ms(300);// Coloqué 300ms solo para la simulación en proteus
   // pero para implementarlo en físico colocar delay_us(10)
}

// Recepción de datos (12 Bytes)
void getData (void){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      led1Red = rxDatatemp.low;
      led2Red = rxDatatemp.high;
     
      if (OERR) //  Si ocurre error por overrun nuestro pic no se cuelga
      {         //  y sigue esperando que le mandes de nuevo el byte
         CREN=0;//  que se le pasó
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Red = rxDatatemp.low;
      led4Red = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Red = rxDatatemp.low;
      led6Red = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led7Red = rxDatatemp.low;
      led8Red = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led1Green = rxDatatemp.low;
      led2Green = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Green = rxDatatemp.low;
      led4Green = rxDatatemp.high;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led5Green = rxDatatemp.low;
      led6Green = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Green = rxDatatemp.low;
      led8Green = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led1Blue = rxDatatemp.low;
      led2Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led3Blue = rxDatatemp.low;
      led4Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Blue = rxDatatemp.low;
      led6Blue = rxDatatemp.high;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Blue = rxDatatemp.low;
      led8Blue = rxDatatemp.high;
   }
}

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000000);
   set_tris_c(0b10000000);
   set_tris_d(0b00000000);
   set_tris_e(0b00000000);
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>15) theCount=0;
     
      // Procesando los LEDs bajos
      getData();
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData();
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData();
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

Hice otros cambios, en cuánto a la conexión, utilicé otros puertos, adjunto la simulación en proteus para que la revisen y disfruten.

En el puerto DB9 de mi pc conecto mi calculadora hp48 y desde ésta le envío datos al pic que tengo simulado en proteus, lo que pasa es que no sé como enviar, por ejemplo, el carácter 255 de otra forma  :?

Adjunto una imagen para engancharlos  :wink:

(http://img108.imageshack.us/img108/5949/ledrgbmh3.jpg)

MiCrOtRoNiC de qué parte de Venezuela eres, yo estoy en Valencia y en las tiendas de electrónica cuando pregunto por un LED RGB ni siquiera sabían que existen, tienes información de cuánto salen y en dónde comprarlo?

Saludos.
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 03 de Marzo de 2008, 09:57:49
No sé qué sucede y ya me ha pasado varias veces y es que un día me funciona todo en proteus, los cambios que le hago al programa y todo funciona, pero al día siguiente ya no corre nada, el ejemplo anterior me corría todo bien, pero ahora no, no sé si a alguién le pasa igual ó seré que tengo que reinstalarlo de nuevo; otra cosa es que a veces estoy montando un circuito en él y se me cierra de golpe, sin avisar, por eso ahora cada cable que conecto salvo porque sino lo pierdo, estoy usando Proteus 7 SP2

----//////----

Lo reinstalé y me está corriendo la simulación, vamos a ver si mañana se mantiene
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 03 de Marzo de 2008, 11:04:59
Le hice otros cambio porque no sé porque el proteus no me andaba, el código es éste:

Código: [Seleccionar]
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#byte RCSTA=             0x018
#bit  CREN=              RCSTA.4      // Se activa para recepción continua
#bit  OERR=              RCSTA.1      // Error de Overrun

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

typedef struct  {

  int bajo   : 4;

  int alto  : 4; } myByte;

#byte port_a      = 0x05
#byte port_b      = 0x06
#byte port_c      = 0x07
#byte port_d      = 0x08
#byte port_e      = 0x09


#define theLedsL     ((myByte)port_d).bajo
#define theLedsH     ((myByte)port_d).alto
#define dataWaiting  kbhit()

#bit colorRed     = port_c.0
#bit colorGreen   = port_c.1
#bit colorBlue    = port_c.2


int8   led1Red=15;
int8   led2Red=14;
int8   led3Red=13;
int8   led4Red=12;
int8   led5Red=11;
int8   led6Red=10;
int8   led7Red=9;
int8   led8Red=8;

int8   led1Green=15;
int8   led2Green=14;
int8   led3Green=13;
int8   led4Green=12;
int8   led5Green=11;
int8   led6Green=10;
int8   led7Green=9;
int8   led8Green=8;

int8   led1Blue=15;
int8   led2Blue=14;
int8   led3Blue=13;
int8   led4Blue=12;
int8   led5Blue=11;
int8   led6Blue=10;
int8   led7Blue=9;
int8   led8Blue=8;

// Declaración de Funciones
void theDelay(void);
void getData (void);

// Rutina de retardo
void theDelay(void){
   delay_ms(300);// Coloqué 300ms solo para la simulación en proteus
   // pero para implementarlo en físico colocar delay_us(10)
}

// Recepción de datos (12 Bytes)
void getData (void){
   myByte   rxDatatemp;
   
   if (dataWaiting)// Hay datos para recibir??
   {
      rxDatatemp = getc();
      led1Red = rxDatatemp.bajo;
      led2Red = rxDatatemp.alto;
     
      if (OERR) //  Si ocurre error por overrun nuestro pic no se cuelga
      {         //  y sigue esperando que le mandes de nuevo el byte
         CREN=0;//  que se le pasó
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Red = rxDatatemp.bajo;
      led4Red = rxDatatemp.alto;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Red = rxDatatemp.bajo;
      led6Red = rxDatatemp.alto;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led7Red = rxDatatemp.bajo;
      led8Red = rxDatatemp.alto;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led1Green = rxDatatemp.bajo;
      led2Green = rxDatatemp.alto;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led3Green = rxDatatemp.bajo;
      led4Green = rxDatatemp.alto;
     
      if (OERR)
      {
         CREN=0;
         CREN=1;
      }
     
      rxDatatemp = getc();
      led5Green = rxDatatemp.bajo;
      led6Green = rxDatatemp.alto;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Green = rxDatatemp.bajo;
      led8Green = rxDatatemp.alto;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led1Blue = rxDatatemp.bajo;
      led2Blue = rxDatatemp.alto;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led3Blue = rxDatatemp.bajo;
      led4Blue = rxDatatemp.alto;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led5Blue = rxDatatemp.bajo;
      led6Blue = rxDatatemp.alto;

      if (OERR)
      {
         CREN=0;
         CREN=1;
      }

      rxDatatemp = getc();
      led7Blue = rxDatatemp.bajo;
      led8Blue = rxDatatemp.alto;
   }
}

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   int8     theCount = 0;
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000000);
   set_tris_c(0b10000000);
   set_tris_d(0b00000000);
   set_tris_e(0b00000000);
   
   theLedsL   = 0b1111;
   theLedsH   = 0b1111;
   
   colorRed    = 0;
   colorGreen  = 0;
   colorBlue   = 0;
   
   while (1)
   {
      theCount++;
      if (theCount>15) theCount=0;
     
      // Procesando los LEDs bajos
      getData();
      colorRed = ( led1Red > theCount );
      colorGreen = ( led1Green > theCount );
      colorBlue = ( led1Blue > theCount );
      theLedsL = 0b1110;//
      theDelay();       // Aqui empezamos a multeplexar los LEDs
      theLedsL = 0b1111;//
     
      getData();
      colorRed = ( led2Red > theCount );
      colorGreen = ( led2Green > theCount );
      colorBlue = ( led2Blue > theCount );
      theLedsL = 0b1101;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led3Red > theCount );
      colorGreen = ( led3Green > theCount );
      colorBlue = ( led3Blue > theCount );
      theLedsL = 0b1011;
      theDelay();
      theLedsL = 0b1111;
     
      getData();
      colorRed = ( led4Red > theCount );
      colorGreen = ( led4Green > theCount );
      colorBlue = ( led4Blue > theCount );
      theLedsL = 0b0111;
      theDelay();
      theLedsL = 0b1111;
     
      // Procesando los LEDs altos
      getData();
      colorRed = ( led5Red > theCount );
      colorGreen = ( led5Green > theCount );
      colorBlue = ( led5Blue > theCount );
      theLedsH = 0b1110;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led6Red > theCount );
      colorGreen = ( led6Green > theCount );
      colorBlue = ( led6Blue > theCount );
      theLedsH = 0b1101;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led7Red > theCount );
      colorGreen = ( led7Green > theCount );
      colorBlue = ( led7Blue > theCount );
      theLedsH = 0b1011;//
      theDelay();       //
      theLedsH = 0b1111;//
     
      getData();
      colorRed = ( led8Red > theCount );
      colorGreen = ( led8Green > theCount );
      colorBlue = ( led8Blue > theCount );
      theLedsH = 0b0111;//
      theDelay();       //
      theLedsH = 0b1111;//
   }
   }

Imagen de proteus:

(http://img254.imageshack.us/img254/603/rgbjl1.jpg)

Adjunto los archivos resultantes.

PD: Todo está funcionando.
Título: Re: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 03 de Marzo de 2008, 11:19:17
Que tal gu1llermo yo compro los componetes mas que todo online me sale mas economico que comprarlos en tiendas aqi y muchos no los hay

PD.a mi tambien me pasa los mismo con el proteus tengo que estar guardando porq esa m***a se me cierra solo...yo utilizo la 7,2 sp2..con windows vista ultimate

www.electronica.com.ve

www.ditel.com.ve  ---> esta en valencia!

yo soy de san cristobal..
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 03 de Marzo de 2008, 11:24:34
Hola!, si yo soy cliente fiel de ditel, pero allá no tienen todavía los LED RGB  :( voy a echarle un vistazo a la otra página a ver.

Saludos.
Título: Re: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 03 de Marzo de 2008, 11:29:40
Hola!, si yo soy cliente fiel de ditel, pero allá no tienen todavía los LED RGB  :( voy a echarle un vistazo a la otra página a ver.

Saludos.

es que a veces unos le pregunta a los vendedores y no saben nada de eso..casi que te dicen la Tuya JAJAJA.. en www.electronica.com.ve ahi estan los rgb a 6bsf cada uno..en esta pagina me parece muy economico mas q ditel....pero en ditel ahi cosas q no tiene electronica.com.ve y al contrario tambien.
Título: Re: 8 RGB LED PWM Controller
Publicado por: gu1llermo en 03 de Marzo de 2008, 11:47:02
Valen 6BsF., ya por allí son 48BsF. más el pic, pero ya tengo el pic, y como la tienda queda en margarita hay que pagar envío que no sé cuánto será hasta acá por mrw, según el esquema tendríamos que comprar Cátodo común para tener acceso al ánodo y poder multiplexar por color según el circuito que tenemos montado.

Llamé a Ditel y lo más cerca que tienen es un LED 5mm Intermitente 3Colores (R-V-Az), con solo dos patas y un integrado interno que va cambiando los colores  :? si ellos lo tuvieran me ahorro el envío  8) y la cola en el banco para hacer el depósito.

Bueno ya tenemos todo para montarlo solo faltan los LEDs y esos ya están en camino.  :wink:

...
es que a veces unos le pregunta a los vendedores y no saben nada de eso..casi que te dicen la Tuya JAJAJA.. ...

jajaja cierto :D :D :D

Saludos.
Título: Re: 8 RGB LED PWM Controller
Publicado por: MiCrOtRoNiC en 03 de Marzo de 2008, 11:54:42
jeje el envio sale en 25 con mrw yo ya le he comprado varias veces a ellos pero ahora lo envian por zoom es mas caro ahora vale 30 bsf....es bueno si compras bastante componentes te sale mas barato...igual que el pic es mucho mas baratoq ue aqi en san cristobal.....tratare de comprar los rgb esta semana junto con otras cosillas..jeje no me gusta cobrar pero va tocar empezar a buscar por ahi gente que me debe...de unas formatiadas a unos equipos de un cyber

salu2