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

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

Desconectado MiCrOtRoNiC

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

Desconectado MiCrOtRoNiC

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

Desconectado Cryn

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

Desconectado gu1llermo

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



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.
« Última modificación: 02 de Marzo de 2008, 03:01:26 por gu1llermo »

Desconectado MiCrOtRoNiC

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



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..

Desconectado gu1llermo

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



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.
« Última modificación: 03 de Marzo de 2008, 11:22:53 por gu1llermo »

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: 8 RGB LED PWM Controller
« Respuesta #21 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
« Última modificación: 03 de Marzo de 2008, 10:30:28 por gu1llermo »

Desconectado gu1llermo

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



Adjunto los archivos resultantes.

PD: Todo está funcionando.
« Última modificación: 03 de Marzo de 2008, 11:08:36 por gu1llermo »

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: 8 RGB LED PWM Controller
« Respuesta #23 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..
« Última modificación: 03 de Marzo de 2008, 11:26:23 por MiCrOtRoNiC »

Desconectado gu1llermo

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

Desconectado MiCrOtRoNiC

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

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: 8 RGB LED PWM Controller
« Respuesta #26 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.
« Última modificación: 03 de Marzo de 2008, 11:49:39 por gu1llermo »

Desconectado MiCrOtRoNiC

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