TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado 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)
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
-
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...
-
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...
-
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.
-
El programa que has publicado está en JAL (just another language) que es una variante de BASIC.-
saludos
Hernán
-
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:
-
En el último vídeo me gusta tener una casa así. :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:
-
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:
-
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?
-
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
-
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.
#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.
-
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.
#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
-
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.
#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:
-
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.
#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....
-
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 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....
-
: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:
-
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
-
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:
#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.
-
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:
#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..
-
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:
#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.
-
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
-
Le hice otros cambio porque no sé porque el proteus no me andaba, el código es éste:
#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.
-
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..
-
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.
-
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.
-
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.
-
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