📄 rix_a.c
字号:
#include <pic.h>
typedef unsigned char byte;
typedef signed char sbyte;
typedef signed int word;
#define CLOCK 4 // MHz
#define TE 300 // us
#define OVERSAMPLING 3
#define PERIOD 0 //TE*OVERSAMPLING/CLOCK //250us
#define NBIT 72 // number of bit to receive -1
#define RFIn RA1 // i radio signal input
extern volatile bit RFFull; // buffer full
extern volatile bit RFBit; // sampled RF signal
byte B[9]; // receive buffer
static byte RFstate; // receiver state
static byte 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 TRFDATAUP 2
#define HIGH_TO -10 // longest high Te
#define LOW_TO 10 // longest low Te
#define SHORT_HEAD 10 // shortest Thead accepted 10*208=2.08ms
#define LONG_HEAD 30 // longest Thead accepted 30*208=6.24ms
//开两种中断,定时器中断和端口电平变化中断
//其中定时器中断同时兼顾外部的系统时钟和脉冲宽度计数
//#pragma int_rtcc // install as interrupt handler (comment for HiTech!)
interrupt
rxi()
{
// this routine gets called every time TMR0 overflows
if(T0IF) //定时器中断程序
{
TMR0 = PERIOD; // 装计时器初值
T0IF = 0; // 清定时器溢出标志
XTMR++; // 外部的系统时钟计时器加1
RFcount++; // 脉冲宽度计数器加1
return;
}
if(RAIF) //端口电平变化中断程序
{
TMR0 = PERIOD; // 装计时器初值
if (RFFull) // 如果接收位满就退出
return;
RFBit = RFIn; // 取样信号接收的值
RAIF = 0;
switch (RFstate) // 当前状态
{
case TRFDATAUP:
switch (RFcount)
{
case 1:
break;
case 2:
B[Bptr] <<= 1; // rotate
if ( RFBit==0) //如是有效的下跳变则该位的数据值为1,上跳变为0
{
B[Bptr]+=1; // shift in bit
}
if ( ( ++BitCount & 7) == 0)
Bptr++; // advance one byte
if (BitCount == NBIT)
{
RFstate = TRFreset; // finished receiving
RFFull = 1;
}
RFcount=0; //重新记时
break;
default: //超时或不足则退出接收
RFstate = TRFreset; // reset state machine in all other cases
break;
}
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= TRFDATAUP;
}
}
else
{ // still low
RFcount=0;
}
break;
case TRFreset:
default:
RFstate = TRFSYNC; // reset state machine in all other cases
RFcount = 0;
Bptr = 0;
BitCount = 0;
break;
} // switch
PORTA = PORTA;//启动端口电平中断
} //电平中断
} // rxi
void InitReceiver()
{
IOCA = 2;
T0IF = 0;
T0IE = 1; // TMR0 overflow interrupt
RAIE = 1; //使能端口电平变化中断
GIE = 1; // enable interrupts
RFstate = TRFreset; // reset state machine in all other cases
RFFull = 0; // start with buffer empty
XTMR = 0; // start extended timer
TMR0 = PERIOD; // 装计时器初值
PORTA = PORTA;//启动端口电平中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -