#include <16f84A.h>
#FUSES NOWDT // No Watch Dog Timer
#FUSES XT // Crystal Osc <= 4mhz
#FUSES NOPROTECT // Code not protected from reading
#FUSES NOPUT // No Power Up Timer
#use delay(clock=4000000)
#USE STANDARD_IO(A)
#define RX_READY 0
#define RX_RECEIVING 1
#define RX_COMPLETE 2
// variables globales
int16 period=0;
int8 word[14];
int8 state;
int8 i;
void rx_decoder(void);
////////////////////////////////////////////////////////////////////////////////
//Atiende la interrupcion externa por flanco descendente
////////////////////////////////////////////////////////////////////////////////
#INT_EXT
void ext_isr(void)
{period=get_timer0(); //period= ciclos del timer
set_timer0(0); // resetea el timer
state=RX_RECEIVING;// mientras sucede esto, se enciende el led de recibiendo
output_high(PIN_A4);
rx_decoder();
}
////////////////////////////////////////////////////////////////////////////////
//Funcion que decodifica los tiempos entre flancos descendentes, en ceros y unos
// y los guarda en el arreglo word[14]
////////////////////////////////////////////////////////////////////////////////
void rx_decoder(void)
{
if((period>=1768)&&(period<=1788)) //1.17ms = (4MHz/4)^(-1)*1768
{word[i+1]=word;++i;}
else
{if((period>=2657)&&(period<=2677))
{if(word==1)
{word[i+1]=!word;
word[i+2]=!word;++i;++i;}
else
{word[i+1]=!word;++i;}
}
else
{if((period>=3546)&&(period<=3566))
{word[i+1]=!word;
word[i+2]=word;++i;++i;}
else
{state=RX_READY;
i=0;}
}
}
if(i==13)
{state=RX_COMPLETE;}
}
////////////////////////////////////////////////////////////////////////////////
//Funcion principal
////////////////////////////////////////////////////////////////////////////////
void main(void) {
disable_interrupts(global);
i=0;
word[0]=1;
state=RX_READY;
set_tris_a(0b00000000); // PA salida
set_tris_b(0b00000001); // PB0 entrada, los demas salidas
output_low(pin_B7);
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A4);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);
ext_int_edge(0,H_TO_L); //configura interrupcion externa por
//flanco de bajada
enable_interrupts(INT_EXT); //habilita interrupcion externa
enable_interrupts(GLOBAL);
do
{if(state==RX_COMPLETE)
{
output_bit(PIN_A3,word[2]);
output_bit(PIN_A2,word[3]);
output_bit(PIN_B6,word[7]);
output_bit(PIN_B5,word[8]);
output_bit(PIN_B4,word[9]);
output_bit(PIN_B3,word[10]);
output_bit(PIN_B2,word[11]);
output_bit(PIN_B1,word[12]);
output_high(PIN_A0);
output_low (PIN_A1);
}
else
{
if (state==RX_RECEIVING)
{
output_low(PIN_A0);
output_high(PIN_A1);
}
else // state = RX_READY
{
output_high(PIN_A0);
output_high(PIN_A1);
}
}
}
while(TRUE);
}