|
可以进INT0中断,当打开T2定时器时,接收的数据不对,请大家帮忙看看,谢了!
解码思路:第一次进入ITN0中断时,打开T2定时器,当再次时入INTO中断,计算两次中断的时间差,来确定是引导码,还是“0”或“1”。
接收完32位数据时,关T2定时器。
编译器:ICC6.31
CPU: ATmega32L
源程序:
//T2中断初始化
void T2_Start(void)
{
TIMSK|=(1<<TOIE2); //溢出中断使能
TCCR2 = 0x00; //关定时器
TCNT2 = 0x00;
TCCR2 = 0x07; //1分频,定时35uS
}
//关T2中断
void T2_Stop(void)
{
TCCR2 =0x00;
TIMSK&=0x3f; //关溢出中断
}
//INT0中断初始化
void INT0_Init(void)
{
MCUCR|=(1<<ISC01); //下降沿触发
GICR |=(1<<INT0); //INT0中断使能
}
//T2中断程序
#pragma interrupt_handler T2_Interrupt:6
void T2_Interrupt(void)
{
if(IF_RecvDataCount>0)
{
IF_RecvNewTime++;
}
}
//INTO中断程序
#pragma interrupt_handler INT0_Interrupt:2
void INT0_Interrupt(void)
{
unsigned char j,i,Temp,Mode,Dat,RcvFlag;
CLI();
IF_RecvDataCount++; //中断次数计数
//PutString_Usart(IF_RecvDataCount);
Temp=(IF_RecvNewTime-IF_RecvOldTime); //中断间距
IF_RecvOldTime=IF_RecvNewTime;
if(IF_RecvDataCount==1) //第一次进中断
{
T2_Start(); //启动定时器,35us中断一次
IF_RecvNewTime=0;
IF_RecvOldTime=0;
}
else
{
if( (Temp>310)&&(Temp<340) ) //重码不处理,退出
{
T2_Stop();
IF_RecvDataCount=0;
IF_RecvNewTime=0;
IF_RecvOldTime=0;
IR_Addr=0;
IR_Data=0;
RcvFlag=0;
}
if( (Temp>370)&&(Temp<400) ) //引导码
{
RcvFlag=0;
}
if( (Temp>25)&&(Temp<40) ) // 0
{
Dat=0;
RcvFlag=1;
}
else if( (Temp>55)&&(Temp<70) ) // 1
{
Dat=1;
RcvFlag=1;
}
if(RcvFlag==1)
{
if( (IF_RecvDataCount>2)&&(IF_RecvDataCount<20) )
{
IR_Addr|=Dat;
if(IF_RecvDataCount<19) IR_Addr<<=1;
RcvFlag=0;
}
else if( (IF_RecvDataCount>19)&&(IF_RecvDataCount<34) )
{
IR_Data|=Dat;
IR_Data<<=1;
RcvFlag=0;
}
else if(IF_RecvDataCount==34)
{
IR_Data|=Dat;
IF_RecvDataOver=0;
T2_Stop(); //接收完毕,清计数器
IF_RecvDataCount=0;
IF_RecvNewTime=0;
IF_RecvOldTime=0;
IR_Addr=0;
IR_Data=0;
RcvFlag=0;
}
}
}
SEI();
}
//主程序
void main(void)
{
//IO PORT INIT
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xBF;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0xFA;
//INT0 INIT
INT0_Init(); //INT0初始化
SEI();
while(1)
{
;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|