功勋会员
WJ
- 积分
- 6304
- 威望
- 1456
- 贡献
- 4674
- 兑换币
- 17
- 注册时间
- 2008-4-6
- 在线时间
- 87 小时
|
<><BR><FONT size=3>前几天对ECT比较概括地讨论了一下其功能作用,虽然给出了PACB16位测速的原代码,论坛和博客上有不</FONT></P><P><FONT size=3>少朋友对累加器有不少疑问,还有朋友发邮件给我。现在将问题一一说明。</FONT></P><P><FONT size=3>1、脉冲累加器有哪些?是用来干什么的?<BR> 在HCS12DGXXX里,ECT有两个16位脉冲累加器,有4个8位脉冲累加器。这里的多少位,是说明结果寄</FONT></P><P><FONT size=3>存器是多少位的。16位的脉冲累加的结果可以达到65535,8位的可以达到255<BR> 一般是用来测外部脉冲信号个数和频率的。比如测速,速度传感器把速度转化为脉冲,测得脉冲就可</FONT></P><P><FONT size=3>以知道速度了。还有一些传感器,比如测功率的芯片,输出也是脉冲,通过单位时间里测脉冲的个数,便</FONT></P><P><FONT size=3>知道负载的功率了。</FONT></P><P><FONT size=3>2、累加器,输入捕捉,IO口跳变引发的中断三个都可以记脉冲,如何利用?<BR> 首先要明确,中断是除CPU之外的资源,当中断申请了并允许中断之后CPU便放下手上的活先完成中断</FONT></P><P><FONT size=3>里的事情,所以:中断不能太多,PC跳来跳去没有好处;其次,中断在精简,这里有几个原因:大家想一</FONT></P><P><FONT size=3>下,假如,优先级一样的两个中断,间隔很短的时间触发,但前一个中断太长了,迟迟没有RTI跳出来,</FONT></P><P><FONT size=3>那么后一个中断就牺牲了。中断有它的实时性.再就是降低主函数的效率。<BR> 而累加器就是解决了这个问题。它是单独的一个模块,无需进中断(溢出中断稍后再谈),在定时范</FONT></P><P><FONT size=3>围内直接取累加结果,有效地提高了程序的效率。但是累加器有它自身的缺陷,精度不高。一是因为它</FONT></P><P><FONT size=3>自身可能做过些数据的处理,二是16位累加器先取高位和先取低位的结果在高频脉冲情况下可能不是一</FONT></P><P><FONT size=3>样的。<BR> 输入捕捉也可以记脉冲,IC功能比较地强大。通过分频的设置就可设置自由计数器的参考时间,自由</FONT></P><P><FONT size=3>计数器提供时间参考。比如前一个脉冲的下降沿进了中断,此时TCNT为data1,后一个肪冲的下降沿也进</FONT></P><P><FONT size=3>了中断,此时TCNT为data2,那么data2-data1就是二者的间隔时间。但是会有个问题,如果data2比</FONT></P><P><FONT size=3>data1小,即TCNT溢出了一次,怎么办?这个不用但心,无符号数的情况下,14-15=254.对于16位的数</FONT></P><P><FONT size=3>运算一样的道理。呵呵,TCNT溢出一次好解决,多次呢?对了,TOF溢出中断,记录TCNT溢出的次数,再</FONT></P><P><FONT size=3>做运算就行了。但是似乎没有那个必要了,TCNT本来就是16位的,这样一来,data2-data1就不知道是多</FONT></P><P><FONT size=3>少位了。<BR> 至于PortH,PORTJ,这几个I/O端口的中断相当于FS8位MCU里的键盘中断,做脉冲记数理论上也可以,</FONT></P><P><FONT size=3>但是必需要提供参考时间。但是仔细一想,何必呢?用它做其它的事,资源利用分配合理才行。有现成</FONT></P><P><FONT size=3>的脉冲累加器不用,用它干嘛。用PORTH PORTJ口做外部硬件触发中断最好,比如摄像头的行中断,场中</FONT></P><P><FONT size=3>断;检查键盘是否按下等等。</FONT></P><P><FONT size=3>3、脉冲累加器,用8位还是16位?<BR> 这个要看怎么分配单片机的资源了。首先,8位的有4个累加器,16位的只有两个。如何选用PT0-7口</FONT></P><P><FONT size=3>的通道要具体情况具体分析。但有个原则:高频脉冲用16位的,低频的用8位的。8位的比16位的精度要</FONT></P><P><FONT size=3>高,据我个人测试,16位的在1S时间内有2%-3%的误差,8位的比它少。但是16位有它的优势,几乎不用</FONT></P><P><FONT size=3>考虑累加器溢出的情况。</FONT></P><P><FONT size=3>4、如何初始化累加器?<BR> 有以下几点需要配置:1、使能;2、设置上升沿下降沿触发计数;3是否级联;4结果寄存器清0<BR>至于ICSYS里的PACMX位看情况了。 </FONT></P><P><FONT size=3>5、8位累加器溢出的问题。<BR> 8位累加器是有溢出中断的,但只有PAC1和PAC3才有。具体的使用方法是:PACMX 为1,PAOVF为PAC3的</FONT></P><P><FONT size=3>溢出标志位,中断地址是$FFDC, $FFDD,PACTL (PAOVI)必须使能;PACMX = 1, PBOVF为PAC1的溢出标志</FONT></P><P><FONT size=3>位,中断地址是$FFC8, $FFC9,PBCTL (PBOVI)必须使能.<BR> PACMX=0时,默认情况下,上面的溢出中断指的是16位累加器的溢出中断。</FONT></P> |
|