📄 capture.c
字号:
//************************************************
/*--------------- file information -------------*/
/*Date : 2007-08-3
Author : hou de ping
Company : FirstSun.
Chip type : ATmega88V
Clock frequency : 8MHz
Function description : 无线电解码
result:
*************************************************/
#include"main.h"
#include <avr/io.h>
void Capture_init(void)
{
// 信号输入 PD3
ClrBit(PORTD,PD3); // Output Low
ClrBit(DDRD,DDD3); //Input,
SetBit(PORTD,PD5); // Output High
SetBit(DDRD,DDD5);
// Time 2 Setting
TCCR2A = _BV(WGM21); //比较匹配发生时OC2A 清零
TCCR2B = _BV(CS22); //clkT2S/64 ( 来自预分频器)
OCR2A = 62; // 64 * N = 4000
TCNT2 =0;
}
void Start_Mark_Space(void)
{
if(Start_Flag) //检测数据
{
if(DataBit_Flag) //检测DateBit_Mark
{
Data_Mark(); }
else //检测DateBit_Space
{ Data_Space(); }
if(DateByte_counter==4) //接收完4 Byte 数据
{
DateBite_counter=0; //Bit计数清零
DateByte_counter=0; //Byte计数清零
Start_Flag=0; //下一次检测Start,
DataBit_Flag=1;
if((DateBite[0]==(0xff-DateBite[1]))&&(DateBite[2]==(0xff-DateBite[3]))) //检测接收数据是否正确
{
fnConvertData();
if (++mKeyPressFlag==5) //前4个数据丢弃
{
mName[1]=0x00;
fnTxdecode(); //数据发送到MNET
Time_1s =0;
}
}
}
if (bit_is_set( TIFR2, OCF2A)) // 0.5 ms
{
SetBit( TIFR2, OCF2A);
if(++mRxIdleTm_200ms==1000) //200ms未接收到数据则停止接收
{
mRxIdleTm_200ms=0;
Start_Flag=0; //下一次检测Start
DataBit_Flag=1;
}
}
}
else //检测Start,
{
if (bit_is_set( TIFR2, OCF2A)) // 0.5 ms
{
SetBit( TIFR2, OCF2A);
if(Mark_Flag) //检测Start_Mark
{ Start_Mark(); }
else //检测Start_Space
{ Start_Space(); }
if(mKeyPressFlag>=5) //数据正确则发送到MNET,连续按键每一秒发送一次
{
if(++mRxIdleTm_200ms>=500) //200ms未接收到数据则为放手
{
mRxIdleTm_200ms=0;
mKeyPressFlag=0;
mName[1]=0x80;
fnTxdecode(); //数据发送到MNET
}
if(++Time_1s>=1000) //连续按键每一秒发送一次
{
Time_1s=0;
mName[1]=0x01;
fnTxdecode(); //数据发送到MNET
}
}
}
}
}
void Start_Mark(void)
{
Mark_Pre=PIND&0x08;
/* if(Mark_Rd != Mark_Pre ) //除抖动
{
Mark_Pre=Mark_Rd;
return;
}
*/
if ( Mark_Pre != Mark_Save )
{
if ( Mark_Pre ) //jump to Mark
{
Mark_Save = Mark_Pre;
goto Jumpto_Mark;
}else //Release_Mark
{
Mark_Save = Mark_Pre;
goto Release_Mark;
}
}else
{
if ( Mark_Save ) //保持 ,Mark
{
goto Keep_Mark;
}
}
return;
Release_Mark: //---------------------------------Release_Mark
if(12<=StartBit_counter && StartBit_counter<=24) //检测StartMark时间是否为6ms--12ms
{
Mark_Flag=0;
Space_Rd=0x08;Space_Pre=0x08;Space_Save=0x08;
}
else //未检测到StartMark
{
Mark_Flag=1;
Mark_Rd=0; Mark_Pre=0;Mark_Save=0;
}
StartBit_counter=0;
return;
Jumpto_Mark: //-----------------------------------Mark
StartBit_counter=0;
Keep_Mark: //------------------------------- //保持 ,Mark
StartBit_counter++;
}
void Start_Space(void)
{
Space_Pre=PIND&0x08;
/* if(Space_Rd != Space_Pre ) //除抖动
{
Space_Pre=Space_Rd;
return;
}
*/
if ( Space_Pre != Space_Save )
{
if ( !Space_Pre ) //jump to space
{
Space_Save = Space_Pre;
goto Jumpto_Space;
}else //Release_Space
{
Space_Save = Space_Pre;
goto Release_Space;
}
}else
{
if ( !Space_Save ) //保持 ,Space
{
goto Keep_Space;
}
}
return;
Release_Space: //---------------------------------Release_Space
if(6<=StartBit_counter && StartBit_counter<=12) //检测StartSpace时间是否为3ms--6ms
{
Mark_Flag=1;
Start_Flag=1; //开始检测数据,标志位置位
mRxIdleTm_200ms=0;
Mark_Rd=0; Mark_Pre=0;Mark_Save=0;
}
else //未检测到StartSpace
{
Mark_Flag=1;
Space_Rd=0x08;Space_Pre=0x08;Space_Save=0x08;
}
StartBit_counter=0;
return;
Jumpto_Space: //-----------------------------------space
StartBit_counter=0;
Keep_Space: //-------------------------------//保持 ,Space
StartBit_counter++;
}
void Data_Mark(void)
{
Mark_Pre=PIND&0x08;
/* if(Mark_Rd != Mark_Pre ) //除抖动
{
Mark_Pre=Mark_Rd;
return;
}
*/
if ( Mark_Pre != Mark_Save )
{
if ( Mark_Pre ) //jump to Mark
{
Mark_Save = Mark_Pre;
goto Jumpto_Mark;
}else //Release_Mark
{
Mark_Save = Mark_Pre;
goto Release_Mark;
}
}else
{
if ( Mark_Save ) //保持 ,Mark
{
goto Keep_Mark;
}
}
return;
Release_Mark: //---------------------------------Release_Mark
if(40<=StartBit_counter && StartBit_counter<=80) //接收DateBit_Mark,400us--800us
{
DataBit_Flag=0;
}
else
{
Start_Flag=0;
Mark_Flag=1;
}
StartBit_counter=0;
return;
Jumpto_Mark: //-----------------------------------Mark
StartBit_counter=0;
Keep_Mark: //------------------------------- //保持 ,Mark
StartBit_counter++;
}
void Data_Space(void)
{
Space_Pre=PIND&0x08;
/* if(Space_Rd != Space_Pre ) //除抖动
{
Space_Pre=Space_Rd;
return;
}
*/
if ( Space_Pre != Space_Save )
{
if ( !Space_Pre ) //jump to space
{
Space_Save = Space_Pre;
goto Jumpto_Space;
}else //Release_Space
{
Space_Save = Space_Pre;
goto Release_Space;
}
}else
{
if ( !Space_Save ) //保持 ,Space
{
goto Keep_Space;
}
}
return;
Release_Space: //---------------------------------Release_Space
if(40<=StartBit_counter && StartBit_counter<=80) //接收DateBit1_Space,400us--800us
{
DateBite[DateByte_counter]<<=1;
DateBite[DateByte_counter] |= 0x01; //接收到"1"
if(++DateBite_counter>=8)
{
DateBite_counter=0;
++DateByte_counter;
}
}
else if (120<=StartBit_counter && StartBit_counter<=240) //接收DateBit0_Space,1200us--2400us
{
DateBite[DateByte_counter]<<=1; //接收到"0"
if(++DateBite_counter==8)
{
DateBite_counter=0;
++DateByte_counter;
}
}
else //接收出错
{
DateBite_counter=0;
DateByte_counter=0;
Start_Flag=0;
}
DataBit_Flag=1;
StartBit_counter=0;
return;
Jumpto_Space: //-----------------------------------space
StartBit_counter=0;
Keep_Space: //-------------------------------//保持 ,Space
StartBit_counter++;
}
void fnConvertData(void)
{
if(DateBite[0]&0x04)
{
KeyName[0]=8-((DateBite[2]&0x40)/16+(DateBite[2]&0x10)/16+(DateBite[2]&0x08)/4); //1--8按键代码
}
else
{
KeyName[0]=16-((DateBite[2]&0x40)/16+(DateBite[2]&0x10)/16+(DateBite[2]&0x08)/4);//9--16按键代码
}
mID[0]=(DateBite[0]&0xf0)+(KeyName[0]&0x0f);//高4位为地址,低4位为按键代码
if((DateBite[2]&0xff)==0x6f) //Allon
{
KeyName[0]=0x80;
mName[0]=0x04;
mID[0]=(DateBite[0]&0xf0)+0x01;
}
else if((DateBite[2]&0xff)==0x7f) //Alloff
{
KeyName[0]=0x80;
mName[0]=0x05;
mID[0]=(DateBite[0]&0xf0)+0x01;
}
else
{
if((DateBite[2]&0x80)==0x80) //On, Off
{
KeyName[0]=0x81;
mID[1]=mID[0];
if((DateBite[2]&0x20)==0x20) //On
{
mName[0]=0x04;
}
else //Off
{
mName[0]=0x05;
}
}
else //Brt, Dim
{
KeyName[0]=0x82;
mID[0]=mID[1];
if((DateBite[2]&0x10)==0x10) //Brt
{
mName[0]=0x04;
}
else //Dim
{
mName[0]=0x05;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -