Язык C преобразует целочисленные значения в 0x.. шестнадцатеричные байтовые значения и сохраняет их в массив nx2

#arrays #c #char #integer

Вопрос:

Я пытаюсь использовать протокол SPI для создания набора треугольных/пилообразных волн. Основная цель состоит в том, чтобы оптимизировать скорость процесса создания дискретных выборочных значений для отправки в ЦАП. Я понимаю, как отправлять значения в DAC. Что я хотел бы сделать, так это предварительно вычислить значения и сохранить их в массиве. Таким образом, мне не нужно обрабатывать каждое значение в реальном времени. Моя идея заключается в том, чтобы просто создать массив больше, чем мне потребуется, и постоянно стирать и перезаписывать его, если требуется новая частота/форма волны.

Часть алгоритма довольно проста, и мне не нужно вдаваться во все это. Но SPI ожидает набор двухбайтовых значений в шестнадцатеричной (без знака) форме 0x.. Я хотел бы создать цикл for, который генерирует эти значения в десятичной системе счисления и преобразует их в значения без знака и сохраняет их в массиве по мере выполнения цикла for. Шестнадцатеричные значения должны быть разделены на два байта (верхний байт 0x9. и нижний байт 0x..). В основном эти байты сдвигаются по битам в 16-разрядный регистр , начиная с MSB. цифра 9 в 0x9. является управляющим сигналом. уровень напряжения представлен следующими 10 битами, а последние два бита в 16-битном регистре-это не важно. Как только массив будет добавлен, я смогу использовать значения, сгенерированные в качестве карты уровня напряжения, которая будет повторяться до тех пор, пока пользователь не введет новое значение. Таким образом, ничего не нужно вычислять, пока ЦАП выводит значения.

Как уже говорилось ранее, я могу заставить алгоритм делать все это. Где я зависаю, это преобразование int в символ без знака нужного размера и хранение его в массиве внутри цикла for.

Комментарии:

1. Это странный SPI, если он использует ASCII, а не только двоичные данные. Что это за система?

2. Если вы говорите о шестнадцатеричных значениях, вы имеете в виду представление в исходном коде? Потому что это просто текстовое представление. Целочисленная переменная сохраняет свое значение в двоичном формате, и все, что вы видите как человек, — это своего рода текстовая интерпретация. — Вам не нужно менять базовую систему. Вычислите свой номер, проделайте некоторую битовую магию (для управляющего сигнала, 10-битного расширения и конечных битов) и сохраните полученное 16-битное число. Это оно.

3. Если вы генерируете значения на лету, вы должны заботиться только о фактических числовых значениях байтов, а не о текстовом представлении числовых значений. Если val содержит 10 — битное значение, которое должно быть преобразовано в пару байтов, похоже, вам нужно, чтобы значение первого (m.s.) байта было установлено в соответствии с выражением (0x90 | (val gt;gt; 6) amp; 0x0F) , а значение второго (l.s.) байта было установлено в соответствии с выражением ((val lt;lt; 2) amp; 0xFF) .

4. Технически это так, но на самом деле два байта сдвигаются как часть одного 16-битного слова. Если есть более простой способ отделить первые 8 бит от вторых 8 бит без преобразования в шестнадцатеричный, это также сработало бы. Я почти уверен, что компилятор преобразует все в десятичные значения. Hex-это просто удобный способ отправки байтов в различные регистры микроконтроллера. Это для доски Dragon12.