[8/16位单片机] [求助]PIC12F675 指令周期20us 不知道为何?

[复制链接]
460|11
 楼主 | 2019-4-21 20:45 | 显示全部楼层 |阅读模式
#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.
不知道哪个寄存器还会影响指令周期?
多谢!

使用特权

评论回复
| 2019-4-22 09:15 | 显示全部楼层
帮你顶一下吧!!!

使用特权

评论回复
| 2019-4-22 09:48 | 显示全部楼层
不太清楚你想干什么。只是GP5输出一个方波?

首先确定你选的系统时钟,这个可以确定指令周期(时间);
再计算你的延时,就是 for(i=0;i<100;i++){;} 的占用时间。 调整这个延时时间,可以得到你想要的GP5的输出频率。
用IED自带的 stopwatch 功能做这个很方便的,先在 simulator 里把时钟配置好。

使用特权

评论回复
| 2019-4-22 10:33 | 显示全部楼层
本帖最后由 bellstudio 于 2019-4-22 10:56 编辑

完全正常,并且符合仿真结果啊,你不会以为一个for循环就占一个指令周期吧?

  1. 0x3D2: CLRF 0x120
  2. 0x3D3: CLRF 0x121
  3. !        {;}
  4. 0x3D4: MOVLW 0x1
  5. 0x3D5: BCF STATUS, 0x5
  6. 0x3D6: ADDWF i, F
  7. 0x3D7: BTFSC STATUS, 0x0
  8. 0x3D8: INCF 0x21, F
  9. 0x3D9: MOVLW 0x0
  10. 0x3DA: ADDWF 0x21, F
  11. 0x3DB: MOVF 0x21, W
  12. 0x3DC: XORLW 0x80
  13. 0x3DD: MOVWF 0x15F
  14. 0x3DE: MOVLW 0x80
  15. 0x3DF: SUBWF 0x5F, W
  16. 0x3E0: BTFSS STATUS, 0x2
  17. 0x3E1: GOTO 0x3E4
  18. 0x3E2: MOVLW 0x64
  19. 0x3E3: SUBWF i, W
  20. 0x3E4: BTFSS STATUS, 0x0
  21. 0x3E5: GOTO 0x3D4
复制代码

上面是for语句在xc8 v2.05 -o0优化的编译结果,一个GP5周期约Target halted. Stopwatch cycle count = 3808 (3.808 ms)

使用特权

评论回复
| 2019-4-22 10:34 | 显示全部楼层
看着是没有设定主时钟,另外要精确定时,还是得诶用定时器中断比较可靠准确。

使用特权

评论回复
 楼主 | 2019-4-22 16:31 | 显示全部楼层
本帖最后由 esidarap 于 2019-4-22 16:34 编辑

哦? 那么说 pic12f7675这种芯片,就不太适合用C语言编译了。手册上说 P4/CLKOUT 的频率是Fosc的 1/4。所以988kHz应该是对的,这样的话,就是说for这块有问题了呗! 一个空语句加上for判断
大概20us?那是不是也太长了些!

使用特权

评论回复
| 2019-4-23 00:25 | 显示全部楼层
675太老了,现在大部分器件可以支持32Mhz Fosc

使用特权

评论回复
| 2019-4-23 19:49 | 显示全部楼层
esidarap 发表于 2019-4-22 16:31
哦? 那么说 pic12f7675这种芯片,就不太适合用C语言编译了。手册上说 P4/CLKOUT 的频率是Fosc ...

写这种for循环不就是空耗时间吗,编译器体贴

使用特权

评论回复
| 2019-4-23 22:08 | 显示全部楼层
楼主OUT了。

使用特权

评论回复
| 2019-4-23 22:09 | 显示全部楼层
for循环体本身就要消耗好多个机器时钟

使用特权

评论回复
| 2019-4-24 10:09 | 显示全部楼层
你如果想精确计时的话, 用timer呗.
再不济用库函数__delay_us(), __delay_ms();
最后才是用for自己写, 并且这个时间不好控制的, 完全取决于编译器生成的代码量和你设置的循环次数...

使用特权

评论回复
| 2019-4-24 12:46 | 显示全部楼层
需要使用nop,进行精确延时,这种for本身就很多指令周期。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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