#include <12f675.h>
#fuses NOMCLR
#use delay(internal = 4MHz)
#use fast_io(a)
#use rs232(baud = 2400, rcv = pin_a3, xmit=pin_a2) // ojo aqui quiero que reciba por
// el GP3 pin
char a,b,c,deco1,deco2,deco3,codif,patron,resultado;
char nibble[2] = {0,0};
char x = 0;
int8 decodificar();
#int_ext
void sdi_externa (void)
// Servicio de interrupción para recibir los datos codificados.
{
b = getc(); // Se lee el buffer de recepción y se guarda el dato en "b"
if(x < 2) // Si x es menor a 2...
{
nibble[x] = b; // El vector "x" del array "nibble" será = a "b"
x += 1; // Se incrementa "x"
}
}
void main (void)
{
set_tris_a(0xDF);
output_low(pin_a5);
port_a_pullups(0x04);
enable_interrupts(int_ext);
enable_interrupts(global);
ext_int_edge(h_to_l);
while (true)
{
if(x > 1) // Si "x" es mayor a 1...
{
x = 0; // "x" = 0
a = decodificar(); // En "a" se obtendrá el valor de retorno de la función.
if(a == 0b10101010) // Si "a" es igual a 0xAA...
{
output_high(pin_a5); // Se pone en 1 GP5
}
if(a == 0b10100101) // Si "a" es igual a 0xA5...
{
output_low(pin_a5); // Se pone en 0 GP5
}
}
}
}
int8 decodificar()
{
// Función para decodificar los datos Manchester.
codif = nibble[0];
if(codif == 0xF0) // Si el dato es 240 (condición de Inicio/Final encontrado)...
{
return 0xF0; // Se retorna el mismo valor (0xF0 = 240 Decimal.)
}
deco1 = 0; // Se limpia "deco1"
for(c=0;c<4;c++) // Bucle de 4 ciclos.
{
deco1 >>= 1; // Ir desplazando los bits de deco1 hacia la derecha.
patron = codif & 0b11; // Se hace una operación And entre "codif" y 3 (patron = codif And 3)
if(patron == 0b01) // Si el bit 1 de "patron" es 0 y el bit 0 es 1...
{
bit_set(deco1,3); // Poner en 1 el bit 3 de "deco1"
}
else if(patron == 0b10) // Pero si el bit 1 de "patron" es 1 y el bit 0 es 0...
{
bit_clear(deco1,3); // Poner en 0 el bit 3 de "deco1"
}
else // Y si el dato es 0...
{
return 0xFF; // Es un código ilegal y se retorna 0xFF (255 en decimal)
}
codif >>= 2; // Desplazar 2 bits de "codif" hacia la derecha.
deco2 = deco1; // "deco2" será igual a "deco1"
}
codif = nibble[1]; // "codif" será igual al vector 1 del array "nibble"
// Aquí se repite el proceso para obtener el valor de "deco3"...
if(codif == 0xF0) // Si el dato es 240 (condición de Inicio/Final encontrado)...
{
return 0xF0; // Se retorna el mismo valor (0xF0 = 240 Decimal.)
}
deco1 = 0;
for(c=0;c<4;c++)
{
deco1 >>= 1;
patron = codif & 0b11;
if(patron == 0b01) // 1
{
bit_set(deco1,3);
}
else if(patron == 0b10)
{
bit_clear(deco1,3); // 0
}
else
{
return 0xFF; // Código ilegal.
}
codif >>= 2;
deco3 = deco1;
}
deco3 <<= 4; // Desplazar 4 bits de "deco3" hacia la izquierda.
resultado = (deco2 | deco3); // Se hace una operación OR entre "deco2" y "deco3"
// resultado = (deco2 OR deco3)
x = 0; // Se limpian las variables.
deco1 = 0;
deco2 = 0;
deco3 = 0;
return resultado; // Se retorna el resultado.
}