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