完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我编写了一个程序,它允许用户使用按钮点亮LED,当用户在几秒钟内什么都不做时,TMR1生成一个中断,在ISR中有一个case语句,它点亮某些LED,并使用随机数生成器来选择使用哪种情况。说我不介意RAND函数在每次芯片供电时给出相同的序列。这就是为什么我在s rand(TMR0)开始时使用简单的种子。然而,即使程序运行了很长时间,程序中的rand函数也总是返回相同的值。ISR每次返回时随机数是否被重新发送?
|
|
相关推荐
15个回答
|
|
|
关于代码结构的一些注释。首先包括xc.h。不要包括pic16f1788.h,xc.h为您做这些。不要包括stdio.h。嵌入式程序很少需要它。您不需要中断函数的原型。将写入PORT寄存器的所有引用更改为写toLAT为了避免读-修改-写问题,例如“PORTAbits.RA0=1;”->;“LATAbits.LATA0=1;”避免在中断服务例程内执行时间密集的操作。在这里中断很少,但通常应该避免。这些“#pragma config”行不是可执行语句。不要将它们放入in it函数中,它们应该出现在源代码的开头,包括xc.h之后,但是在任何execu之前。表代码。在所有其他初始化代码完成之前,不要在INTCON中设置GIE位。不要使用看门狗(甚至在配置中也不要启用它),直到所有其他代码都正常工作。最后,这根本不是一个很好的中断使用。在按下按钮时,主循环仍在运行,继续调用._timers()并重置LED,直到释放按钮。一旦打开LED,就可以轮询TMR1IF标志,直到定时器翻转,完全避免中断。
|
|
|
|
|
|
我可能错过了它,但看起来没有CLRWDT()来看守看门狗。我建议把它关掉,直到你对代码的(非看门狗)操作满意为止。
|
|
|
|
|
|
当我关掉看门狗时,我的中断不再工作了。
|
|
|
|
|
|
因为对于初学者来说,没有中断的调试要容易得多。而且中断还会导致很多初学者不考虑的分支。例如,在中断内部使用这些乘法和除法操作意味着编译器必须推送和弹出数学例程使用的大量信息。现在,我认为您的程序流有缺陷。轮询定时器不会对用户造成任何可见的差异,并且避免使用c。中断了。我暂时中断了,但我仍然有同样的问题。当WDT在上时,轮询与中断具有相同的结果。当WDT关闭时,TMR1出错。我做了一些调试,如果我有(tMR1H & gt;50),那么随机选择的函数就永远不会运行。但是,如果我使用40而不是50,那么它运行,但是对于我的应用来说,这个周期太频繁了。使用WDT onTMR1H==255工作。TMR1使用TMR0进行选通,我检查了TMR0,它达到255并且溢出。而且,随着WDT关闭,随机选择看起来更加随机。这很好,WDT怎么可能导致TMR1提前复位?
|
|
|
|
|
|
我做了更多的调试,并编写了一个程序,只在TMR1溢出时点亮一个LED。一些奇怪的事情正在发生。首先,蓝色LED在WDT期间保持发光,然后关掉。我尝试了几种不同的WDT超时设置,这就是正在发生的事情。鉴于我只设置RA1至1,我希望它打开,永远不会关机。我认为PIC正在重置并运行初始化函数,该函数将一切重置为0。而且,TMR1翻转的时间似乎也受到WDT周期的影响。
|
|
|
|
|
|
你有意启用LVP吗?你为什么要增加WDT的额外复杂性?
|
|
|
|
|
|
不,那是无意的。我把它关掉了。我不想让WDT打开,但是TMR1只因为某个原因而计数和翻转。中断或轮询可以捕获翻转。
|
|
|
|
|
|
这正是我所期望的你发布的代码。你认为它会做什么?当看门狗定时器过期时,你认为会发生什么?PIC复位,所有的引脚变成输入,所以LED断开。是的,这就是它所做的。你认为它做了什么?不,不是。很难遵循你的思维模式,因为你没有确切地表明你做了什么,你期望发生什么,以及每次考试都发生了什么。
|
|
|
|
|
|
不,不是。很难跟随你的思维模式,因为你没有确切地显示你做了什么,你预期会发生什么,以及每个测试都发生了什么。当WDT在16s时,WDT在2s139s时断断续续地进行。WDG WDT周期。我的想法是重置的频率会随着WDT周期的延长而降低。无论如何,我不想使用WDT,因为它使重置变得复杂。我不想在.(1)循环中重置。我试图使用TMR1来打开LED,方法是使用if语句(TMR1L>240),我也用tried if(TMR1H>240)。我原以为这两种说法都会在第一次溢出之后把LED变成固体。低比特寄存器应该比高比特寄存器更快地翻转。然而,LED从未开启。
|
|
|
|
|
|
我做的替代TMR1是写一个软件计数器,这是期望的结果。然而,我认为如果可能的话,使用TMR1将是更好的实践。
|
|
|
|
|
|
当你做这个测试时,WDT是否完全关闭(在配置字中)?
|
|
|
|
|
|
是的,我设置为0,也改变了γ值。
|
|
|
|
|
|
我没有16F1788可以玩。我不确定TMR1上的门控模式是否像你想象的那样工作,但从未使用过,我也不确定它是如何工作的。你觉得它如何工作的,你做过什么来验证它?我不认为它只是时钟TMR1每次TMR0溢出。
|
|
|
|
|
|
盖克!请注释二进制“魔术”数字在未来(并保持评论最新)。您需要启用单击模式之前,激活它。类似地,您不应该在它完全配置之前启用计时器。这取决于您的代码轮询计时器0,而它的255。根据您的预定标器设置和轮询循环执行所需的时间,可以命中多次或完全丢失。正确的定时器0溢出轮询将使用:因为即使禁用相应的中断启用标志,硬件也会设置中断标志。
|
|
|
|
|
|
我发现了为什么门控TMR1不工作的原因。我在T1GCON中启用了TMR1门单脉冲模式。根据这种模式下的数据表,一旦在门脉冲之后T1GGO/DONE位自动变为0,就不允许其他门事件增加Timer1,直到在软件中再次设置T1GGO/DONE位。检查值为255时的EAD。我现在没有任何问题,因为两个定时器预分频器我已经设置为最大值目前,但随着我的程序增长,它可能错过过渡到255。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
501 浏览 0 评论
5811 浏览 9 评论
2350 浏览 8 评论
2237 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3543 浏览 3 评论
1159浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1120浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
888浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
501浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 09:35 , Processed in 1.080093 second(s), Total 102, Slave 85 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4313