#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use fast_io (B)
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte PORTA = 0x05
#byte PORTB = 0x06
#bit LedRojo = PORTA.0
#bit LedVerde = PORTA.1
#bit LedAzul = PORTA.2
char buffer[20];
int8 Rojo,Verde,Azul, Ticks, Midireccion;
int8 CaracteresRecibidos = 0;
int1 ComandoRecibido;
#int_RDA
void RDA_isr(void)
{
char c;
c=getc();
putchar(c);
buffer[CaracteresRecibidos] = c;
if (c==13)
ComandoRecibido=true;
else
CaracteresRecibidos = (CaracteresRecibidos+1) % sizeof(buffer);
}
#int_TIMER0
void TIMER0_isr(void)
{
Ticks++;
if (Ticks==0) {
LedAzul=1;
LedRojo=1;
LedVerde=1;
};
if (Ticks==Rojo)
LedRojo=0;
if (Ticks==Verde)
LedVerde=0;
if (Ticks==Azul)
LedAzul=0;
set_timer0(140);
}
void ProcesaRGB() {
int8 i=0;
int8 Direccion = 0;
int1 CambiandoRojo, CambiandoVerde, CambiandoAzul, Miradireccion;
CambiandoRojo=false;
CambiandoVerde=false;
CambiandoAzul=false;
Miradireccion=false;
while (i<CaracteresRecibidos) {
if ((Buffer[i]=='d') || (Buffer[i]=='D')) {
Miradireccion=true;
CambiandoRojo=false;
CambiandoVerde=false;
CambiandoAzul=false;
Direccion=0;
}
if (((Buffer[i]=='r') || (Buffer[i]=='R')) && (Midireccion == Direccion)){
Miradireccion=false;
CambiandoRojo=true;
CambiandoVerde=false;
CambiandoAzul=false;
Rojo=0;
}
if (((Buffer[i]=='g') || (Buffer[i]=='G')) && (Midireccion == Direccion)) {
Miradireccion=false;
CambiandoRojo=false;
CambiandoVerde=true;
CambiandoAzul=false;
Verde=0;
}
if (((Buffer[i]=='b') || (Buffer[i]=='B')) && (Midireccion == Direccion)) {
Miradireccion=false;
CambiandoRojo=false;
CambiandoVerde=false;
CambiandoAzul=true;
Azul=0;
}
if ((Buffer[i]>='0') && (Buffer[i]<='9')) {
if (Miradireccion)
Direccion=Direccion*10+Buffer[i]-48;
if (CambiandoRojo)
Rojo=Rojo*10+Buffer[i]-48;
if (CambiandoVerde)
Verde=Verde*10+Buffer[i]-48;
if (CambiandoAzul)
Azul=Azul*10+Buffer[i]-48;
}
i++;
}
printf ("Color establecido: Rojo = %u, Verde = %u, Azul = %u \n\r\n\r",Rojo,Verde,Azul);
CaracteresRecibidos=0;
ComandoRecibido=false;
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x00);
Rojo=0;
Verde=0;
Azul=0;
Ticks=0;
Midireccion=5; // Direccion del dispositivo.
ComandoRecibido=false;
printf ("Jugando con LEDS RGB\n\r\n\r");
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER0);
enable_interrupts (GLOBAL);
while (1) {
if (ComandoRecibido)
ProcesaRGB();
}
}claro que casa esclavo puede recibir el mismo comando o diferente comando, cada esclavo puede ponerle varios conmutadores para direcionarlos, es los mismo que el dmx512, las tramas del master puede se por Ejp.32 canales y los respectivos esclavos se activan segun como tenga sus direciones,
Saludos
A cada LED le vas a poner un PIC esclavo?
No te iria bien si en una placa pones un PIC de 40 pines con un transistor para cada LED y por medio del transistor le envias la señal de PWM a cada LED?
Esta comunicacion tambien se podria hacer RS232, te da hasta 30m aprox. bueno no se como es de grande ni de ruidoso el pub (si pone bacalao y heavy necesitaras el 485 que es para ambientes industriales con mucho ruido :lol: :lol:).
Saludos
El problema, por lo que me ha comentado mi compañero es que los huecos a iluminar estan por todo el bar y no juntos, sino, como ya habia mencionado antes, habria usado el TLC5940 y con un PIC mas simple lo tendria mas que hecho, pero se agradece la sugerencia
Un saludo!
CitarEl problema, por lo que me ha comentado mi compañero es que los huecos a iluminar estan por todo el bar y no juntos, sino, como ya habia mencionado antes, habria usado el TLC5940 y con un PIC mas simple lo tendria mas que hecho, pero se agradece la sugerencia
Un saludo!
Ya pero los cables los tienes que llevar igual no? para un esclavo y el LED minimo tres cables, si envias el PWM ya hecho tienes que llevar 2, masa y el PWM por el +, o hay algun otro problema?
Ya pero los cables los tienes que llevar igual no? para un esclavo y el LED minimo tres cables, si envias el PWM ya hecho tienes que llevar 2, masa y el PWM por el +, o hay algun otro problema?
No se si estoy metiendo la pata, pero estamos hablando de leds RGB por lo que para cada led necesitamos 3 señales PWM mas la masa. Y a parte, si estos tienen que ser independientes ya no nos basta el pic que comentaban antes de 40 patas :P
un saludo.
Así, si conectamos nuestro PIC al puerto serie del PC, podemos enviarle comandos como estos:
R120G60B240 -> establece Rojo = 120, Verde = 60 y Azul = 240
R34G180 -> establece Rojo = 34, Verde = 180 y deja el azul como estaba.
Pues bien, leyendos todos los comentarios aqui de los amigos,
...lo mas facil es un DIPSWITCH, asi puede direcionar todos los esclavos a Voluntad...
Buenas Strepto, te comento algo similar que me hizo falta y practicamente el proyecto es igual. Para evitar poner un dipswitch agregue un comando para dispositivos nuevos, sencillamente leo el primer byte de la eeprom, cuando es nuevo es 'FF', pues al recibir comando de nuevo dispositivo si es FF pues lo cambio por el valor enviado, en tu caso podria ser 'N12' Nuevo con direccion 12. Asi me da de sobra para 255 dispositivos que son mas que suficientes para mi, sino hay mas memoria. La unica pega es que tienes que ir conectandolos uno a uno y mandar la orden de nuevo, pero como igualmente se conectan uno a uno pues....
Espero te sirva de ayuda....
Cuidado con lo de los 2 dispositivos con la misma dirección, ya que si en un futuro como comentastes quieres que los esclavos puedan contestar puedes tener problemas de colisión de datos.
saludos.
Por que siempre habra un momento, en el primer arranque en el que todos sean nuevos dispositivos, vamos, que sean "FF". Esto como lo solucionastes?
#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=8000000)
#use rs232(baud=19200,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use fast_io (B)
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte PORTA = 0x05
#byte PORTB = 0x06
// 5 bits para conseguir la direccion del dispositivo (Midireccionreal)
#bit RA0 = PORTA.0
#bit RA1 = PORTA.1
#bit RA2 = PORTA.2
#bit RA3 = PORTA.3
#bit RA4 = PORTA.4
#bit LedRojo = PORTB.7
#bit LedVerde = PORTB.6
#bit LedAzul = PORTB.3
#bit TX_RX_485 = PORTA.6 //En desuso hasta que se pueda probar con el master
char buffer[20];
int8 Rojo,Verde,Azul, Ticks, Midireccionreal, Midireccionvirtual;
int8 CaracteresRecibidos = 0;
int1 ComandoRecibido;
void Cojedireccion (void);
#int_RDA
void RDA_isr(void)
{
char c;
c=getc();
putchar(c);
buffer[CaracteresRecibidos] = c;
if (c==13)
ComandoRecibido=true;
else
CaracteresRecibidos = (CaracteresRecibidos+1) % sizeof(buffer);
}
#int_TIMER0
void TIMER0_isr(void)
{
Ticks++;
if (Ticks==0) {
LedAzul=1;
LedRojo=1;
LedVerde=1;
};
if (Ticks==Rojo)
LedRojo=0;
if (Ticks==Verde)
LedVerde=0;
if (Ticks==Azul)
LedAzul=0;
set_timer0(140);
}
void Cojedireccion (void){
Midireccionreal=0;
if (RA0 == 1)
Midireccionreal=Midireccionreal+1;
if (RA1 == 1)
Midireccionreal=Midireccionreal+2;
if (RA2 == 1)
Midireccionreal=Midireccionreal+4;
if (RA3 == 1)
Midireccionreal=Midireccionreal+8;
if (RA4 == 1)
Midireccionreal=Midireccionreal+16;
}
void ProcesaRGB() {
int8 i=0;
int8 Direccion = 0;
int1 CambiaRojo, CambiaVerde, CambiaAzul, Miradireccion, Cambiadireccion;
CambiaRojo=false;
CambiaVerde=false;
CambiaAzul=false;
Miradireccion=false;
Cambiadireccion=false;
while (i<CaracteresRecibidos) {
if ((Buffer[i]=='D') && ((Buffer[i-1]=='R') || (Buffer[i-1]=='V'))) {
Miradireccion=true;
CambiaRojo=false;
CambiaVerde=false;
CambiaAzul=false;
Direccion=0;
}
if ((Direccion == Midireccionreal) || (Direccion == Midireccionvirtual)) {
if (Buffer[i]=='C') { //Cambio de direccion virtual
Miradireccion=false;
Cambiadireccion=true;
CambiaRojo=false;
CambiaVerde=false;
CambiaAzul=false;
Midireccionvirtual=0;
printf("Direccion Virtual cambiada \n\r\n\r");
}
if (Buffer[i]=='R') {
Miradireccion=false;
Cambiadireccion=false;
CambiaRojo=true;
CambiaVerde=false;
CambiaAzul=false;
Rojo=0;
}
if (Buffer[i]=='G') {
Miradireccion=false;
Cambiadireccion=false;
CambiaRojo=false;
CambiaVerde=true;
CambiaAzul=false;
Verde=0;
}
if (Buffer[i]=='B') {
Miradireccion=false;
Cambiadireccion=false;
CambiaRojo=false;
CambiaVerde=false;
CambiaAzul=true;
Azul=0;
}
}
if ((Buffer[i]>='0') && (Buffer[i]<='9')) {
if (Miradireccion)
Direccion=Direccion*10+Buffer[i]-48;
if(Cambiadireccion)
Midireccionvirtual=Midireccionvirtual*10+Buffer[i]-48;
if (CambiaRojo)
Rojo=Rojo*10+Buffer[i]-48;
if (CambiaVerde)
Verde=Verde*10+Buffer[i]-48;
if (CambiaAzul)
Azul=Azul*10+Buffer[i]-48;
}
i++;
}
printf ("Color establecido: Rojo = %u, Verde = %u, Azul = %u \n\r\n\r",Rojo,Verde,Azul);
CaracteresRecibidos=0;
ComandoRecibido=false;
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x1F); //Se configura para 5 entradas y 3 salidas
set_tris_b(0x37); //Se configuran los pines de los Leds como salidas y el resto como entradas
Rojo=0;
Verde=0;
Azul=0;
Ticks=0;
ComandoRecibido=false;
Cojedireccion();
Midireccionvirtual = Midireccionreal;
printf ("Jugando con LEDS RGB Direccion real: %u, Direccion Virtual: %u. \n\r\n\r", Midireccionreal,Midireccionvirtual);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER0);
enable_interrupts (GLOBAL);
while (1) {
if (ComandoRecibido)
ProcesaRGB();
}
}
#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use fast_io(a)
#use fast_io(b)
#byte PORTA=0x05
#byte PORTB=0x06
#bit LedRojo = PORTA.0
#bit LedVerde = PORTA.1
#bit LedAzul = PORTA.2
#define Retardo 1
char buffer[20];
int8 Rojo,Verde,Azul, Ticks, MiID, MiGD;
int8 CaracteresRecibidos = 0;
int1 ComandoRecibido;
#int_Timer0
void ActivaLed() {
Ticks++;
if (Ticks == 0) {
if(Rojo >= 1) LedRojo = 1;
if(Verde >= 1) LedVerde = 1;
if(Azul >= 1) LedAzul = 1;
}
if (Ticks == Rojo) LedRojo = 0;
if (Ticks == Verde) LedVerde = 0;
if (Ticks == Azul) LedAzul = 0;
set_timer0(140);
}
#INT_RDA
void serial_isr()
{
char c;
c=getc();
putchar(c);
buffer[CaracteresRecibidos] = c;
if (c == 13) // el numero 13 hacer referencia en el codigo ascii al final de carrera.
ComandoRecibido = true;
else
CaracteresRecibidos = (CaracteresRecibidos + 1) % sizeof(buffer);
}
void ProcesaRGB() {
int8 i = 0, ID = 0, GD = 0, TD;
int1 CambiandoRojo, CambiandoVerde, CambiandoAzul, CambiaMiGD, MiraID, MiraGD;
CambiandoRojo = false;
CambiandoVerde = false;
CambiandoAzul = false;
CambiaMiGD = false;
while (i<CaracteresRecibidos) {
if ((Buffer[i] == 'D') && (Buffer[i-1] == 'T')){
TD = 1;
}
if ((Buffer[i] == 'D') && (Buffer[i-1] == 'I')){
MiraID = true;
MiraGD = false;
CambiaMiGD = false;
CambiandoRojo = false;
CambiandoVerde = false;
CambiandoAzul = false;
ID = 0;
}
if ((Buffer[i] == 'D') && (Buffer[i-1] == 'G')){
MiraID = false;
MiraGD = true;
CambiaMiGD = false;
CambiandoRojo = false;
CambiandoVerde = false;
CambiandoAzul = false;
GD = 0;
}
if ((ID == MiID) || (GD == MiGD ) || (TD == 1)) {
if ((ID == MiID) && (Buffer[i] == 'C')){
MiraID = false;
MiraGD = false;
CambiaMiGD = true;
CambiandoRojo = false;
CambiandoVerde = false;
CambiandoAzul = false;
MiGD = 0;
printf("Direccion de Grupo cambiada \n\r\n\r");
}
if (Buffer[i] == 'R'){
MiraID = false;
MiraGD = false;
CambiaMiGD = false;
CambiandoRojo = true;
CambiandoVerde = false;
CambiandoAzul = false;
Rojo = 0;
}
if (Buffer[i] == 'G'){
MiraID = false;
MiraGD = false;
CambiaMiGD = false;
CambiandoRojo = false;
CambiandoVerde = true;
CambiandoAzul = false;
Verde = 0;
}
if (Buffer[i] == 'B'){
MiraID = false;
MiraGD = false;
CambiaMiGD = false;
CambiandoRojo = false;
CambiandoVerde = false;
CambiandoAzul = true;
Azul = 0;
}
}
if ((Buffer[i] >= '0') && (Buffer[i] <= '9')) {
if (MiraID) ID = ID * 10 + Buffer[i] - 48;
if (MiraGD) GD = GD * 10 + Buffer[i] -48;
if (CambiaMiGD) MiGD = MiGD * 10 + Buffer[i] -48;
if (CambiandoRojo) Rojo = Rojo * 10 + Buffer[i] - 48;
if (CambiandoVerde) Verde = Verde * 10 + Buffer[i] - 48;
if (CambiandoAzul) Azul = Azul * 10 + Buffer[i] - 48;
}
i++;
}
printf ("Color establecido: Rojo = %u, Verde = %u, Azul = %u \n\r\n\r",Rojo,Verde,Azul);
CaracteresRecibidos = 0;
ComandoRecibido = false;
TD = 0;
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(OSC_8MHZ|OSC_INTRC);
set_tris_A(0);
Rojo = 0;
Verde = 0;
Azul = 0;
Ticks = 0;
MiID = 1; // ID del dispositivo
MiGD = 2; // GD del dispositivo
ComandoRecibido = false;
printf ("Jugando con LEDS RGB \n\r\n\r");
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER0);
enable_interrupts (GLOBAL);
while (1) {
if (ComandoRecibido)
ProcesaRGB();
}
}Buenas, yo tengo algo parecido... pero trabajando con Arduino. Lo más practico me parece es enviarle tras unos caracteres que serán la "ID" del receptor, el código del color que quieres encender en formato hexadecimal, tal cual el código HTML (http://html-color-codes.info/codigos-de-colores-hexadecimales/).
Parece que "jugar" con leds RGB es muy popular :mrgreen:
http://ardublog-danidroid.blogspot.com/2012/02/control-de-un-led-rgb.html