打印

Holtek的HT66F018芯片写一个100us定时器延时函数

[复制链接]
2833|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
想用定时器写一个延时,初始化程序如下:
/**********************
* TIMER 初始化
**********************/
void TIM_INIT(void)
{
        _tmpc  = 0x00;
        //TM0 模块初始化
        _tm0c0 = 0b01010000;        //计数器频率1MHz
        _tm0c1 = 0b11000000;  //计数模式
        _tm0al = 100;                                //100us定时计数值
        _tm0ah = 0;                                    //100us定时计数值
        _t0on  = 1;       
       
        _t0ae  = 1;
        _mf0e  = 1;                                                //Timer0 interrupt       
                _emi=1;

}
那么接下来怎么写呢?
void Delay(unsigned int nop_step)                                          
{                                                                                          
        while(nop_step != 0)
        {
                        nop_step--;               
        }                                                  
}
这样的延时程序应该不精确吧

相关帖子

沙发
gx_huang| | 2017-11-6 17:18 | 只看该作者
如果没有中断,当然准确了。
如果用定时器,一样有误差的。

使用特权

评论回复
板凳
夏尔holiday|  楼主 | 2017-11-7 10:21 | 只看该作者
gx_huang 发表于 2017-11-6 17:18
如果没有中断,当然准确了。
如果用定时器,一样有误差的。

/*
*  定时器0中断函数,100us @ fsys=8M
*/
void __attribute((interrupt(0x0C))) Time0(void)

{
        TIMER1_Decrement();
        _t0af = 0;// 清中断请求标志位
       
}
那中断是这样写的吗?
在timer.c中写了
unsigned int gTimer1_Delay=0;
void TIMER1_Decrement(void)  
{  
  if(gTimer1_Delay != 0x00)  
  {   
    gTimer1_Delay--;  
  }  
}

void Delay100uS(unsigned int time_us)
{
  gTimer1_Delay =time_us;
  while(gTimer1_Delay!=0);
}

使用特权

评论回复
地板
夏尔holiday|  楼主 | 2017-11-7 10:23 | 只看该作者
修正一下:
        _tm0c1 = 0b11000001;  //计数模式,比较器A匹配

使用特权

评论回复
5
gx_huang| | 2017-11-7 13:45 | 只看该作者
可以这么写,最多100US的误差。
如果每次延时都初始化一下定时器初值,会准确一些。

使用特权

评论回复
6
夏尔holiday|  楼主 | 2017-11-7 16:22 | 只看该作者
gx_huang 发表于 2017-11-7 13:45
可以这么写,最多100US的误差。
如果每次延时都初始化一下定时器初值,会准确一些。 ...

但是现在发现gTimer1_Delay变量没起作用,中断已经测了是没问题的,那是什么问题呢?要么是这个函数的问题要么是调用函数的问题,求指点

使用特权

评论回复
7
gx_huang| | 2017-11-16 11:13 | 只看该作者
夏尔holiday 发表于 2017-11-7 16:22
但是现在发现gTimer1_Delay变量没起作用,中断已经测了是没问题的,那是什么问题呢?要么是这个函数的问 ...

1、中断程序里尽量不要调用函数,特别是合泰这些堆栈很少的MCU。
2、中断函数的变量,最好定义成可挥发的属性。
3、中断函数的变量如果是多字节的,如果有中断嵌套,主程序在赋值时,可能偶尔会错误的。

使用特权

评论回复
8
HTDevelop| | 2018-9-5 13:42 | 只看该作者
本帖最后由 HTDevelop 于 2018-9-5 13:44 编辑

合泰编译器交流群上线,如使用合泰单片机写程序中有任何问题可加入一起探讨,有原厂工程师为用户解答,加入方式:

QQ群.jpg (164.15 KB )

合泰编译器讨论群

合泰编译器讨论群

使用特权

评论回复
9
mosfet初学| | 2020-9-16 16:12 | 只看该作者
这款芯片可以仿真吗?开发板用的是HT66F0185可以正常仿真,换到另一个型号HT66F018上,提示"ICE已连接,但未识别到仿真EV"

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝