打印

不知道哪个寄存器还会影响指令周期?

[复制链接]
897|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuzaiy|  楼主 | 2020-8-27 19:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#pragma config FOSC = INTRCCLK  
#pragma config WDTE = OFF        
#pragma config PWRTE = OFF      
#pragma config MCLRE = ON      
#pragma config BOREN = ON      
#pragma config CP = OFF         
#pragma config CPD = OFF        

#include <xc.h>
int i = 0;

void main(void) {                                                                  //Load Factory Calibration Value Into OSCCAL
    asm("BSF STATUS, 5");
    asm("CALL 3ffh");
    asm("MOVWF OSCCAL");
    asm("BCF STATUS, 5");
   
    WPU = 0x00;
    TRISIO = 0x00;

    GPIObits.GPIO5 = 0;
    while(1) {
        for(i=0;i<100;i++)
        {;}
        GPIObits.GPIO5 = 1;
        for(i=0;i<100;i++)
        {;}
        GPIObits.GPIO5 = 0;
    }
    return;
}
代码如上: GP4/CLKOUT 频率988kHz方波, GP5 频率只有259Hz.
不知道哪个寄存器还会影响指令周期?

使用特权

评论回复
沙发
morrisk| | 2020-8-27 19:18 | 只看该作者
不太清楚你想干什么。只是GP5输出一个方波?

使用特权

评论回复
板凳
llia| | 2020-8-27 19:30 | 只看该作者
首先确定你选的系统时钟,这个可以确定指令周期(时间);

使用特权

评论回复
地板
gongche| | 2020-8-27 19:33 | 只看该作者
再计算你的延时,就是 for(i=0;i<100;i++){;} 的占用时间。

使用特权

评论回复
5
zwll| | 2020-8-27 19:36 | 只看该作者
调整这个延时时间,可以得到你想要的GP5的输出频率。

使用特权

评论回复
6
xxrs| | 2020-8-27 19:40 | 只看该作者
用IED自带的 stopwatch 功能做这个很方便的,先在 simulator 里把时钟配置好。

使用特权

评论回复
7
ousj| | 2020-8-27 19:46 | 只看该作者
完全正常,并且符合仿真结果啊,你不会以为一个for循环就占一个指令周期吧?

使用特权

评论回复
8
wangzsa| | 2020-8-27 19:50 | 只看该作者

0x3D2: CLRF 0x120
0x3D3: CLRF 0x121
!        {;}
0x3D4: MOVLW 0x1
0x3D5: BCF STATUS, 0x5
0x3D6: ADDWF i, F
0x3D7: BTFSC STATUS, 0x0
0x3D8: INCF 0x21, F
0x3D9: MOVLW 0x0
0x3DA: ADDWF 0x21, F
0x3DB: MOVF 0x21, W
0x3DC: XORLW 0x80
0x3DD: MOVWF 0x15F
0x3DE: MOVLW 0x80
0x3DF: SUBWF 0x5F, W
0x3E0: BTFSS STATUS, 0x2
0x3E1: GOTO 0x3E4
0x3E2: MOVLW 0x64
0x3E3: SUBWF i, W
0x3E4: BTFSS STATUS, 0x0
0x3E5: GOTO 0x3D4

使用特权

评论回复
9
wangzsa| | 2020-8-27 19:53 | 只看该作者
上面是for语句在xc8 v2.05 -o0优化的编译结果,一个GP5周期约Target halted. Stopwatch cycle count = 3808 (3.808 ms)

使用特权

评论回复
10
renyaq| | 2020-8-27 19:56 | 只看该作者
看着是没有设定主时钟,另外要精确定时,还是得诶用定时器中断比较可靠准确。

使用特权

评论回复
11
ousj| | 2020-8-27 20:02 | 只看该作者
不太适合用C语言编译

使用特权

评论回复
12
xxmmi| | 2020-8-27 20:06 | 只看该作者
手册上说 P4/CLKOUT 的频率是Fosc的 1/4。

使用特权

评论回复
13
liuzaiy|  楼主 | 2020-8-27 20:11 | 只看该作者
以988kHz应该是对的,这样的话,就是说for这块有问题了呗! 一个空语句加上for判断

使用特权

评论回复
14
zhuww| | 2020-8-27 20:16 | 只看该作者
大概20us?那是不是也太长了些!

使用特权

评论回复
15
zhuhuis| | 2020-8-27 20:22 | 只看该作者
675太老了,现在大部分器件可以支持32Mhz Fosc

使用特权

评论回复
16
jlyuan| | 2020-8-27 20:25 | 只看该作者
写这种for循环不就是空耗时间吗,编译器体贴

使用特权

评论回复
17
yufe| | 2020-8-27 20:29 | 只看该作者
for循环体本身就要消耗好多个机器时钟

使用特权

评论回复
18
jlyuan| | 2020-8-27 20:33 | 只看该作者
你如果想精确计时的话, 用timer呗.

使用特权

评论回复
19
ousj| | 2020-8-27 20:36 | 只看该作者
再不济用库函数__delay_us(), __delay_ms();

使用特权

评论回复
20
zyf部长| | 2020-8-27 20:51 | 只看该作者
最后才是用for自己写, 并且这个时间不好控制的, 完全取决于编译器生成的代码量和你设置的循环次数...

使用特权

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

本版积分规则

735

主题

7546

帖子

2

粉丝