Dimmer electronico a control remoto PIC 12F675

#1
Bueno amigos del foro yo otra vez proponiendo otro proyectito complementando al proyecto del dimmer digital ya propuesto ahora les paso uno a control remoto con el PIC 12f675 pero, para esta aplicación se está utilizando 2 PIC's ya que se me hizo un poco complicado hacerlo con uno pero es un avance, sin mas preámbulos les dejo los códigos de cada PIC. Ahh las señales de control remoto son de la marca SONY es un decodificador SIR a esta aplicación si quieren aumentarle mas aplicaciones simplemente en el código del decodificador en la parte del CASE pueden aumentar los diferentes opciones del control remoto, como channel +/-, mute, enter, etc. y el programa ya los reconoce. Bueno el primer código es el siguiente que es para el dimmer digtal.

Código:
#include <12F675.h>
#fuses   INTRC_IO,NOWDT,PUT,NOPROTECT,NOCPD,NOMCLR,BROWNOUT
#use     delay(clock=4000000)
#define  GP0 PIN_A0   // ON-OFF
#define  GP1 PIN_A1   // CONTROL REMOTO IR
#define  GP2 PIN_A2   // DETECTOR CRUCE POR CERO
#define  GP3 PIN_A3   // RESET
#define  GP4 PIN_A4   // UP
#define  GP5 PIN_A5   // DOWN

unsigned int16 fase=57536;
int1 cambio=0, indicador;

#int_TIMER1                      //Interrupción del TIMER1
void time()
{
 output_low(GP0);                //Se desbordó el TIMER1 y pongo en "1" el gate del triac
}

#INT_EXT                         //Interrupción externa.
void cero()                      //Función de la interrupción externa
{
 output_high(GP0);               //Pongo en "0" el gate del triac
 set_timer1(fase);               //Cargo el TIMER1 con el valor determinado por las teclas y espera que desborde
 enable_interrupts(INT_TIMER1);  //Habilito la interrupción del TIMER1 y salta a su respectiva interrupción

 if(cambio==0)                   //Para ver con que flanco de interrumpirá ahora
 {
  ext_int_edge(H_TO_L);          //Interrupción con flanco de bajada
  cambio=1;                      //Cambia para que la proxima la interrupción sea en flanco de subida
 }
 else
 {
  ext_int_edge(L_TO_H);          //Interrupción con flanco de subida
  cambio=0;                      //Cambia para que la proxima la interrupción sea en flanco de bajada
 }
}

void main()                      //Función principal
{
 ext_int_edge(L_TO_H);           //Primera interrupción se dará en flanco de subida
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);  //Configuración de TIMER1
 enable_interrupts(INT_EXT);     //Habilito interrupciones externas
 enable_interrupts(GLOBAL);      //Habilito las interrupciones generales
 //output_low(GP0);
 
Do{
  restart_wdt();                 //Apago el watch dog timer
  if(input(GP4)==1)              //Si el pulsador se a apretado
  {if(fase<=64536&&fase>57536){delay_ms(1); fase=fase-10;}} //Aumenta la luminicidad
  if(input(GP5)==1)              //Si el pulsador se a apretado
  {if(fase>=57536&&fase<64536){delay_ms(1); fase=fase+10;}} //Disminiye la luminicidad
  if(input(GP1)==1)
  {
   delay_ms(500);
   if(indicador==0)
   {
    delay_us(100);
    fase=57536;
    enable_interrupts(GLOBAL);
    indicador = 1;
   }
   else
   {
    delay_us(100);
    output_low(GP0);
    disable_interrupts(GLOBAL);
    indicador = 0;
   }
  }
 }while(1);
}
Ahora el código para el segundo micro que es para la decodificación de las señales de infrarrojo del control SONY, que sólo esta para el volumen +/- y el ON/OFF.

Código:
#include <12F675.h>
#fuses   INTRC_IO,NOWDT,PUT,NOPROTECT,NOCPD,NOMCLR,BROWNOUT
#use     delay(clock=4000000)
#define  GP0 PIN_A0   // 
#define  GP1 PIN_A1   // 
#define  GP2 PIN_A2   // CONTROL REMOTO IR
#define  GP3 PIN_A3   // RESET
#define  GP4 PIN_A4   // UP
#define  GP5 PIN_A5   // DOWN

void take_adress(void);
void take_command(void);

int i, j, longitud=12, start, adress, command, cambio=0, dato_recibido=0;
int16 tiempo;
long word;

#INT_EXT                         //Interrupción externa.
void lectuta()                   //Función de la interrupción externa
{
 if (cambio == 0)                
 {
  set_timer0(0);                 //Iniciamos en cero el timer 0
  tiempo = 0;
  ext_int_edge(L_TO_H);          //Habilitamos la interrupción de flaco de subida
  cambio = 1;                    
 }
 else
 {
  tiempo = get_timer0();         //Atrapamos el valor de timer cero
  ext_int_edge(H_TO_L);          //Habilitamos la interrupción por flanco de bajada
  cambio = 0;
 }
 if (tiempo > 145 && tiempo < 155)
  {
   start = 1;
   i = 0;
  }
 if (start == 1)
 {
  if (tiempo > 30 && tiempo < 44)
  {
   bit_clear(word,i);                  // Añadimos el bit a la palabra
   i++;
  }
  if (tiempo > 70 && tiempo < 80)
  {
   bit_set(word,i);                       // Añadimos el bit a la palabra
   i++;
  }
 if(i == longitud)                         // Si contador = total de bits
  { 
   take_adress();                  // Cogemos la Dirección
   take_command();                 // Cogemos el Comando
   dato_recibido = 1;                 // flag dato redibido activado
   EXT_INT_EDGE(H_TO_L);            // Flanco de subida para el START
   start = 0;                         // Inicialización para la siguiente palabra
   word = 0;                          //borramos la palabra
  }
 }
}

void take_adress(void)              // Separamos la dirección de la palabra
{
 i = longitud-1;
 adress = 0;
 for(j = 0;j < longitud - 7;j++)           // Hacemos un recorrido al revés
 {
  adress = adress << 1;               //al revés para separar la direccion
  adress = adress + bit_test(word,i);
  i--;
 }
}

void take_command(void)             //Separamos el comando de la palabra
{
 i = 6;
 command = 0;
 for(j = 0;j < 7;j++)                   // Hacemos un recorrido para separar el comando
 {
  command = command << 1;
  command = command + bit_test(word,i);
  i--;
 }
}

void main()
{
 ext_int_edge(H_TO_L);           //Primera interrupción se dará en flanco de subida
 cambio = 0;
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);  //Configuración de TIMER0
 enable_interrupts(INT_EXT);     //Habilito interrupciones externas
 enable_interrupts(GLOBAL);      //Habilito las interrupciones generales
 
 DO
 {
  if(start == 0)                    // Si hem rebut START, esperem dades
  { 
   while(!dato_recibido);         // Esperamos mientras recibimos datos
   dato_recibido=0;               // Ponemos datos recibidos a 0
   DISABLE_INTERRUPTS(INT_EXT);   // Deshabilitamos INT EXTERNA
   switch (command)
   {
    case 0x12: output_high(GP4); delay_ms(10); output_low(GP4);break;
    case 0x13: output_high(GP5); delay_ms(10); output_low(GP5);break;
    case 0x15: output_high(GP1); delay_ms(10); output_low(GP1);break;
    default: output_high(GP0);break;
   }
   ENABLE_INTERRUPTS(INT_EXT);    // Habilitamos la interrupción externa
  }
 }WHILE(1);
}
Bueno muchachos en archivos adjuntos les envío una imagen de la simulación del programa. Cualquier duda o comentario no duden en hacerlo que estaré gustoso en hacerlo.

Nota: Algunos al simular se darán cuenta que no apaga totalmente, eso fue dejado asi en forma intencional ya que esa intensidad de luz es muy baja y nos dará a entender que el sistema está prendido pero cuando se aprieta el botó ON/OFF del control remoto el sistema se apaga totalmente. Bueno colegas ahora les toca poner de su parte hacer su diagrama y hacerlo correr los programitas, uiera puesto también el diagrama simulado pero, por lo menos que les cueste algo no??? ;)

Espero comentarios....
 

Adjuntos

#2
Hola yo estoy aun peleando por unir dos códigos separados que tengo para hacer lo mismo, ya logre codificar el control igual sony sir que es el mas sencillo de codificar, y logre hacer el dimmer con dos botones, pero al intentar unir los dos codigo se me hace imposible yo trabajo con PBP, la interrupción la hago con el GPIO.2 por interrupción externa, cambiando el estado del BIT 6 del registro INTCON. El codigo del control sony lo hago con interrupción pero para un switche no para detectar la señal del control. Tu manejas picbasic pro?
 
#3
Se ve bien , aunque quedaría mejor todo con un micro,si es un poco laborioso pero queda más entendible y práctico.

Esta padre tu idea , pero quien quiera armar tu proyecto y sin un diagrama no tiene mucho caso compartirlo no crees??? sino mejor que se quede guardadito.
 

Adjuntos

#4
oK BUENO amigo, yo lo tengo armado y funcionando, tienes razòn seria mejor con un micro pero, se me hace mas entendible con dos, bueno si no quieres armarlo no lo hagas, tambièn no te lo voy a dejar servida yo creo que si queires conseguir algo tienes que esforzarte un poco no crees?.
 
#5
buenas tardes amigos su proyecto es interesante pero copie el codigo y estoy teniendo problemas con la librería del compilador ccs, como puedo corregirlo me dice que existe un error 17

#include <12f675.h> y apunta en esta línea y dice to many nested #include
 
Última edición:
#7
A_ver amigos del Dimmer, acá les dejo el esquemático que armé y funcionando en el proteus, chéquenlo y me pasan la voz si algo no le va.... :D
 

Adjuntos

Última edición por un moderador:
#9
Hola rosvel... asi es para que utiliza el control remoto también sirve, sólo tienes que quitar el PIC que esta en la parte inferior del diagrama y sólo utilizar el primer código y es todo... suerte amigo en cuaquier caso si no te va... no dudes en escribir... :D.
 
#10
hola disculpa que te moleste de nuevo amigo pero no me quedo el esquematico no me disminuye la intensidad de la lampara no se si puedas ayudarme :cry:

osea no me varia nada ni aumenta ni disminuye
 
#11
hola disculpa que te moleste de nuevo amigo pero no me quedo el esquematico no me disminuye la intensidad de la lampara no se si puedas ayudarme :cry:

osea no me varia nada ni aumenta ni disminuye

Que raro yo lo tengo armado y funcionando a la perfección... el primer código va en el PIC que esta en la parte superior de diagrama y el segundo código en el otro PIC...
 

Temas similares

Arriba