//--------------------------------------------------------------------
// Interrupt based receive routine
//
// Compiled using HiTech PIC C compiler v.7.93
//********************************************************************
#define CLOCK 4 // MHz
#define TE 400 // us
#define OVERSAMPLING 3
#define PERIOD TE/OVERSAMPLING*4/CLOCK
#define NBIT 65 // number of bit to receive -1(HCS300 66-1=65)
unsigned char B[9]; // receive buffer
static byte RFstate; // receiver state
static sbyte RFcount; // timer counter
static byte Bptr; // receive buffer pointer
static byte BitCount; // received bits counter
word XTMR; // 16 bit extended timer
volatile bit RFFull; // buffer full
volatile bit RFBit; // sampled RF signal
#define TRFreset 0
#define TRFSYNC 1
#define TRFUNO 2
#define TRFZERO 3
#define HIGH_TO -10 // longest high Te
#define LOW_TO 10 // longest low Te
#define SHORT_HEAD 20 // shortest Thead accepted 2,7ms
#define LONG_HEAD 45 // longest Thead accepted 6,2ms
//-----------------------------------------------------------------------------------
#pragma int_rtcc // install as interrupt handler (comment for HiTech!)
void interrupt rxi(void) //this routine gets called every time TMR0 overflows
{
RFBit = RFIn; // sampling RF pin verify!!!
TMR0 -= PERIOD; // reload
T0IF = 0;
XTMR++; // extended 16 long timer update
//-----------------------------------------------------------------
if (RFFull) // avoid overrun
{ return;}
switch( RFstate) // state machine main switch
{
case TRFUNO:
if ( RFBit)
{ // while high
RFcount--;
if ( RFcount < HIGH_TO)
RFstate = TRFreset; // reset if too long
}
else
{ // falling edge detected ----+
// |
// +----
RFstate= TRFZERO;
}
break;
case TRFZERO:
if ( RFBit)
{ // rising edge detected +----
// |
// ----+
RFstate= TRFUNO;
B[Bptr] >>= 1; // rotate
if ( RFcount >= 0)
{ B[Bptr]+=0x80; } // shift in bit
RFcount = 0; // reset length counter
if ( ( ++BitCount & 7) == 0)
{ Bptr++; } // advance one byte
if (BitCount == NBIT)
{
RFstate = TRFreset; // finished receiving
RFFull = TRUE;
}
}
else
{ // still low
RFcount++;
if ( RFcount >= LOW_TO) // too long low
{
RFstate = TRFSYNC; // fall back into RFSYNC state
Bptr = 0; // reset pointers, while keep counting on
BitCount = 0;
}
}
break;
case TRFSYNC:
if ( RFBit)
{ // rising edge detected +---+ +---..
// | | <-Theader-> |
// +----------------+
if ( ( RFcount < SHORT_HEAD) || ( RFcount >= LONG_HEAD))
{
RFstate = TRFreset;
break; // too short/long, no header
}
else
{
RFcount =0; // restart counter
RFstate= TRFUNO; //合适的长低电平信号出现
}
}
else
{ // still low
RFcount++;
}
break;
case TRFreset: //初始状态
default:
RFstate = TRFSYNC; // reset state machine in all other cases
RFcount = 0;
Bptr = 0;
BitCount = 0;
break;
} // switch
//-----------------------------------------------------------------
} // rxi
void InitReceiver()
{
T0IF = 0;
T0IE = 1; // TMR0 overflow interrupt
GIE = 1; // enable interrupts
RFstate = TRFreset; // reset state machine in all other cases
RFFull = 0; // start with buffer empty
XTMR = 0; // start extende
}
上一篇:一种基于MAX5980芯片的POE网络交换机设计方案
下一篇:pic单片机软件解码PT2240
推荐阅读最新更新时间:2024-03-16 15:20
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 英飞凌多媒体平台被LGE新型EDGE移动电话采用
- TI DSP烧写——TMS320C6416
- 求购BCM6348设计资料
- 已解决*** FATAL ERROR L252: RESTRICTED VERSION: CODE MUST BE ABOVE 4000H
- MAX32630FTHR wi-fi 通讯连接 OneNET云平台
- 可以长见识,不信去看看。
- 50分求WinCE Service的例子(越简单越浅显易懂越好,不要拿msdn上面的那个例子)
- 跪求高人救我(串口数据分析)
- 别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加?
- 有SDIO读写SD卡的例子吗?