Documente Academic
Documente Profesional
Documente Cultură
c
////////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
ESTE PROGRAMA DECODIFICA LAS SEALES DE UN CONTROL REMOTO SONY
//
//
____________________________________________________________________
//
//
//
//
//
//
Sus funciones son:
//
//
//
//
* Apagado y encendido de una lampara
//
//
* Regular gradualmente la intensidad de la lampara.
//
//
//
//
//
//
Se aprende los botones, regula la intensidad en forma automatica, tiene //
//
modo sleep y modo de encendido por dia.
//
//
//
//
La entrada del sensor es el pin A0, el sincronismo es A1 y la lampara //
//
es conectada al pin ccp1(GP2).
//
//
//
//
En pin a3 es para seleccionar entre foco normal o ahorrador, el pin A5 //
//
es conectado un led indicador.
//
//
//
//
El pin a4 es la entrada de la fotoresistencia para controlar automati- //
//
-camente la intensidad.
//
//
//
//
Conectar la fotoresistencia con el divisor de voltaje de tal modo que
//
//
a mas luz menos voltaje.
//
//
//
//
se corrigieron problemas con foco ahorrador
//
//
//
////////////////////////////////////////////////////////////////////////////////
#include <12f683.h>
// Declaramos pic (se ocupa este por ser el unico de 8 pin con pwm).
#fuses NOWDT, NOPROTECT, BROWNOUT, PUT, NOCPD, NOMCLR, INTRC_IO, NOIESO, NOFCMEN
#device ADC=10
#use delay(clock=1000000) //frecuencia de trabajo de 1Mhz
#use fast_io (A)
byte
codigo[2]={0,0},code_up[2]={0,0},code_down[2]={0,0},code_onoff[2]={0,0};
////////////////////////////////////////////////////////////////////////////////
///////// variables de codigo leido del control y codigos de funcin /////////
////////////////////////////////////////////////////////////////////////////////
int16 tstart=440,ton=250,adc;
// Tiempo de bit de start 3T=1800 uS y tiempo de bit 1 2T=1200 uS
int cont1=0,cont2=0;
// Contadores de bits leidos
unsigned int disparo=128;
// Angulo de disparo por default esta entre 28 y 129 (rango dependiendo de config timer
short sincro1=0,on_off=0;
// Banderas de ciclo completo, apagar (para antirrebote)
unsigned int aprender=0,ciclos=0,ciclos1=0,hold=0;
// Aprender codigo segun alguna condicion(solo para compatibilidad), ya se han leido los 3 codigos y cargalos a la ram
// Banderas: ciclo completo, ciclos transcurridos(usados para retardos),
// Cuenta cuando se deja presionado la tecla encender apagar,
short
short
int16
short
modo_auto=0,auto_ini=1;
modo_time1=0,modo_time2=0;
base_tiempo=0;
ahorrador=0,edo_ahorrador=0;
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
///////////////////// Rutina de sincronismo con la AC //////////////////////////
////////////////////////////////////////////////////////////////////////////////
void sincroniza(void)
{
if(!input(PIN_A1)) sincro1=1;
if(sincro1 & input(pin_A1))
{
if(!ahorrador)
{
if(disparo!=28)
{
set_timer2(disparo);
setup_ccp1(CCP_PWM);
}
else
setup_ccp1(CCP_OFF);
}
sincro1=0;
ciclos++;
ciclos1++;
}
// Si el angulo de disparo es muy pequeo mejor apaga pwm para que no haya fugas de cor
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////// escribir eeprom /////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void wr_eeprom(byte address,byte data)
{
write_eeprom(address,data);
sincroniza();
}
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////// leer eeprom ///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
byte rd_eeprom(byte address)
{
return(read_eeprom(address));
sincroniza();
}
//-----------------------------------------------------------------void carga_code(void)
{
code_up[1]=rd_eeprom(0x12); code_up[0]=rd_eeprom (0x11);
code_down[1]=rd_eeprom(0x14); code_down[0]=rd_eeprom (0x13);
code_onoff[1]=rd_eeprom(0x16); code_onoff[0]=rd_eeprom (0x15);
}
//Cierra carga_code
//---------------------------------------------------------------void guarda_code(void)
//guarda en eeprom los 3 codigos de funcion y solo los acepta si son diferentes
{
if(aprender!=0)
//si se activo la bandera aprender guarda los codigos
{
if(aprender==1)
//guarda codigo para aumentar intensidad
{wr_eeprom(0x11,codigo[0]); wr_eeprom(0x12,codigo[1]);}
if(aprender==2)
//guarda codigo para disminuir intensidad y comrara que sea diferente al primero
{
if((codigo[0]!=rd_eeprom (0x11)) | (codigo[1]!=rd_eeprom (0x12)))
{ wr_eeprom(0x13,codigo[0]); wr_eeprom(0x14,codigo[1]); }
else
aprender=1;
}
if(aprender==3)
//guarda codigo para on-off y compara que sea diferente al primero y segundo y si ya se
{
if(((codigo[0]!=rd_eeprom (0x11)) | (codigo[1]!=rd_eeprom (0x12))) & ((codigo[0]!=rd_eeprom (0x13)) | (codigo[1]!=rd_eeprom
{ wr_eeprom(0x15,codigo[0]); wr_eeprom(0x16,codigo[1]); carga_code();}
else
aprender=2;
}
if(aprender>=3)
// si ya se han leido 3 diferentes sale y ya no vuelve a entrar a la subrutina
aprender=0;
else
aprender++;
}
}
// Cierra guarda_code
void readcodigo(void)
{
//----------------------lee codigo------------------------------- <<-- posible version todas marcas
//muestreando a cada cierto tiempo y guarda en un arreglo grande rotando bits
//aplicando reglas generales posibles problemas de memoria
SET_TIMER1(0);//start =3t t=600uS
//inicia a contar timer 1
while(!input(PIN_A0)){sincroniza();} //se espera en lo que dura el bit de start y esta sincronizando
if( GET_TIMER1() < tstart )
//checa si el tiempo corresponde al bit de start y si no se sale
goto salir;
codigo[0]=0; //inicializar codigo proveniente del control
codigo[1]=0;
for(cont1=1;cont1<=12;cont1++) //lee los 12 bit de codigo (norma RECS80 de sony)
{
while(input(PIN_A0)){sincroniza();} //se mide el tiempo de cada transicion y verifica si es 1 o 0 segun su duracion
SET_TIMER1(0);
while(!input(PIN_A0)){sincroniza();}//el tiempo que interesa el el tiempo en bajo (si dura t o 2t)
if(GET_TIMER1()>ton)
shift_left(codigo,2,1);//rota 1 posicion e inserta 1 si bit=1 trabaja con 2 bytes
else
shift_left(codigo,2,0);//rota 1 posicion e inserta 0 si bit=0 trabaja con 2 bytes
}
2
//verifica que se ha cumplido la base de tiempo (1 seg) y al cumplirse 60 seg se apaga y ya no entra a la rutina ya sea com
if(modo_time2)//si fue activado el modo de encendido temporal permanece activado 3 hrs y se apaga y al dia sig otras 3 hora
if(ciclos>=120)
{
if(on_off) //retardo para evitar rebotes en la funcion on off (la comparacion on_off fue cambiada en esta posicion para ocu
if(ciclos==45)
{
if(input(PIN_A3))
{
ahorrador=0; if(disparo==28) disparo=128; else disparo=28;
}
else
{
{
ahorrador=0;
adc=read_adc();//leemos la intensidad luminosa por medio de fotorresistencia
4
//
//
//
//
//