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