c - 用C语言编程微芯片时,如何计算1秒延迟所需的值

标签 c frequency microchip

如果在初始 Pragma 配置后指定为 187.5hz,则大约为 1190,以便有 1 秒的延迟。我对这个数字是如何计算的感到困惑。请帮忙!

这是初始编译指示配置

#pragma config   JTAGEN    = OFF    // JTAG Enable OFF (only use for '250)
#pragma config   FNOSC     = FRCPLL // Fast RC w PLL 8mHz internal rc Osc
#pragma config   FPLLIDIV  = DIV_10  // PLL in 8mHz/10 = 800 kHz
#pragma config   FPLLMUL   = MUL_15 // PLL mul 800 khz * 15 = 12 Mhz
#pragma config   FPLLODIV  = DIV_64  // PLL Out: 12MHz / 64 187.5 kHz
#pragma config   FPBDIV    = DIV_1  // Peripheral Bus Divisor
#pragma config   FCKSM     = CSECME // Clock Switch Enable, FSCM Enabled
#pragma config   POSCMOD   = OFF    // Primary osc disabled
#pragma config   IESO      = OFF    // Internal/external switch over
#pragma config   OSCIOFNC  = OFF    // CLKO Output Signal Active on the OSCO Pin
#pragma config   FWDTEN    = OFF    // Watchdog Timer Enable:

这是 1190 的由来

// Delay routine
// With an 8MHz internal RC clock and settings to give a system clock
// of 187.5 kHz, the delay() function must be given about 1190 to get 1 sec
// delay:
// stopwatch: 100 complete ON/OFF pulses in 119 seconds.
// 500/((100/119)/2) = 1190
void delay(int d)
{
int i;  // Declare variable to be used in the loop

while(d)    // While d > 0
{
    i = 100;    // set i to 100 for inner loop
    while(i)    // while i > 0
    {
        i--;    // decrement i (e.g. i will equal 99, 98, 97,...)
    }

    d--;    // decrement d
}
}

即使看了评论,我仍然不知道这个数字是如何计算的......

最佳答案

OP中代码中的注释似乎与实际代码无关。代码中未使用 1190。

假设delay()的参数是毫秒,我认为正确的计算结果是187.5(周期/毫秒)/N(周期/内循环)= 187.5/N内循环/毫秒。如果 N 为 3(周期/内循环),则为 62.5 内循环/毫秒。或 62,500 次内循环/秒。要达到 1190 次内循环/秒,则 N 需要约为 158。对于代码中的常量 100,则 N 将为 1.875。

该指令集包括 DECFSZ 指令,该指令递减寄存器,然后跳过该指令(通过执行 NOP 代替)。如果内部循环展开得相当多,那么每个内部循环的平均指令将接近 2。但即使在这种情况下,我认为您想要使用值 187.5/2 = 94。也许有一些处理器优化可以减少周期数减少 6%。或者也许将delay()校准为200KHz系统时钟。

对延迟例程进行基准测试以了解其准确性会很有趣。

关于c - 用C语言编程微芯片时,如何计算1秒延迟所需的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35114662/

相关文章:

控制台不输出unicode字符

OpenCV使用傅里叶变换得到频谱图

iphone - 音频频率和幅度

arduino - Arduino 可以在微秒内采样 1-4 kHz 的音频吗?

c - 如何正确配置PIC18端口D的输出方向?

c - Microchip 射频调制器问题

c - Microchip PIC 周期寄存器 PR2

c++ - 对编译器功能的误解

c - C 程序在查找整数三元组 (x,y,z) 时出错,使得 n^x + n^y = n^z 对于给定的 n 范围

c - PortAudio - 在单声道中工作,在立体声中出现故障?