本帖最后由 sanguanko 于 2015-10-23 15:38 编辑
ATmega8的datasheet里面说:
当引脚ICP1 上的逻辑电平 ( 事件 ) 发生了变化,或模拟比较器输出ACO电平发生了变
化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发:16位的TCNT1数据被
拷贝到输入捕捉寄存器ICR1,同时输入捕捉标志位ICF1置位。如果此时ICIE1 = 1,输
入捕捉标志将产生输入捕捉中断。中断执行时ICF1自动清零,或者也可通过软件在其对
应的I/O位置写入逻辑"1”清零。
但是我的程序里,目的是测量一个上升沿和一个下降沿之间的脉冲宽度。Atmega8@11.0592MHz,ICCAVR编译。感谢
我的分析方法:晶振是11.0592MHz,经过64分频,T/C1时钟周期约为5.787uS,待测量的信号周期约4.5ms,上升沿来的时候将TCNT1清零,那么下降沿来临是TCNT1的计数值应该为4.5ms/5.787us=778左右,并且该数值会被考进ICR1中,但是读出来的值跟778相差太远。我的分析方对确吗?是哪里写错啦?信号源没问题已经用示波器抓过图周期是4.5ms 左右。恳请高人指点
#include <iom8v.h>
#include <macros.h>
unsigned char flag;
unsigned int pulse_length;
void ICEInit(void)
{
TCCR1A=0X00; //设置为普通模式
TCCR1B|=(1<<ICNC1)|(1<<ICES1)|(1<<CS11)|(1<<CS10);//噪声抑制,上升沿触发,64分频
TIMSK|=(1<<TICIE1);//使能捕捉输入中断
}
void IOInit(void)
{
DDRB&=0<<PB0;
PORTB|=1<<PB0;
}
#pragma interrupt_handler IceInt:6 // 中断程序说明
void IceInt(void)
{
if(flag==0)
{
flag++;
TCNT1=0x00;
TCCR1B&=(0<<ICES1);//下降沿触发
TCCR1B|=(1<<ICNC1)|(1<<CS11)|(1<<CS10);//噪声抑制,64分频
}
else
{
TCCR1B&=(0<<CS10);//关闭计数器
TCCR1B&=(0<<CS11);//关闭计数器
flag=0;
TCCR1B|=(1<<ICNC1);//噪声抑制
TCCR1B|=(1<<ICES1);//上升沿有效
pulse_length=ICR1;
}
putchar0(0xAA);
oput_int(pulse_length);
putchar0(0xBB);
}
main()
{
uart0_init();
ICEInit();
flag=0;
SEI();
while(1);
}
|