找回密码
 立即注册
查看: 290|回复: 6

请帮忙检查使用定时器3制作的定时器程序对不对?

[复制链接]
  • TA的每日心情
    开心
    2024-5-25 12:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    36

    主题

    89

    回帖

    802

    积分

    高级会员

    积分
    802
    发表于 2024-2-20 01:24:11 | 显示全部楼层 |阅读模式
    使用STC8H8K64U的定时器3写了一段定时器程序。恳请请行家指点对不对。程序如下:
    void delayS(u8 delaysvalue)       //delaysvalue参数为输入的整数秒值,例如1秒、2秒、5秒、6秒等。
    {
          u8 i ;
           
            TM3PS = 14 ;                                     //这是根据晶振11059200,通过预分频,使得定时器一个周期为1秒。
      
    //          T3_VALUE = 65536-XTAL/(TM3PS+1)/12 ;           //1秒定时参数计算公式
            T3H = 0x10 ;                                     //计算的定时1秒值
              T3L = 0x00 ;                                     //计算的定时1秒值
            T4T3M = 0x08 ;                                   //启动T3定时器
        for (i=0;i<delaysvalue;i++)                         //根据需要延时的秒数循环
        {         
            while( ~(0x02 & AUXINTIF) );                 //等待定时器3中断。检测T3IF中断请求。
        }
        T4T3M &= ~0x08 ;                                   //停止T3运行
    }

    void TM3_Isr() interrupt 19                          //定时器3中断服务子程序,同时硬件清除T3的中断标志
    {
                                                         //其它什么都没有做
    }

    编译没有问题和警告。但上述程序能否正确运行不太踏实?在循环等待检测T3IF中断请求语句,会不会死循环?
    主程序中已经设定:
        IE2 |=0x02 ;                                     //允许定时器3中断,没有中断优先级设定。
        EA = 1     ;                                     //开CPU中断
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 137 天

    [LV.7]常住居民III

    39

    主题

    406

    回帖

    2160

    积分

    荣誉版主

    积分
    2160
    发表于 2024-2-20 05:31:58 | 显示全部楼层
    运行应该是没问题的。但是请注意,程序中使用的auxintif在某些单片机系列中是只写寄存器,
    你如读他,可能不是你预测的值,如逻辑判断不合理,你程序写的不好可能就会自己在那永远循环等待。

    比如stc8h1k08和28系列。具体请参考技术手册的中断请求寄存器的注意事项部分
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 107 天

    [LV.6]常住居民II

    42

    主题

    1028

    回帖

    7100

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    7100
    QQ
    发表于 2024-2-20 08:07:58 | 显示全部楼层
    个人建议可以考虑一个定时器作为基准时间计时,或者直接荣rtc来长时间计时,这样用显得有点浪费定时器了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 124 天

    [LV.7]常住居民III

    10

    主题

    604

    回帖

    1026

    积分

    金牌会员

    积分
    1026
    发表于 2024-2-20 08:49:47 | 显示全部楼层
    如,楼上所说,建议楼主优化定时器的使用技巧。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-25 12:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    36

    主题

    89

    回帖

    802

    积分

    高级会员

    积分
    802
     楼主| 发表于 2024-2-20 14:16:40 | 显示全部楼层
    谢谢楼上行家的回复!正在使用STC8H8K64U,定时器3/4都没有使用。长时间定时使用的不多,尝试用定时器3。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-25 12:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    36

    主题

    89

    回帖

    802

    积分

    高级会员

    积分
    802
     楼主| 发表于 2024-2-20 21:57:15 | 显示全部楼层
        定时器3延时程序实际测试结果表明,语句“while( ~(0x02 & AUXINTIF) );”会导致死循环!
            延时程序中的for循环部分改为如下:
            for (i=0;i<delaysvalue;i++)
        {         
        //        while( ~(0x02 & AUXINTIF) );                       //等待定时器3中断。检测T3IF中断请求
                        while( ~tm3intflag );              //设置了一个全局位变量:t3mintflag。初始化为0,在中断服务程序中修改
                        tm3intflag = 0 ;                    //自定的TM3中断标志清零
                       View( i );                              //编制的CDC串口输出子程序,调用以显示中断是否正常。
        }
           
            设置了一个全局位变量:t3mintflag。初始化为0,在“void TM3_Isr() interrupt 19”中断服务程序中置1:
            void TM3_Isr() interrupt 19                                //定时器3中断服务子程序,同时硬件清除T3的中断标志
          {
                tm3intflag = 1 ;                                       //TM3中断标志置位
         }
      
          程序按上述修改后才可以正常运行。推测应该是TM3中断程序在前清零了中断标志,导致“while( ~(0x02 & AUXINTIF) );”始终检测不到中断发生。
         自己设定的中断标志,才能实现定时器3的延时。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    557

    主题

    9719

    回帖

    1万

    积分

    管理员

    积分
    14208
    发表于 2024-2-20 22:55:28 | 显示全部楼层
    截图202402202254545389.jpg

    截图202402202255236634.jpg


    截图202402202256107736.jpg

    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-2 17:36 , Processed in 0.065054 second(s), 57 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表