[技术问答]

新唐单片机DELay函数BUG求助

[复制链接]
1934|16
手机看帖
扫描二维码
随时随地手机跟帖
18576478035|  楼主 | 2018-6-28 10:42 | 显示全部楼层 |阅读模式
void Timer1_Delay1ms(volatile UINT32 u32CNT)
{
          u32 i ;
          clr_TR1;                                //Stop the Timer1
    clr_T1M;                                //T1M=0, Timer1 Clock = Fsys/12
                clr_TF1;       
   
    TMOD |= 0x10;
                //        i =  u32CNT ;

        //Timer1 is 16-bit mode
   // set_TR1;                                //Trigger Timer1
         //for(i=0;i<u32CNT;i++)
         for(i=u32CNT;i>0;i--)
   // while(i > 0)
    {
                          clr_TR1;                                //Stop the Timer1

        TL1 = LOBYTE(TIMER1_DIV12_VALUE_1ms);
        TH1 = HIBYTE(TIMER1_DIV12_VALUE_1ms);
                          set_TR1;                                //Trigger Timer1

        while (TF1 != 1);                   //Check Timer1 Time-Out Flag
        clr_TF1;
                        //        i --;
    }
    clr_TR1;                                //Stop the Timer1
}

for循环使用i--和i++的区别在哪里?i--减到0之后不会停止这个数变为0xffff继续减是怎么回事?
huangcunxiake| | 2018-6-28 11:06 | 显示全部楼层
你用-的时候你变量还是无符号的,肯定错了。因为你判断是否小于0,而无符号数里面是没有比0小的数据的。

使用特权

评论回复
huangcunxiake| | 2018-6-28 11:07 | 显示全部楼层
因此如果你的循环编号是定义为无符号变量就要使用++增长方式,这样你最终判断的是跟一个非0的数据比较。

使用特权

评论回复
xiaoqizi| | 2018-6-28 11:29 | 显示全部楼层
++和--美啥本质区别 只是楼主定义变量的时候要定义为有符号的

使用特权

评论回复
18576478035|  楼主 | 2018-6-28 11:31 | 显示全部楼层
huangcunxiake 发表于 2018-6-28 11:07
因此如果你的循环编号是定义为无符号变量就要使用++增长方式,这样你最终判断的是跟一个非0的数据比较。 ...

unsigned int 是从0开始的吧,我的判断条件是i>0;i会出现减到0的情况,这样就退出for循环了啊

使用特权

评论回复
huangcunxiake| | 2018-6-28 11:34 | 显示全部楼层
18576478035 发表于 2018-6-28 11:31
unsigned int 是从0开始的吧,我的判断条件是i>0;i会出现减到0的情况,这样就退出for循环了啊 ...

你不信你可以把i>0换成i>=1试试看。这样就跟你的i>0想要表达的意思一样了。一般遇到跟0比较必须的用带符号的数据。

使用特权

评论回复
huangcunxiake| | 2018-6-28 11:47 | 显示全部楼层
你可以把那些不相干的函数都删了,volatile这个关键词也删掉试试看。试了一下我是用uchar类型做的测试,没有问题,你这写的有点乱,不知道是不是哪儿不对。先删除这个volatile试试。

使用特权

评论回复
huangcunxiake| | 2018-6-28 11:51 | 显示全部楼层
你debug逐步执行,这个数字定义小点,比如2或者3,然后看看最后是怎么执行导致的失控。

使用特权

评论回复
yiyigirl2014| | 2018-6-28 14:56 | 显示全部楼层
楼主可以单独测试这个,不要套一堆其他的。

使用特权

评论回复
HKingS| | 2018-6-28 15:36 | 显示全部楼层
用i--的时候一定要注意到0的问题,减到0的时候就溢出了。

使用特权

评论回复
643757107| | 2018-6-28 15:43 | 显示全部楼层
一般要避免无符号的--应用,不知道编译器哪儿就优化错了。

使用特权

评论回复
zhuotuzi| | 2018-6-28 18:41 | 显示全部楼层
代码乱乱了,这种容易出错的。类型不要随便用,不用有安全隐患的。

使用特权

评论回复
hengshu| | 2018-6-28 23:01 | 显示全部楼层
代码太乱,参考官方例程

void Timer0_Delay1ms(UINT32 u32CNT)
{
    clr_T0M;                                                //T0M=0, Timer0 Clock = Fsys/12
    TMOD |= 0x01;                                           //Timer0 is 16-bit mode
    set_TR0;                                                //Start Timer0
    while (u32CNT != 0)
    {
        TL0 = LOBYTE(TIMER_DIV12_VALUE_1ms);                 //Find  define in "Function_define.h" "TIMER VALUE"
        TH0 = HIBYTE(TIMER_DIV12_VALUE_1ms);
        while (TF0 != 1);                                   //Check Timer0 Time-Out Flag
        clr_TF0;
        u32CNT --;
    }
    clr_TR0;                                                //Stop Timer0
}

使用特权

评论回复
18576478035|  楼主 | 2018-6-29 17:52 | 显示全部楼层
反复进出中断会导致这个是变为0xffff然后从这个数又开始往下递减,感觉是编译器进入中断时没有保存现场和回复现场,将优先级从8调到0就没有这个问题了

使用特权

评论回复
18576478035|  楼主 | 2018-6-29 17:53 | 显示全部楼层
看汇编代码编译器是没有将寄存器的值给保存起来的

使用特权

评论回复
caijie001| | 2018-6-29 23:07 | 显示全部楼层
楼主的代码不敢恭维啊。。。。

使用特权

评论回复
caijie001| | 2018-6-29 23:08 | 显示全部楼层
可能我有点强迫症。。。。代码必须对齐

使用特权

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

本版积分规则

55

主题

187

帖子

2

粉丝