如果在初始 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/