打印

picc软件延时讨论

[复制链接]
4006|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tkalxy|  楼主 | 2007-11-1 18:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习picc这么长时间了,但是一直对于软件延时很不理解。发现通过c语言设计的延时函数,经过编译后的汇编代码都不一样,很不明白!例如

参考本网站的picc设计技巧的**cypok的言论搜集,发现许多好像不正确。例如文中说

x=100;while(--x){;} 
汇编后: 
    movlw 100 
    bcf 3,5 
    bcf 3,6 
    movwf        _delay 
    l2    decfsz         _delay 
    goto l2 
    return 

但是我做了不是这样的,还有

最能精确控制指令时间的: 
void delay(char x,char y){ 
                  char z; 
             do{ 
                           z=y; 
                          do{;}while(--z); 
                   }while(--x); 

其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call指令、页面设定、传递参数
花掉的7个指令。则是:14+(3*(Y-1)+7)*(X-1)。

我不知道有没有人用,经过实验了没有?对于高手怎么设计延时函数,难道只看stopwatch?对于简单的延时难道非要用硬件延时?请高手出来说句话阿!
沙发
machunshui| | 2007-11-1 19:17 | 只看该作者

我觉得定位到10us精度就够了.

我觉得定位到10us精度就够了,没有什么应用的延时需要精确到1us,特别是几十,几百毫秒以上的延时,
如果几us的精确短延时,几条NOP指令就行了.

自己做一个循环函数,编译一下,看看汇编指令,算算有几微妙,然后用NOP指令凑足10us一个循环,用参数控制循环的次数不就行了吗?

延时1ms以上,就该考虑定时器中断形式来干了,否则太消耗cpu了.

使用特权

评论回复
板凳
xieyuanbin| | 2007-11-1 19:58 | 只看该作者

考虑采用优化编译试试

使用特权

评论回复
地板
tkalxy|  楼主 | 2007-11-2 11:04 | 只看该作者

延时函数你们用什么呢?

大家软件延时用什么函数呢?

使用特权

评论回复
5
l0p0c| | 2007-11-7 15:39 | 只看该作者

一直用汇编,还没有整C呢!

使用特权

评论回复
6
ayb_ice| | 2007-11-8 08:28 | 只看该作者

看反汇编吧

使用特权

评论回复
7
mumuyou| | 2007-11-9 14:07 | 只看该作者

如果不能用时钟,建议嵌入汇编

用时钟的话最多差几个指令周期,无论程序优化到什么程度。

如果时钟不够用必须用软件延时的话,建议嵌入汇编。以下是1200bps通信时一位延时时间,这里可能不到2304cycles,因为外部还有处理占用时间。
//******** delay 1bit *********/
//    11.59200MHz
//    1200bit    = (1/1200)/(4/1105920) = 2304cycles
//*************************************
void Delay1200bit(void)
{
    unsigned char loop;
    #asm
    clrwdt
    movlw        0xE4
    movwf        ?a_Delay1200bit
Delay820usLoop:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    decfsz        ?a_Delay1200bit
    goto        Delay820usLoop
    nop
    #endasm
}

这样的好处是不管你对程序做什么样的优化,这里的延时时间基本不变,因为PICC对汇编是不优化的。

你也可以写一个纯粹的汇编延时函数,嵌到函数库里面。

使用特权

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

本版积分规则

36

主题

117

帖子

1

粉丝