当前位置: 代码迷 >> python >> Python 中的算术移位
  详细解决方案

Python 中的算术移位

热度:72   发布时间:2023-07-16 10:56:48.0

我正在尝试编写一个程序,该程序将通过算术将位转换为某个变量。 该程序适用于 raspberry pi,将利用板载串行外设接口 SCLCK 功能来控制发送位的速度,还将控制位的读取。 换句话说,程序将在一个循环内,该循环将在每个时钟周期运行一次。

我们正在使用的模数转换器将根据以下内容以 MSB 样式发送位:8 位,中断位,8 位,中断位,8 位,总共发送 24 位数据。

然后程序将以相同的速度运行一个循环以在确切的时钟周期读取位,然后在时钟周期获取我们输入的 GPIO 引脚的值,无论是真还是假,这将继续每 27 (24, + 3 个中断) 时钟周期无限循环。 目标是为连接到模数转换器的麦克风的输出接收一个 24 位浮点数,该转换器将向输入发送一个可变电压,进而给出最终的 24 位浮点数。 由于树莓派只支持串行接口,我一次只能接收一位,并且需要能够将它们组合在一起以获得我需要的数字。

我在问是否有可用的方法,在 python 语言中,对变量进行算术移位,以便我可以发送从 GPIO 引脚接收到的位。 我知道这可以在汇编中完成,但我需要有关树莓派 GPIO 引脚地址的所有信息。 这还包括针对特定应用的广泛联网。

关于我如何做到这一点的任何想法?

if GPIO.input(25): #If it is true 
    #Arithmetic Logic Shift Left a one 
else: 
    #Arithmetic Logic Shift Left a zero –

问题不是 100% 清楚。 所以我只解释一般原则。

您正在寻找的是算术左移运算符<<

new_bit = 1 if GPIO.input(25) else 0  # ensure new_bit is 1 or 0
result = result << 1 + new_bit # shift result left and add new bit as LSB

在您处理 24 个时钟周期之前, result会被初始化为result = 0

假设 python 没有左移操作符。 算术左移等同于乘以 2。所以你也可以这样写:

new_bit = 1 if GPIO.input(25) else 0  # ensure new_bit is 1 or 0
result = result * 2 + new_bit # shift result left and add new bit as LSB

您不太清楚您希望如何从 GPIO 接收数据。 (如何检测 SCLK 的变化/如何“以相同的速度运行循环以在精确的时钟周期读取位”)

我假设您想通过一些 GPIO 访问一次读取一位,然后将这些位组合成一个整数。 但是您可能会解释如何知道何时从 GPIO 读取下一位。

def get_bit():
    # some magic code
    value =  GPIO.input(25)
    # let's assume value is 1 or 0:
    bit = 1 if value else 0
    return bit

def get_24_bit_value():
    result = 0
    for _i in range(3):
        for _j in range(8):
            wait_for_clock_tick()  # to be implemeted by you
            result = (result << 1) + get_bit()
        wait_for_break()  # to be implemeted by you
    return result