#include <mega8.h>

#include <stdio.h>
#include <delay.h>
#include <String.h>   

#define TRFreset      0
#define TRFSYNC       1
#define TRFUNO        2
#define TRFZERO       3

#define NBIT         65

#define HIGH_TO     -10         
#define LOW_TO       10         
#define SHORT_HEAD   20        
#define LONG_HEAD    45

#define RfIn 	 PIND.4	       

typedef unsigned char byte;

bit RFFull;
bit RFBit;
int RFcount; 
byte  Bptr,BitCount,RFstate,Buf[9];
/////////////// receive /////////////////////////////////
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ 
TCNT0=135;
RFBit=RfIn;

    if (RFFull)               
        return;
/////////////////////////////////////////////////////////
    switch(RFstate)          
    {
    case TRFUNO:
        if ( RFBit == 0)
        {
         RFstate= TRFZERO;
        }
        else
        {          
         RFcount--;            
         if (RFcount < HIGH_TO) RFstate = TRFreset;     
        }
        break;
//////////////////////////////////////////////////////////
    case TRFZERO:
        if (RFBit)
        {                   
            RFstate= TRFUNO;
            Buf[Bptr] >>= 1;                  
            if ( RFcount >= 0)
            {   
             Buf[Bptr]+=0x80;                 
            }
            RFcount = 0;                                     
            if ((++BitCount & 7) == 0) Bptr++;                           
            
            if (BitCount == NBIT)
            {
             printf("Reseive signal:"); 
             printf("%02X%02X%02X%02X%02X%02X%02X%02X",
             Buf[0],Buf[1],Buf[2],Buf[3],Buf[4],Buf[5],Buf[6],Buf[7]);                                                                                                        
             printf("\n\r");
             
             RFstate = TRFreset;                       
             RFFull = 1;                      
            }   
        }
        else
        { 
            RFcount++;
            if ( RFcount >= LOW_TO)           
            {  
             RFstate = TRFSYNC;            
             Bptr = 0;                     
             BitCount = 0;
            }
        }
        break;
///////////////////////////////////////////////////////////
    case TRFSYNC:
        if ( RFBit)
        { 
            if ((RFcount < SHORT_HEAD)||(RFcount >= LONG_HEAD))
            {
             RFstate = TRFreset;break;                       
            }
            else
            {
             RFcount =0;RFstate= TRFUNO;
            }
        }
        else
        { 
         RFcount++;                  
        }
        break;
/////////////////////////////////////////////////////////////    
    case TRFreset:
    default:        
        RFstate = TRFSYNC;                
        RFcount = 0;
        Bptr = 0;
        BitCount = 0;
        break;        
    } // switch
////////////////////////////////////////////////////////////// 
      if(RFFull)
      {                          
       RFstate = TRFreset;
       RFFull=0;  
      }    
/////////////////////////////////////////////////////////////      
} // receive
////////////////// main ////////////////////////////////////
void main(void)
{
 PORTD=0x10;   
 DDRD=0x00;

 TCCR0=0x02;
 TCNT0=0x00;

 TIMSK=0x01;

 UCSRA=0x00;
 UCSRB=0x08;
 UCSRC=0x86;
 UBRRH=0x00;
 UBRRL=0x33;

////////////////////////////////////////////////////////////
printf("                           WAIT SIGNAL!\n\r");
printf("\n\r");
////////////////////////////////////////////////////////////  
#asm("sei")
}// main
