Microchip
直播中

崔丹

8年用户 178经验值
私信 关注
[问答]

随机函数不是很随机

我编写了一个程序,它允许用户使用按钮点亮LED,当用户在几秒钟内什么都不做时,TMR1生成一个中断,在ISR中有一个case语句,它点亮某些LED,并使用随机数生成器来选择使用哪种情况。说我不介意RAND函数在每次芯片供电时给出相同的序列。这就是为什么我在s rand(TMR0)开始时使用简单的种子。然而,即使程序运行了很长时间,程序中的rand函数也总是返回相同的值。ISR每次返回时随机数是否被重新发送?

回帖(15)

丁亚念

2019-9-26 10:45:45
关于代码结构的一些注释。首先包括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标志,直到定时器翻转,完全避免中断。
举报

张丽雯

2019-9-26 11:01:59
我可能错过了它,但看起来没有CLRWDT()来看守看门狗。我建议把它关掉,直到你对代码的(非看门狗)操作满意为止。
举报

h1654155275.5661

2019-9-26 11:20:16
当我关掉看门狗时,我的中断不再工作了。
举报

h1654155275.5661

2019-9-26 11:51:38
因为对于初学者来说,没有中断的调试要容易得多。而且中断还会导致很多初学者不考虑的分支。例如,在中断内部使用这些乘法和除法操作意味着编译器必须推送和弹出数学例程使用的大量信息。现在,我认为您的程序流有缺陷。轮询定时器不会对用户造成任何可见的差异,并且避免使用c。中断了。我暂时中断了,但我仍然有同样的问题。当WDT在上时,轮询与中断具有相同的结果。当WDT关闭时,TMR1出错。我做了一些调试,如果我有(tMR1H & gt;50),那么随机选择的函数就永远不会运行。但是,如果我使用40而不是50,那么它运行,但是对于我的应用来说,这个周期太频繁了。使用WDT onTMR1H==255工作。TMR1使用TMR0进行选通,我检查了TMR0,它达到255并且溢出。而且,随着WDT关闭,随机选择看起来更加随机。这很好,WDT怎么可能导致TMR1提前复位?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分