|
现在想用AVR的输入捕捉功能区捕捉一个16ms周期2ms高电平时间的方波
但是一直捕捉不到,求大神解释,急啊,急啊,不知道问题出在哪儿了,在线等啊,不胜感激
unsigned char up;
unsigned char down;
void port_init(void)
{
PORTD = 0xFF; //输入上拉电阻使能,输出引脚为高电平
DDRD = 0xBF; //PD4,PD5为输出,PD6为输入
}
void ICEInit(void)
{
TCCR1A=0X00;//时钟与系统相同
TCCR1B=0XC2;//使能噪声抑制,上升降沿触发,八分频,周期为1us
TIMSK=0X20;//使能捕获中断
}
void main(void)
{
DDRA=0xFF; //PD口设成输出口
PORTA=0xFF;
port_init();//端口的初始化
ICEInit();//输入捕获的初始化
SEI();//打开总中断
while(1)
{
if((down>9)&&(down<11))
{
Set_Bit(PORTA,0);
Clr_Bit(PORTA,0); //PD0 置低
}
else if((down>19)&&(down<21))
{
Clr_Bit(PORTA,0);
Set_Bit(PORTA,0); //PD0 置高
}
}
}
#pragma interrupt_handler CAPT_ISP:0X0A
void CAPT_ISP(void)
{
unsigned char sreg;
unsigned char ssreg;
if(TCCR1B&(1<<ICES1))//假如是上升沿中断
{
ssreg = SREG;
_CLI();
up = TCNT1L;
up |= ((unsigned int)TCNT1H << 8);//读取TCNT1的值
SREG = ssreg;
TCCR1B^=(1<<ICES1);
}
else//假如是下降沿中断
{
sreg = SREG;
_CLI();
down = TCNT1L;//读取TCNT1的值
down |= ((unsigned int)TCNT1H << 8);
if(up<down)
down = (down - up)/10;
SREG = sreg;
TCCR1B |= (1<<ICES1);
}
TIFR&=(1<<ICF1);//清除中断标志位
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|