Арифметика c Сдвиг Python - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь написать программу, которая будет арифметически сдвигать биты в определенную переменную. Программа предназначена для Raspberry Pi и будет использовать функциональность SCLCK встроенных последовательных периферийных интерфейсов для управления скоростью отправляемых битов, а также будет контролировать чтение битов. Другими словами, программа будет внутри al oop, которая будет запускаться один раз для каждого тактового цикла.

Используемый нами аналого-цифровой преобразователь будет отправлять биты в стиле MSB в соответствии со следующим: 8 битов, бит разрыва, 8 битов, бит разрыва, 8 битов, всего 24 бита данные отправляются.

Затем программа будет работать с oop с той же скоростью, чтобы считывать бит с точным тактовым циклом, и затем будет принимать значение вывода GPIO, которое мы вводим, истинное или ложное, на тактовый цикл, и это будет продолжаться в бесконечном l oop каждые 27 (24, + 3 перерывов) тактовых циклов. Цель состоит в том, чтобы получить 24-разрядное значение с плавающей запятой для выхода микрофона, подключенного к аналого-цифровому преобразователю, который будет подавать переменное напряжение на вход, что, в свою очередь, даст результирующее 24-разрядное значение с плавающей запятой. Поскольку Raspberry Pi будет поддерживать только последовательный интерфейс, я могу получать только один бит за раз, и мне нужно будет собрать их вместе, чтобы получить номер, который мне нужен.

Я спрашиваю, является ли или не существует метода, доступного на языке python, для выполнения арифметического c перехода к переменной, чтобы я мог отправлять биты, полученные с вывода GPIO. Я знаю, что это можно сделать при сборке, но мне понадобится вся информация об адресах контактов GPIO для Raspberry Pi. Это также включает в себя обширную сеть для конкретного приложения c.

Любые идеи о том, как я могу выполнить sh это?

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

1 Ответ

0 голосов
/ 22 марта 2020

Вопрос не ясен на 100%. Поэтому я просто объясняю общий принцип.

То, что вы ищете, это арифметический c оператор левого сдвига <<

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

result был бы инициализирован с result = 0 перед обработкой 24 тактов.

Давайте предположим, что python не будет иметь операции левого сдвига. Арифметическое c левое смещение идентично умножению на 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 / как вы " работаете все oop с той же скоростью, чтобы прочитать бит с точным тактом ")

Я полагаю, вы хотите читать один бит за раз через некоторый доступ 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

...