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

[复制链接]
 楼主| 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++){;} 的占用时间。
zwll 发表于 2020-8-27 19:36 | 显示全部楼层
调整这个延时时间,可以得到你想要的GP5的输出频率。
xxrs 发表于 2020-8-27 19:40 | 显示全部楼层
用IED自带的 stopwatch 功能做这个很方便的,先在 simulator 里把时钟配置好。
ousj 发表于 2020-8-27 19:46 | 显示全部楼层
完全正常,并且符合仿真结果啊,你不会以为一个for循环就占一个指令周期吧?
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
wangzsa 发表于 2020-8-27 19:53 | 显示全部楼层
上面是for语句在xc8 v2.05 -o0优化的编译结果,一个GP5周期约Target halted. Stopwatch cycle count = 3808 (3.808 ms)
renyaq 发表于 2020-8-27 19:56 | 显示全部楼层
看着是没有设定主时钟,另外要精确定时,还是得诶用定时器中断比较可靠准确。
ousj 发表于 2020-8-27 20:02 | 显示全部楼层
不太适合用C语言编译
xxmmi 发表于 2020-8-27 20:06 | 显示全部楼层
手册上说 P4/CLKOUT 的频率是Fosc的 1/4。
 楼主| liuzaiy 发表于 2020-8-27 20:11 | 显示全部楼层
以988kHz应该是对的,这样的话,就是说for这块有问题了呗! 一个空语句加上for判断
zhuww 发表于 2020-8-27 20:16 | 显示全部楼层
大概20us?那是不是也太长了些!
zhuhuis 发表于 2020-8-27 20:22 | 显示全部楼层
675太老了,现在大部分器件可以支持32Mhz Fosc
jlyuan 发表于 2020-8-27 20:25 | 显示全部楼层
写这种for循环不就是空耗时间吗,编译器体贴
yufe 发表于 2020-8-27 20:29 | 显示全部楼层
for循环体本身就要消耗好多个机器时钟
jlyuan 发表于 2020-8-27 20:33 | 显示全部楼层
你如果想精确计时的话, 用timer呗.
ousj 发表于 2020-8-27 20:36 | 显示全部楼层
再不济用库函数__delay_us(), __delay_ms();
zyf部长 发表于 2020-8-27 20:51 | 显示全部楼层
最后才是用for自己写, 并且这个时间不好控制的, 完全取决于编译器生成的代码量和你设置的循环次数...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

735

主题

7546

帖子

2

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