P24FJ256GB106用定时器中断写延时函数

[复制链接]
1800|35
 楼主| spark周 发表于 2021-3-2 23:12 | 显示全部楼层 |阅读模式

void Delay_us(unsigned long delay)
{
    T5CON=0;
    T4CON=0;   
    TMR5=0;
    TMR4=0;   
    if(delay>65536)
    {
        PR5 = (unsigned int)(delay>>16);
        PR4 = (unsigned int)delay;
    }
    else
    {
        PR4 = (unsigned int)delay;
    }   
    _T5IP=0x01;
    _T5IF=0;
    _T5IE=1;
    T4CON=0x8008;
    while(!_T5IF){;}
    _T5IF=0;
}
chenjunt 发表于 2021-3-2 23:14 | 显示全部楼层
感觉死在了循环里
 楼主| spark周 发表于 2021-3-2 23:16 | 显示全部楼层
已经跑通了,else里PR5没赋为0,还得禁止中断,为什么延时函数禁止中断后就能跑通了呢
 楼主| spark周 发表于 2021-3-2 23:19 | 显示全部楼层
void Delay_us(unsigned long delay)
{
    T5CON=0;
    T4CON=0;   
    TMR5=0;
    TMR4=0;   
    PR5 = (unsigned int)(delay>>16);
    PR4 = (unsigned int)delay;
    _T5IP=0x01;
    _T5IF=0;
    _T5IE=0;
    T4CON=0x8008;
    while(!_T5IF){;}
    _T5IF=0;
}
jiahy 发表于 2021-3-2 23:22 | 显示全部楼层
延时直接使用__delay_ms()和__delay_us()函数就行了呀。
liliang9554 发表于 2021-3-2 23:26 | 显示全部楼层
没必要用定时器。
zhanghqi 发表于 2021-3-2 23:28 | 显示全部楼层
XC16这两个函数在“libpic30.h”中。
 楼主| spark周 发表于 2021-3-2 23:35 | 显示全部楼层
libpic30.h里是外部调用的延时函数,那具体是从哪里调用的呢
zwll 发表于 2021-3-2 23:37 | 显示全部楼层
你可以看XC16的手册, 搜索这2个函数, 它会告诉你只要include一个头文件, 然后define一个宏,就可以直接调用那2个系统 的delay函数了.
llljh 发表于 2021-3-2 23:38 | 显示全部楼层
恭喜楼主解决问题
 楼主| spark周 发表于 2021-3-2 23:40 | 显示全部楼层

哦,那我就知道怎么回事了,多谢大家
gygp 发表于 2021-3-4 14:08 | 显示全部楼层
延时函数是一种粗略计算延时时间的函数  
chenci2013 发表于 2021-3-4 14:09 | 显示全部楼层
使用库函数实现毫秒延时函数   
wangdezhi 发表于 2021-3-4 14:10 | 显示全部楼层
在定时器中断里可以用延时函数  
biechedan 发表于 2021-3-4 14:14 | 显示全部楼层
用定时器中断代替Sleep()函数  
isseed 发表于 2021-3-4 14:14 | 显示全部楼层
学习了。   
xietingfeng 发表于 2021-3-4 14:15 | 显示全部楼层
单片机中用写delay函数做延时和用定时器做延时有什么区别?
suzhanhua 发表于 2021-3-4 14:16 | 显示全部楼层
利用定时器实现精准延时  
mituzu 发表于 2021-3-4 14:16 | 显示全部楼层
最经常使用的莫过于微秒级延时delay_us( )和毫秒级
hellosdc 发表于 2021-3-4 14:17 | 显示全部楼层
倒计数定时器,当计到0  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

821

主题

10121

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部