WHX 发表于 2025-1-11 10:42:17

定时器用作计数模式,寄存器值不能清零问题,急救!!

<p>项目中发现,定时器用作计数模式,寄存器值不能清零问题,目前比较急,急盼各路大佬支招,感谢!!描述如下:</p>
<p>一、代码:<br />
<img src="data/attachment/forum/202501/11/103852g92s847zi7u44ive.png" alt="17f1780e9fdb7b2b3c50be950dcf061.png" title="17f1780e9fdb7b2b3c50be950dcf061.png" /></p>
<p>用示波器监控实际真实的计数脉冲有没有到P0.4及P0.6脚上,结果用示波器监控发现是有的:</p>
<p><img src="data/attachment/forum/202501/11/103955nf2d9g7d2jhsn92g.png" alt="a34442001b7f5c12d8c3bda833a656a.png" title="a34442001b7f5c12d8c3bda833a656a.png" /></p>
<p>用485打印监控也有:</p>
<p><img src="data/attachment/forum/202501/11/104033lswsh9s4uuukue4u.png" alt="a6bfea31bd5b03249b630d09636f1a0.png" title="a6bfea31bd5b03249b630d09636f1a0.png" /></p>
<p>二、手册里面对定时器3的相关描述:</p>
<p><img src="data/attachment/forum/202501/11/104117i4sdomg34ny7elno.png" alt="560b5c6c0cdf7fc2360fb536301c9ed.png" title="560b5c6c0cdf7fc2360fb536301c9ed.png" /></p>
<p>按照手册里面此处的描述,当定时器3用作计数方式【T3_C/T=1】、T3R=0时,我程序里面写T3H=0及T3L=0,此时应该可以对T3H及T3L写入0的,但是无论我如何操作都不能对T3H及T3L清0,此时读取的T3H及T3L仍然是接续计数停止前上次的值。</p>
<p><img src="data/attachment/forum/202501/11/104146gsifmzdtsodtx3ox.png" alt="1743c2fe78371b0aa56bd0f115de051.png" title="1743c2fe78371b0aa56bd0f115de051.png" /></p>
<p>实在不能理解!</p>

WHX 发表于 2025-1-11 12:36:28

<p>希望高手帮忙分析一下,感谢<img alt="baoquan" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/baoquan.gif" title="baoquan" /></p>

DebugLab 发表于 2025-1-11 23:13:12

需要手动清零用16位不自动重载模式

WHX 发表于 2025-1-12 08:48:25

DebugLab 发表于 2025-1-11 23:13
需要手动清零用16位不自动重载模式

定时器3、4只有固定的16位自动重载模式。

WHX 发表于 2025-1-12 08:54:49

DebugLab 发表于 2025-1-11 23:13
需要手动清零用16位不自动重载模式

<p><img src="data/attachment/forum/202501/12/085446uxiiw6yd3wi6clrc.png" alt="1736643266566.png" title="1736643266566.png" /></p>

WHX 发表于 2025-1-12 09:14:46

<p><img src="data/attachment/forum/202501/12/090941w668b4bebzeheebz.png" alt="1736644173701.png" title="1736644173701.png" /><br />
若是按照手册里面此处的描述,当定时器3用作计数方式【T3_C/T=1】、且停止计数【T3R=0】时,我程序里面写T3H=0及T3L=0,此时应该可以对T3H及T3L写入0的,但是无论我如何操作都不能对T3H及T3L清0,此时读取的T3H及T3L仍然是接续计数停止前上次的值。同时定时器3、4用作计数器时只有16位自动重装载模式,不知道是否是与此相关,只要处于16位自动重装载模式就不能改变T3H及T3L的值,有此疑问,但是不知是否确定是这样????????另外,我在计数器3、4初始化时却是可以写T3H=0及T3L=0的,这就给人一种误导,结合上面的的手册里面的相关描述的截图内容,很容易让人认为是可以在计数器停止时对寄存器进行清零操作的,唉,若此问题不能解决,我们的项目就要黄了,年都过不好了!!!!!!!</p>

WHX 发表于 2025-1-12 09:17:23

<p>想把定时器3、4改为0或1、2,但是硬件已经固化,也无法更改了!悲催了!!!!!</p>

王昱顺 发表于 2025-1-12 17:51:10

<p>你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的</p>
<pre><code class="language-c">while (1)
{
        if(P34_flag)
        {
                P34_flag = 0;
                in_cnt = ((u16)TH0&lt;&lt;8|(u16)TL0);
                printf(&quot;T0++,This Num=%d\r\n&quot;,in_cnt);
        }
        if(P35_flag)
        {
                P35_flag = 0;
                TCON &amp;= ~(0x30);//clear TR0/TF0
                TMOD &amp;= ~(0x0f);//clear T0_mode/C_T/GATE
                TH0 = TL0 = 0x00;
                printf(&quot;T0 clear,This Num=0!\r\n&quot;);
                T0_CT = 1;//in_cnt
                TR0 = 1;
                printf(&quot;T0 reload and run\r\n&quot;);
        }
}
</code></pre>
<p><img src="data/attachment/forum/202501/12/175220kkfevkv9vp9z9ssm.png" alt="image.png" title="image.png" /></p>
<p>补充测试T4也是一样的</p>
<p><img src="data/attachment/forum/202501/12/180446huwnd94dmydrfgdg.png" alt="image.png" title="image.png" /></p>
<p>详请参阅测试程序:</p>
<pre><code class="language-c">if(P33_flag)
{
        P33_flag = 0;
        T4T3M &amp;= ~(0xf0);//clear T4R/T4C_T/T4x12/T4CLKO
        T4H = T4L = 0x00;
        printf(&quot;T4 clear,This Num=0!\r\n&quot;);
        T4_CT = 1;//in_cnt
        T4R = 1;
        printf(&quot;T4 reload and run\r\n&quot;);
}
if(P06_flag)
{
        P06_flag = 0;
        in_cnt = ((u16)T4H&lt;&lt;8|(u16)T4L);
        printf(&quot;T4++,This Num=%d\r\n&quot;,in_cnt);
}
</code></pre>

WHX 发表于 2025-1-12 18:07:17

王昱顺 发表于 2025-1-12 17:51
你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的 ...

T0及T1确实可以清零,是因为它们都具有几种模式,但是T3、T4只具有16位自动重载模式,应该不支持对T3H、T4H、T3L、T4L清零的。没办法,我只好另选他法了,感谢指导!!

WHX 发表于 2025-1-12 18:16:02

王昱顺 发表于 2025-1-12 17:51
你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的 ...

主要是我的硬件也已经固定无法更改了,只能使用T3、T4的外部脉冲计数输入端了。但是我发现只要给芯片断电重新上电,T3、T4的计数寄存器就可以自动恢复为0值,无奈我只好采用软件复位的方式来进行清零操作,虽然太笨了,但是也暂时解决了目前的不清零问题。
页: [1] 2
查看完整版本: 定时器用作计数模式,寄存器值不能清零问题,急救!!