打印
[PIC®/AVR®/dsPIC®产品]

请教关于PIC16的延时问题

[复制链接]
1283|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Amber11|  楼主 | 2019-5-25 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
选用内部时钟16MHZ HF,用下面这种方法写是延时1MS,请问是为什么
void DelayMs(uint16_t ms)  //系统时钟频率为16MHZ
{
    unsigned short count= 500;
    for(uint8_t i = ms;i> 0 ;i--){
        while(count -- );
        count = 500;
    }   
}

使用特权

评论回复
沙发
zhuomuniao110| | 2019-5-26 22:29 | 只看该作者
PIC单片机的时钟经过内部分频,实际的工作频率为晶振频率的四分之一,

使用特权

评论回复
评论
Amber11 2019-6-14 15:22 回复TA
好的,谢谢 
板凳
zhuomuniao110| | 2019-5-26 22:29 | 只看该作者
PIC单片机定时器初值计算方法

PIC的指令周期是4个震荡周期,在没有使用分频器的情况下,TMR0 会在每个指令周期信号(等于晶体振荡器产生的主时钟周期的 4 倍)到来时自动加 1。在配置了分频器的情况下,TMR0 会在每次收到由分频器将指令周期信号分频一个固定倍数后产生的信号时自动加 1。如果 TMR0在累加计数的过程中,CPU 执行一条往 TMR0 中写入数据的指令,则累加计数器的加 1 操作将被推迟两个指令周期,重新开始计数。这两个指令周期的偏差在用户编写时间精度要求较高的程序时应引起注意,可以通过在每次写入 TMR0 时给一个调整值的方法来解决。

假设的是时钟频率为 4MHz。因此,一个指令周期就是一个微秒(μs)的时间。

,也就是计数一次时间是1us。

没有分频比定时器的初值计算公式:T0=256-Tc+2

   其中TC是想得到的次数。加2的原因是写值的时候要消耗两个指令周期。

如果分频器给了定时器,最好不要再读写TMR0了,不然会照成误差。

假设分频器是16,晶振是4Mhz,一次由00到FF的时间是16*256=4096us。假设50ms的时间

在中断每次加上4096,

主程序检查是不是超过5000,超过了就减掉5000,这样算是50ms就得到了。

使用特权

评论回复
评论
Amber11 2019-6-14 15:22 回复TA
感谢 
地板
zhuomuniao110| | 2019-5-26 22:30 | 只看该作者
另外你是不是8分频了。

使用特权

评论回复
5
dongnanxibei| | 2019-5-27 00:19 | 只看该作者
不清楚啊,以实际为准,毕竟除了你设置的这个,函数跳转也消耗周期。

使用特权

评论回复
6
CoolSilicon| | 2019-5-27 14:57 | 只看该作者
你这种手工做的延迟函数, 最大的问题是不准, 其次是延迟到底多长时间, 你也控制不了.
即使能够控制大概时间, 换个编译器模式, 又不准了.

如果是原地延时的话, 建议你试用库函数__delay_ms(), __delay_us()这样的, 详情可以参考XC8编译器手册,需要定义一个系统频率的宏, 用MCC的话, 它会自动帮你定义, 你直接调用上面的2个 __delay函数就可以了, 可以说是非常准.

另外,你如果不用原地延时,建议用timer中断来做, 这个就简单多了, 不再赘述.

使用特权

评论回复
评论
Amber11 2019-6-14 15:23 回复TA
只是大概延时,不需要用定时器 
7
yiy| | 2019-5-29 11:31 | 只看该作者
这种你就不要纠结准不准了。

使用特权

评论回复
8
yiy| | 2019-5-29 11:31 | 只看该作者
我看其他单片机的库都提供延时函数,用的定时器。

使用特权

评论回复
评论
Amber11 2019-6-14 15:21 回复TA
只是大概延时 
9
manufact| | 2019-5-29 21:07 | 只看该作者
这种只适合大致延时,准确延时还是要定时器

使用特权

评论回复
评论
Amber11 2019-6-14 15:21 回复TA
嗯嗯,好的 
10
奔波儿熊| | 2019-6-14 16:23 | 只看该作者
首先这种是软件定时器,是不精确的. 其次我来分析一下这种写法:
假设输入参数是1,即延时1ms, 那么"count --"这条语句会执行1*500 = 500次, 就是说执行"count --"500次需要1ms, 那么执行"count --"1次就需要1/500ms. 执行"count --"1次需要1个指令周期,即 1个指令周期= 1/500ms, 那么指令频率就是500kHz, 系统时钟频率是指令频率的4倍,即500kHz*4 = 2MHz. 猜测楼主的系统时钟16MHz 8分频.

使用特权

评论回复
11
小灵通2018| | 2019-6-16 16:50 | 只看该作者
软件延时不要考虑精确,一般用在时序模拟上,只要在时序的要求范围内就可以

使用特权

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

本版积分规则

3

主题

18

帖子

0

粉丝