• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

寄存器类型出问题请教大师(关于单片机测频率C程序)

 unsigned long a=0;//保存16位定时器定时中断次数数据加上定时器停止时定时器高8位和低8位寄存器内剩余数值。

//因为每次开启定时器16位定时器寄存器清零,然后开始计数,这样中断一次数值都是65536。这样的数值累加是很大的所以用long型

/****************************************************************************************************/

void int1_isr(void)   //这是外中断服务程序,就是测量这个IO口的信号频率。第一个脉冲来了之后开启定时器,第二个脉冲来了之后关

{                         //闭定时器并计算定时器总共时间。    

    y^=1;     

    if(y){TCNT1H=0;TCNT1L=0;TCCR1B=0X01;}     

    else 

         {  

        TCCR1B=0X00;  

        a=a<<16;  //计算中断次数:  a=a*65536

        a=a|((TCNT1H<<8)|TCNT1L); /////定时器计数值小于32768那么这里计算后的结果是正确的,超过32768就出问题结果是42亿多

         jf=1000000/a;  //周期的倒数,也就是数码管显示的频率。频率在31Hz以上测量都是准确的,在30Hz以下就出问题。

        a=0; 

        }   

 } 

void timer1_OVF_ISR(void)    

     { 

    a++;      //每次中断这个a自加一次,就是16位定时器的值一直加到0xFFFF溢出后产生中断一次  

     }

测量频率在2Hz,3Hz也正确,10几赫兹的也有几个正确,问题就出在上面a的计算上,请教大师这是什么原因,怎么解决???

全部回复(7)
正序查看
倒序查看
fzhlpp
LV.7
2
2014-08-10 17:08
就是32位的4个字节数据加上16位的2个字节数据会出什么问题吗?我用“+”号用“|”都不行。
0
回复
2014-08-12 10:32
顶一个~~
0
回复
fzhlpp
LV.7
4
2014-08-12 19:37
@电源网-娜娜姐
顶一个~~
正愁不知道怎么结贴呢。仿真了N次,找了几天问题,上来求助又没人理,大侠们都旅游去了,只有闷头闭门造车,终于不负所望,现在问题已经解决了又不知道怎么结贴。所幸司令大人体贴关怀来顶了一下。
0
回复
fzhlpp
LV.7
5
2014-08-12 19:47
@fzhlpp
正愁不知道怎么结贴呢。仿真了N次,找了几天问题,上来求助又没人理,大侠们都旅游去了,只有闷头闭门造车,终于不负所望,现在问题已经解决了又不知道怎么结贴。所幸司令大人体贴关怀来顶了一下。[图片]
找到问题后重新烧录测试了一下,频率测试计正常工作。这里频率测量的学习就告一段落,有刚学不知道咋弄得可以一起探讨,我觉得这个功能很不错的,通过测量信号的脉宽然后用f=1/t计算出频率。学会后就觉得简单,以前看人家的产品测频觉得好神奇,,,,原来就是这么一回事!!!
0
回复
2014-08-19 10:02
@fzhlpp
找到问题后重新烧录测试了一下,频率测试计正常工作。这里频率测量的学习就告一段落,有刚学不知道咋弄得可以一起探讨,我觉得这个功能很不错的,通过测量信号的脉宽然后用f=1/t计算出频率。学会后就觉得简单,以前看人家的产品测频觉得好神奇,,,,原来就是这么一回事!!![图片]
恭喜问题解决哈  还给了我最佳回复 么么哒!~
0
回复
2014-08-19 10:02
@fzhlpp
找到问题后重新烧录测试了一下,频率测试计正常工作。这里频率测量的学习就告一段落,有刚学不知道咋弄得可以一起探讨,我觉得这个功能很不错的,通过测量信号的脉宽然后用f=1/t计算出频率。学会后就觉得简单,以前看人家的产品测频觉得好神奇,,,,原来就是这么一回事!!![图片]
fzhlpp希望我的头条帝勋章嘛~~来一个呗
0
回复
fzhlpp
LV.7
8
2014-08-19 19:35
@电源网-娜娜姐
fzhlpp希望我的头条帝勋章嘛~~来一个呗
谢谢首长关怀,可是头条帝这个是要有实力的哦,我只管偶尔打打酱油的哦,首长
0
回复