/*****************************************************************************
*
* File : Decode 2262
* Compiler : IAR EWAAVR 4.10a
* Created : 12.05.2009 by ma guang dong
*
* Support mail : mgdsun2000@126.com
*
****************************************************************************/
#include <iotiny25.h>
#include <inavr.h>
#include <ina90.h>
#define DelayTime 50
#define HIGHT 1
#define LOW 0
#define YYYY 150
#define YYYX 151
#pragma vector=TIM0_OVF_vect
__interrupt void TIMER0VF_Handler(void);
void IntialTimer0(void);
void StartTimer0(void);
void StopTimer0(void);
void SPI_WriteByte(char ch);
void OutBit(char x);
void SPI_CLK(char clk);
void NSSBit(char x);
void SPI_puts(char *str);
void inial_spi(void);
void Delay(char time);
void Decode_2262(void);
#define GET_REMOTE_CTR_DATA !(PINB&0x10)
//#define GET_REMOTE_CTR_DATA !(PINB&0x02)
// 对2262芯片的遥控编码进行解码
unsigned int abs(unsigned int a,unsigned int b);
unsigned int Timer0Count=0;
void main( void )
{
DDRB=0x07;
PORTB&=0xfb;
PORTB|=0x02;
// unsigned int i;
/* DDRB=0x1c;
PORTB|=0x04;
PORTB&=0xf7;*/
WDTCR=(1<<4)|(1<<3);
WDTCR=0x00;
MCUCR=0;
IntialTimer0();
SPI_puts("START ......");
while(1)
{
Decode_2262();
}
}
void SPI_puts(char *str)
{
while (*str != '\0')
{
SPI_WriteByte(*str++);
}
}
void SPI_WriteByte(char ch)
{
char i;
PORTB&=0xfe;
// PORTB&=0xfb;
for(i=0;i<8;i++)
{
if(ch&0x80)
PORTB|=0x02;
// PORTB|=0x10;
else
PORTB&=0xfd;
// PORTB&=0xef;
PORTB|=0x04;
PORTB|=0x08;
Delay(50);
PORTB&=0xfb;
//PORTB&=0xf7;
ch=ch<<1;
Delay(50);
}
PORTB|=0x01;
//PORTB|=0x04;
}
void Delay(char time)
{
while(time--);
}
void Decode_2262(void)
{
char v,i;
unsigned int rt1,rt,pp,oldrt1,ra;
unsigned int rt2;
char fr[2][12],ba[2][12],ppt,res1[3],res2[3];
rt1 = 0;
pp = 0;
oldrt1 = 0;
ppt = 0;
StartTimer0();
while(1)
{
while(1)
{
rt1 = 0;rt2=0;
for(v=0;v==0;)
{
v = GET_REMOTE_CTR_DATA;
}
for(v=1;v==1;)
{
v = GET_REMOTE_CTR_DATA;
rt1++;
}
for(v=0;v==0;)
{
v = GET_REMOTE_CTR_DATA;
rt2++;
}
pp=rt2/rt1;
if(pp<40 && pp>20)
{
break;
}
}
if(rt1>30) // 前导的高电平过短,算作干扰,注意,这个参数和CPU的工作频率有关
{
if(abs(rt1,oldrt1)<=20) // 连续的两个前导高电平持续时间不能差10
{
//ppt++;
ppt=1;
}
else
{
ppt =0;
}
ra = rt1<<1;// +rt1; // 找出基准宽度 8a
for(i=0;i<12;i++)
{
rt = 0;
for(v=0;rt<ra;)
{
v = GET_REMOTE_CTR_DATA;
rt++;
}
fr[ppt][i] = v;
while(1)
{
v = GET_REMOTE_CTR_DATA;
if(v==0)
break;
}
while(1)
{
v = GET_REMOTE_CTR_DATA;
if(v!=0)
break;
}
rt = 0;
for(v=0;rt<ra;)
{
v = GET_REMOTE_CTR_DATA;
rt++;
}
ba[ppt][i] = v;
while(1)
{
v = GET_REMOTE_CTR_DATA;
if(v==0)
break;
}
while(1)
{
v = GET_REMOTE_CTR_DATA;
if(v!=0)
break;
}
}
if(ppt==0)
oldrt1 = rt1;
else
oldrt1=0;
if(ppt==1)
{
ppt = 0; // 已经发现了连续两个合法的前导,认为是收到正确编码,可以开始解码
for(i=0;i<12;i++) // 比对两次解出的数据是否一样,如一样,则表示解码正确
{
if(fr[0][i]!=fr[1][i] || ba[0][i]!=ba[1][i])
break;
}
if(i==12)
{
rt2=0;
for(i=0;i<8;i++)
{
pp=0;
if(fr[0][i]==0 && ba[0][i]==0)
// SPI_WriteByte(0x30);
pp=0;
if(fr[0][i]==0 && ba[0][i]==1)
{ // SPI_WriteByte('F');
pp=2<<(i<<1);
}
if(fr[0][i]==1 && ba[0][i]==1)
//SPI_WriteByte('1');
pp=3<<(i<<1);
rt2|=pp;
}
res1[0]=(unsigned char)rt2;
// SPI_WriteByte(temp);
// res1=temp;
res1[1]=(unsigned char)(rt2>>8);
// SPI_WriteByte(temp);
rt2=0;
for(i=0;i<4;i++)
{
pp=0;
if(fr[0][i+8]==0 && ba[0][i+8]==0)
// SPI_WriteByte(0x30);
pp=0;
if(fr[0][i+8]==0 && ba[0][i+8]==1)
{ //SPI_WriteByte('F');
pp=2<<(i<<1);
}
if(fr[0][i+8]==1 && ba[0][i+8]==1)
//SPI_WriteByte('1');
pp=3<<(i<<1);
rt2|=pp;
}
res1[2]=(unsigned char)rt2;
// StopTimer0();
i=0;
if(Timer0Count<=YYYY)
{
for(i=0;i<3;i++)
{
if(res1[i]!=res2[i])
break;
}
}
if(i!=3)
{
SPI_WriteByte(0x55);
SPI_WriteByte(res1[0]);
SPI_WriteByte(res1[1]);
SPI_WriteByte(res1[2]);
}
for(i=0;i<3;i++)
{
res2[i]=res1[i];
}
if(Timer0Count>YYYY)
StartTimer0();
}
}
}
else
{
ppt = 0;
oldrt1 = 0;
}
}
}
unsigned int abs(unsigned int a,unsigned int b)
{
unsigned int temp;
if(a>b) temp=a-b;
else temp=b-a;
return temp;
}
void IntialTimer0(void)
{
TCCR0A=0;
TCCR0B=0;
TIMSK=0x02;
}
void StartTimer0(void)
{
TCCR0B=0x04;
Timer0Count=0;
TCNT0=0;
_SEI();
}
void StopTimer0(void)
{
TCCR0B=0x00;
_CLI();
}
__interrupt void TIMER0VF_Handler(void)
{
Timer0Count++;
if(Timer0Count>YYYY)
Timer0Count=YYYX;
}
评论0
最新资源