avr输入捕捉,求助
我用的是ATMEGA48,要测800---2300US的脉冲 ICR是PB0初始化程序为
voidtime1_init(void)
{
TCCR1A=0x00;
TCCR1B=0xc1;
TIMSK1=0X20;
}
捕捉中断程序
void INcatch_ser(void)
{
uint a,b;
if(PINB&0X01) //读脚位电平
{
a=ICR1L;
b=ICR1H;
num1=(b<<8)|a;
TCCR1B&= 0XBF; //改触发方式
TIFR|=(1<<ICF1);
m=1;
}
else
{
a=ICR1L;
b=ICR1H;
num2=(b<<8)|a;
TCCR1B|= 0X40; //改触发方式
TIFR|=(1<<ICF1);
n=1;
}
if((m==1)&&(n==1))
{
if(num1<num2)num3= num2-num1;
else num3=0xffff-num1+num2;
n=0;m=0;
}
}
这样读出的num3是一个很乱的数据 本帖最后由 eblc1388 于 2012-6-5 20:30 编辑
M48 时钟多小 MHz? 要测正脉冲或负脉冲?
结果如何乱跳?
你这个中断处理程序太长,连计算间隔都在里面,没必要。你计算那些放在中断外面。另外,最好用裸中断,自己返回,节省中断反应时间。其实最好用汇编写。
就算你时钟4M,时钟间隔也才0.25us,这个也应该够了。你这个出来乱我估计是计数器溢出了,导致两个数不一定谁比谁大,num2溢出后不一定就比num1小啊。 你这个中断处理程序太长,连计算间隔都在里面,没必要。你计算那些放在中断外面。另外,最好用裸中断,自己返回,节省中断反应时间。其实最好用汇编写。
就算你时钟4M,时钟间隔也才0.25us,这个也应该够了。你这个出来乱我估计是计数器溢出了,导致两个数不一定谁比谁大,num2溢出后不一定就比num1小啊。 eblc1388 发表于 2012-6-5 20:02 static/image/common/back.gif
M48 时钟多小 MHz? 要测正脉冲或负脉冲?
结果如何乱跳?
8m的,正脉冲,就是数据不准,比如我测1000us的,1000/0。125应该是8000的,现在误差太大了,而且不不稳定 现在的程式有机会捕捉了负脉冲,因为 m 和 n 谁都可以一先一後,你没法保证。
如果你肯正是正脉冲,那就应该在 T1 init 时等待下降缘才设定上升缘捕捉。在中断内,如读脚位电平为高时,贮存 T1 捕获埴及改设捕捉缘为下降便可。
如读脚位电平为低,便可计算实际捕获长度了。在对 num3 计算後,把捕捉缘改成上升。
页:
[1]