完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
好,先说一些细节。我有一个霍尔传感器连接到本主题中列出的设备上的INT0。我有一个定时器,2+3,作为32位定时器运行。我有一个中断服务例程,配置为在INT0的下降沿激活,即当磁铁通过霍尔传感器的名义高输出时。或者,我有一个通过SPI连接的LCD屏幕,可以显示正在发生什么,也可以不显示正在发生的情况。我中断的目的是测量INT0引脚上的下降沿之间的时间,看起来是这样的。注意,这是我第一次实际使用中断,但是对于所有的意图和目的,中断本身都是有效的,它只是我从中得到的数据不是.void_.((u inter._,auto_psv))_ISR_INT0Inter.(void){_INT0IF=0;//Clears中断标志。IEC0BIT.It00IE=0;/ /禁用中断TMR3P= TMR3;/ /设置存储在TMR3计数器内的值的变量。TMR2=0;/ /重置计时器为零。TMR3=0;/ /重置计时器为零。IEC0BIT.ITE0IE=1;/ /重新启用中断。}现在我在LCD屏幕上显示变量TMR3P的值,但是它输出的值不是我所期望的。好像计时器计数不顺畅,只能输出某些数字。例如,通过手动刺激,即我挥动磁铁周围,它会说,显示502,并在下一个激活604。但是,如果我继续以大致相同的输入频率激活,它将简单地在两个相同的数字之间跳跃,而在两者之间没有跳跃。显然,它会跳转到其他值,这取决于我在405、202、307等周围摇动磁铁的速度,但问题是,由于某种原因,存储的变量似乎不能以任何程度的精细分辨率存储,这对于精确的时间测量完全没有用。我意识到这是在计算的输出(基于计时器值)没有任何意义的时候发生的,并且我尝试了各种不同的事情来试图弄清楚发生了什么。侧主环,只是为了检查它计数顺利,它确实计数顺利。结合这一点,我试图简化了中断服务路由,这样它做的只是将定时器重置为零,而且这工作也非常完美。计时器平滑地从零开始计数,并在iT0的下降沿复位到零。然后,再次平稳地计数。我试过各种组合,在ISR内停用定时器,重新激活定时器和重置定时器,我试过许多不同的变量类型,但结果总是相同的。虽然计时器实际上是计数和复位顺利(我可以看到它是在显示器上)。定时器的存储值(TMR3P,存储在数据空间中,也显示在屏幕上)总是以这些固定数字结束,而不会连续平滑。这里到底发生了什么?我完全糊涂了,有人有什么想法吗?处理器运行在70MIPS。非常感谢,Matt。
|
|
相关推荐
9个回答
|
|
|
如果使用32位定时器,则需要使用HLD寄存器。要读取定时器,也不要在ISR中禁用/启用中断。
|
|
|
|
|
|
有几件事;没有必要禁用ISR内部的中断,只要清除ISR末尾的标志即可。如何声明TMR3P变量?在ISR内部和ISR外部访问的变量必须被正确地声明;声明它为volatile以告诉编译器它可能意外改变。
|
|
|
|
|
|
我在PIC(Irc)上使用了RealTimeR()等功能,一切都很好,32位也很好。
|
|
|
|
|
|
谢谢大家!还有很多事情要做,并且给了我一些尝试的机会。对于中断实现,我遵循了一个在线指南,它甚至建议您在例程的开始和结束时都清除中断标志,这没什么意义。我想知道计时器hld寄存器是用来干什么的,很遗憾,他们没有在标准数据表中告诉你,至少据我所知,他们没有,也许我错过了。我以前在这个设备上使用过32位计时器,在其它项目中,从来没有遇到过麻烦,但是后来,这些没有出现过。需要绝对的精确度,我现在的问题不会很明显。再次感谢大家,我会看看这些建议是否有助于解决问题。
|
|
|
|
|
|
哪一个在线指南?网上贴了很多垃圾,只是为了吸引搜索引擎来获得按次付费的广告收入。
|
|
|
|
|
|
不,这没有道理。不能相信你在互联网上阅读的一切!特别是如果它没有意义的话。通常在ISR开始或结束时清除标志并没有太大的区别,只有在一些非常罕见的情况下,中断才能在ISR完成之前重新发生,并立即重新触发ISR。这通常预示着某个地方的糟糕设计。
|
|
|
|
|
|
我很清楚数据表的局限性,我知道它们并没有涵盖所有的特性。我本来以为,在32位操作期间,有关正确读取和写入计时器的方法的细节应该在包含什么内容的清单中占据相当高的位置。我也知道参考手册。已经阅读了定时器的扩展参考资料,尽管看起来直接阅读TMR3实际上不是问题。TMR3HLD只是一种存储数据的方式。当TMR2读开始时,TMR3的内容也被复制到TMR3HLD中。这样你就可以读取TMR3在读取TMR2的瞬间的状态,而不是在几个周期之后,当TMR3的值可能已经明显改变时。反过来也是一样的,您将TMR3HLD设置为某个特定的值,然后在写入TMR2时,它将TMR3HLD复制到TMR3,在完全相同的时刻。TMR3HLD基本上是在作为32位定时器工作时,对两个单独的定时器寄存器进行同步读/写。除此之外,我已经尝试过本文中提到的方法,但是都不起作用。完全相同的事情正在发生。所以我又开始挠我的头了。
|
|
|
|
|
|
你有没有观察到传感器的信号进入到PIC输入(It0)的范围内?也许你在磁通的每个边沿得到一个双脉冲(或类似的东西),所以得到“通过时间”而不是“通过间隔”?
|
|
|
|
|
|
这应该被用作自行车速度计(除其他外),并且磁铁通过传感器(即车轮旋转)的速度被转换成kph的读数。我让程序的那个部分工作(通过知道车轮直径,将脉冲之间的时间转换成实际kph的部分)。这个系统能够以1kph的增量(磁通很少)在1-10kph之间给我一个读数,但是如果我试着走得更快的话。直接跳到12,然后跳到14,然后逐渐变差,跳过大块的个别速度。例如,它将非常高兴地跳在21和28公里之间(或类似)。随着时间值越来越小,在比如说402和502之间跳跃,你可以想象,如果它真的应该告诉我450,以便进行精确的速度计算。我只是尝试了一些其他的方法,看看是否能得到不同的结果。我把32位的定时器换成了16位的。然后,我配置另一个中断,它将在每次16位定时器达到周期寄存器中存储的值时递增一个变量。实际上,在软件中创建我自己的32位定时器。而硬件32位定时器会增加MSB定时器寄存器,这里我用软件增加一个变量。最终结果完全一样。正如您可能想知道的,也许问题不在于定时器,而在于其它地方。这需要进一步研究……奇怪的是它不是霍尔传感器的双重激活,否则1-10kph的测量也会搞砸,但是对于所有意图和目的,霍尔传感器都能够非常快速地切换,用于内部位置数据的中继。无刷电机允许软件换向。PIC24E在70MIPS中嗖嗖飞过,我试着测量和时间大约每秒2-3次…
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:37 , Processed in 0.921486 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1573