打印
[AVR单片机]

atmega8的捕获问题--恳请高人指点

[复制链接]
922|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sanguanko|  楼主 | 2015-10-22 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
}  

相关帖子

沙发
sanguanko|  楼主 | 2015-10-25 00:19 | 只看该作者
本帖最后由 sanguanko 于 2015-10-25 00:27 编辑

:'(

使用特权

评论回复
板凳
SD10A| | 2015-10-25 11:45 | 只看该作者
  putchar0(0xAA);
  oput_int(pulse_length);
  putchar0(0xBB);
中断任务有点多  这是那句你放到主函数里面,
另外flag  pulse_length  用volitate

使用特权

评论回复
地板
SD10A| | 2015-10-25 21:48 | 只看该作者
else
    {
          TCCR1B&=(0<<CS10);//关闭计数器   要么没有  要么最后要开启计数器
          TCCR1B&=(0<<CS11);//关闭计数器   
要么没有  要么最后要开启计数器
         
pulse_length=ICR1L;           pulse_length|=(ICR1H<<8);
           flag=0;
          TCCR1B|=(1<<ICNC1);//噪声抑制
          TCCR1B|=(1<<ICES1);//上升沿有效
         开定时器
        }




另外你试验下把噪声抑制模式去掉    串口发送函数放到主函数 循环发送  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

290

帖子

2

粉丝