Autor Tema: 8 RGB LED PWM Controller  (Leído 18957 veces)

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

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
8 RGB LED PWM Controller
« 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..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:.}



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
« Última modificación: 27 de Febrero de 2008, 00:50:55 por MiCrOtRoNiC »

Desconectado xootraoox

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 248
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #1 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...

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #2 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...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #3 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.

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #4 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
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #5 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:
« Última modificación: 21 de Febrero de 2008, 01:50:14 por MiCrOtRoNiC »

Meta

  • Visitante
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #6 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:

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #7 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:
.

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #8 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?

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #9 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

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #10 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.

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #11 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

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #12 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:
« Última modificación: 26 de Febrero de 2008, 21:44:06 por gu1llermo »

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC16F628 Serial 8 RGB LED PWM Controller
« Respuesta #13 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....

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: 8 RGB LED PWM Controller
« Respuesta #14 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)


 

anything