stc8g1k08a定时器0, 1互相干扰
本帖最后由 peitianyu 于 2023-11-18 17:42 编辑串口选择定时器1为波特率发生器, 然后我的定时器0周期是20us, 我在定时器0中计时1s打印一次数据, 频率有问题.
具体代码如下:
仅开gpio时间周期是没啥问题的, 加上串口输出, 打印频率与io口输出频率就很不对劲
本帖最后由 王昱顺 于 2023-11-18 18:19 编辑
失效的最主要原因应该是TMOD设置混乱,后一个初始化把前一个给覆盖掉了
你查看一下uart1_init()的具体代码,应该是操作寄存器的时候使用直接赋值给覆盖掉了
或者你可以尝试将串口的初始化放在前面,然后使用stc-isp中的定时器计算器生成代码
本帖最后由 peitianyu 于 2023-11-18 18:50 编辑
王昱顺 发表于 2023-11-18 18:12
失效的最主要原因应该是TMOD设置混乱,后一个初始化把前一个给覆盖掉了
你查看一下uart1_init()的具体代 ...
您好, 可以帮我看一眼吗? 我是这么操作的C:\Users\peitianyu\Desktop\屏幕截图 2023-11-18 184849.png C:\Users\peitianyu\Desktop\屏幕截图 2023-11-18 183830.png peitianyu 发表于 2023-11-18 18:49
您好, 可以帮我看一眼吗? 我是这么操作的
代码设置应该是没有问题的,我仔细想了一下,可能有以下几种可能:
1.你这个看起来像是使用了任务调度,也就是说有一个定时器在处理定时任务的执行。有没有可能正好是T0/T1?
==解决办法把占用的定时器切换出去
2.你的这个定时时间是20us。这已经是相当短的时间了,这会使得频繁触发中断。如果恰好你的定时器0中断里面加入了较多的判断和处理语句,那么将使得程序CPU负载异常高。
同时因为在默认优先级状态下,T0的优先级较高。很可能串口在输出的时候被反复打断。
==解决办法,在串口执行代码中,前面加上ET0 = 0;后面加上ET0 = 1;这样可以短暂屏蔽中断,但是会对时间的精确性造成干扰。
我之前也研究过这种任务定时类型的程序,一般来说定时选择1ms比较好。否则系统会有相当高的负载。
我实现了一下你的这个功能,你看着参考一下吧,我用的是STC8H8K64U,不过代码基本通用,改改就能用了
attach://27231.mp4
本帖最后由 peitianyu 于 2023-11-19 21:16 编辑
王昱顺 发表于 2023-11-18 21:14
我实现了一下你的这个功能,你看着参考一下吧,我用的是STC8H8K64U,不过代码基本通用,改改就能用了
实在太感谢您了, 我思考了一下, 感觉像是优先级的问题, 我待会照着您的思路设置一下, 以下是我的代码, 如您有空的话, 可以具体看看啥原因
建议新人全部用仿真功能来调试 神农鼎 发表于 2023-11-19 21:24
建议新人全部用仿真功能来调试
好的, 我试试 peitianyu 发表于 2023-11-19 20:51
你现在是想实现什么样子的功能呢?我有空帮你看看 王昱顺 发表于 2023-11-20 09:52
你现在是想实现什么样子的功能呢?我有空帮你看看
我希望实现的功能是i2c控制舵机程序, 这部分主要是任务系统有问题, 我希望在读adc的时候能够print一下, os的目的是因为希望做成一个模板, 之后在别的程序中用起来更加方便一些
页:
[1]
2