实现目的如标题 。
条件:脉冲间隔是不确定可能毫秒级别也可能几十微秒,脉宽同理(可能几毫秒可能微秒级别)。
硬件上我用的单片机是atmega8,使用的外部10M晶振。
我使用过的方法:
外部中断方式1:在中断中给一个变量,每次检测一个下降沿进入中断,变量自加。在中断中给一个if判断,若记录到我想要的次数。将flag=1,主程序中一直检测flag,若==1则执行动作。
void int1_isr(void)
{
GICR&=~BIT(INT1);
while((PIND&BIT(3))==0x00);
num++;
if(num==5)
{
num=0;
flag=1;
// PORTD|=BIT(PD4);
}
GIFR|=BIT(INTF1);
GICR|=BIT(INT1); //打开中断1使能
}
我觉得逻辑上应该没有错,问题如下
问题1:我在检测的时候发现,中断检测存在不稳定性,我给一个脉冲可能进两次中断(排除是初始化原因)。这导致计数出错。
问题2:单片机在上电过程中避免不了的存在电涌的情况,我的脉冲发生装置也如此,这样会出现个别脉冲被检测到,使num初始不为0,我只能在上电后发送代码清num值。我想避免这种现象。
方法2:使用计数器来实现记录脉冲次数,当溢出时flag=1
用计数器1 初始值设成
TCNT1H=0xFF;
TCNT1L=0xFB;//也就是65531 当65536时溢出
TCCR1B|=0x06;//0x04 256分频0x05 1024分频 0x02 8分频 0x06外部下降 0x07 外部上升沿
TIMSK|=BIT(2); 计数器1使能
脉冲输入点接在mage8的T1(PD5)
问题和中断出现类似,表示很无奈,请高手指点迷津。
|