Gente en esta oportunidad les quiero dejar un programa sencillo que corriendolo a 4MHz con el oscilador interno de cualquier microcontrolador funciona de maravillas. El mismo realiza una rutina de escaneo, detección, determinación del tipo de encoder, decodificación de la trama recibida y almacenamiento del código recibido de una longitud de hasta 24 bits, pudiendose almacenar en la memoria eeprom de 256 byte un total de 85 códigos distintos. Este programa permite levanta cualquier código de un control remoto RF que utilice los siguientes encoders: PT2262, PT2264, PT2242, PT2240, SC2260, SC2262, HX2260, HX2262, HS2262, HS2260, AX5026, SMC918, SMC926, AX5326, RT1527, FP1527, FP527, HS1527, HX1527, HT600, HT680, HT6201, HT6010, HT6012, HT6014, HT6013, HT12A.
Con un simple receptor de RF de AM sirve para recibir los datos del control remoto siempre y cuando sean de la misma frecuencia.


Ahora hasta aca todo está bien y funciona de maravillas, pero como se habran dado cuenta, el código se frena hasta tanto no ocurran cambios en la entrada de datos y solo avanza cuando la entrada de datos va cambiando. La medición de los tiempo es importante para la posterior decodificación del código, por lo que si se comienzan a agregar interrupciones es probable que ya el código comience a fallar por la poca eficiencia del mismo. Entonces se me ocurre que el código puede ser mejorado si se utiliza el módulo de ocurrencia de eventos (cambios de estado en la entrada de datos) para poder medir los tiempos de los bits de entrada y que el programa no se quede esperando por los cambios en la entrada de datos, que opinan lo que saben? que manera de optimización encontrarían viable? espero sus aportes.
PD: Quien tenga dudas de como funciona el programa que me pregunte que se lo explico, no lo comenté por falta de tiempo.
Con un simple receptor de RF de AM sirve para recibir los datos del control remoto siempre y cuando sean de la misma frecuencia.


Código:
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOCPD //No EE protection
#FUSES PUT //Power Up Timer
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4000000)
// Definiciones del puerto A
#define Datos PIN_A0
#use fast_io(A)
int i,Trama_encontrada,Contador_bits,Codigo[3],Auxiliar[3];
int Contador_codigos,Bien,Mal,Nuevo_codigo,Aux,Salto;
long Tiempo_entre_tramas,Aux_tiempo_entre_tramas;
long Tiempo_ET_delta_neg,Tiempo_ET_delta_pos,Tiempo_bits,Tiempo_bit,Bit,Tiempo;
void main()
{
set_tris_a (0b11111111); // Entradas:A0,A1,A2,A3,A4,A5
output_a (0);
Salto = 0;
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_1); // Base de tiempo de 1 useg
for (;;)
{
Tiempo_entre_tramas = 0;
Trama_encontrada = false;
Contador_bits = 0;
Nuevo_codigo = 0;
Contador_codigos = 0;
Mal = 0;
Bien = 0;
for (i=0;i<25;i++)
{
while (input(Datos) == 1);
set_timer1(0);
while (input(Datos) == 0);
Aux_tiempo_entre_tramas = get_timer1();
if (Tiempo_entre_tramas < Aux_tiempo_entre_tramas)
Tiempo_entre_tramas = Aux_tiempo_entre_tramas;
}
Tiempo_ET_delta_neg = Tiempo_entre_tramas-Tiempo_entre_tramas/8;
Tiempo_ET_delta_pos = Tiempo_entre_tramas+Tiempo_entre_tramas/8;
for (i=0;i<25;i++)
{
while (input(Datos) == 1);
set_timer1(0);
while (input(Datos) == 0);
if ((Tiempo_ET_delta_neg < get_timer1())&(get_timer1() < Tiempo_ET_delta_pos))
{
i = 25;
Trama_encontrada = true;
}
}
if (Trama_encontrada == true)
{
while (input(Datos) == 1);
set_timer1(0);
while (input(Datos) == 0);
while ((Tiempo_ET_delta_neg > get_timer1())|(get_timer1() > Tiempo_ET_delta_pos)&(Contador_bits<25))
{
Contador_bits++;
while (input(Datos) == 1);
set_timer1(0);
while (input(Datos) == 0);
}
if (Contador_bits < 25)
{
while (input(Datos) == 0);
set_timer1(0);
while (input(Datos) == 1);
while (input(Datos) == 0);
Tiempo_bits = get_timer1();
while (input(Datos) == 0);
set_timer1(0);
while (input(Datos) == 1);
while (input(Datos) == 0);;
Tiempo = get_timer1();
if (((Tiempo_bits - Tiempo_bits/8) > Tiempo)|(Tiempo > (Tiempo_bits + Tiempo_bits/8)))
{
if (Tiempo < Tiempo_bits)
Tiempo_bit = Tiempo_bits/2;
else
Tiempo_bit = Tiempo/2;
}
else
Tiempo_bit = Tiempo_bits/2;
do
{
do
{
while (input(Datos) == 1);
set_timer1(0);
while (input(Datos) == 0);
Tiempo = get_timer1();
}while ((Tiempo_ET_delta_neg > Tiempo)|(Tiempo > Tiempo_ET_delta_pos));
for (i=0;i<Contador_bits;i++)
{
while (input(Datos) == 1);
set_timer1(0);
while (input(Datos) == 0);
Bit = get_timer1();
if (Bit < Tiempo_bit)
shift_left(Codigo,3,1);
else
shift_left(Codigo,3,0);
}
if ((Codigo[0]==0)&(Codigo[1]==0)&(Codigo[2]==0))
Mal = 1;
if ((Nuevo_codigo == 0)&(Mal == 0))
{
for (i=0;i<3;i++)
Auxiliar[i]=Codigo[i];
}
if ((Mal == 0)&(Nuevo_Codigo == 1))
{
if (Auxiliar[0] == Codigo[0])
{
if (Auxiliar[1] == Codigo[1])
{
if (Auxiliar[2] == Codigo[2])
Bien = 1;
else
{
Mal = 1;
Bien = 0;
}
}
else
{
Mal = 1;
Bien = 0;
}
}
else
{
Mal = 1;
Bien = 0;
}
}
Nuevo_codigo = 1;
Contador_codigos++;
for (i=0;i<3;i++)
Codigo[i] = 0;
}while((Mal == 0)&(Contador_Codigos < 4));
if (Bien == 1)
{
for (i=0;i<3;i++)
{
Aux = Auxiliar[i];
write_eeprom(i+Salto,Aux);
}
Salto+=3;
write_eeprom(252,Salto);
}
}
}
}
}
PD: Quien tenga dudas de como funciona el programa que me pregunte que se lo explico, no lo comenté por falta de tiempo.
Última edición: