gpt4 book ai didi

c - 函数将 "wrong"值写入寄存器 - PIC18F

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:31 24 4
gpt4 key购买 nike

我编写了一个函数,您应该可以在其中输入一个数字,然后该函数会计算要写入寄存器的值。然而,它看起来像是在向寄存器写入“错误”值。我使用计算器和 wolframalpha 来确认我没有搞砸操作顺序。函数如下:

void SetFrequency_Hz(int Freq) {
PR4 = ((41667000 / (4 * 16 * Freq)) - 1);
}

当我尝试将频率设置为 20kHz(20,000Hz)时,我需要将 PR4 寄存器设置为 32。理论上,如果我将 20000 的值放入函数中,应该会被吐出,但它正在吐出179 出于某种原因。任何猜测为什么?

单片机:PIC18F67J60集成开发环境:MP LAB X

最佳答案

因为在 PIC18 中,int 类型只能是 16 bits , 有点神秘 implicit conversion rules在 C 中将导致表达式中的中间结果被截断。我很惊讶您的编译器没有对文字 41667000 发出警告,因为在任何情况下这显然都不适合 PIC18 int 类型。

通过使用显式文字类型后缀来改变表达式的整体类型,这个问题可以很容易地解决:

PR4 = 41667000ul / (64ul * Freq) - 1u ;

或者如果所需的频率分辨率以 KHz 为单位,您可以缩放表达式:

PR4 = 41667u / (64u * (Freq/1000)) - 1u ;

但应注意,在这两种情况下,实际 值 41667000/(64 x 20x103)) - 1 约为 31.55,因此 PR4 中的值将是 31 而不是 32,并且会产生 20345Hz 的实际频率。

舍入到真实表达式的最近整数值:

PR4 = (41667000ul / (32ul * Freq) - 1u) / 2 ;

这将导致 PR4=32 和 19729Hz 的频率。

让函数返回实际达到的频率可能会有用:

unsigned SetFrequency_Hz( unsigned ideal_freq ) 
{
PR4 = (41667000ul / (32ul * ideal_freq ) - 1u) / 2u ;

// Return actual achievable frequency
return 41667000ul / ((PR4 + 1ul) * 64ul)
}

关于c - 函数将 "wrong"值写入寄存器 - PIC18F,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com