Dword, 16*16=32

Tiny88.
Нужно отмасштабировать сигнал с АЦП с коэффициентом 0..1.
Коэффициент 16-битный, точности достаточно.
Ну и разобраться, как оно вообще работает.
Думаю, должно быть быстрее и короче, чем через float.

Имею примерно следующее.

uint16_t result,k;
uint32_t x;

x=analogRead(an0)*k;
x=x>>16;
result=x;

Напрямую в результате вижу ноль.
На выходе нужно иметь результат не шире 16 бит. Последнее присвоение какую часть результата присвоит? Младшую, старшую половину? Что-то ещё? )))
И вообще, такой вариант должен работать в ардуине тупо в лоб, или нужно искать какие-то доп. библиотеки?

Сюда же. Сдвиг как унарная операция работает? Просто x>>16; без присвоения?

а 2*2=5

1 лайк

А нельзя ли повнтянее описать задачу и привести короткий, но полный (от слова ПОЛНЫЙ) код, демонстрирующий проблему? И, кстати, не

а точно и конкретно? Или Вы и ответов хотите “примерных”?

А чего Вы ожидали, если используете переменную k которой ничего не присвоено?
Или это у Вас бред сивой кобылы примерный код?

А сами-то как думаете? Если никак не думаете, то хотя бы проверьте:

void setup(void) {
	Serial.begin(9600);
	uint32_t c12 = 0x00010002;
	uint16_t c16 = c12;
	Serial.println(c16);
}

void loop(void) {}

Запустить, посмотреть и всего делов.

Такой не должен. Хотя, я понимаю, что мы обсуждаем бред сивой кобылы примерный код, а потому, на самом деле, ХЗ какой именно “такой”.

Смотря что Вы понимаете под слово “работает”. Если “изменяет значение x”, то, нет, конечно. Опять же это легко проверить самому. Привыкайте так и делать.

стоило ли стока писать, ведь понятно, по стилю изложения ТС, чем закончится)

1 лайк

Праздник всё же. Святой день.

1 лайк

Описал суть проблемы. Если есть переменная, ей обязательно что-то присвоено.
Именно результат умножения не получается правильным, или дальше неправильно применяю. С чем и надо разобраться.

яж говорил :joy:

3 лайка

Ну, тогда разбирайтесь самостоятельно.

Примерные коды” в которых “обязательно что-то присвоено” (но от меня скрывают, что именно), я не обсуждаю, т.к. считаю такое занятие мастурбацией.

Удачи!

А я в больничке отдыхаю, скукота. Помастурбирую чуток😄

Всё там правильно умножается. Но такое ли надо получить в итоге? ХЗ.
Результат АЦП 0…1023, 10 бит.
На выходе должно быть…хрен знает что(ХЗЧ).
ХЗЧ=АЦП×К+D, Где K-коэффициент(подобрать хз как), D-смещение(хз относительно чего).

Кроме того, что Х ничего не присвоено, еще и сдвиг неправильно применяете. В вашем коде, независимо от значения Х - на выходе всегда будет ноль.

Прежде чем задавать вопросы, стоило бы чуть поучится программировать, иначе выглядите полным идиотом. И потому отвечают вам как идиоту

Сделайте сначала мееедленно и длиннее, но работающее. Оптимизацию оставьте на десерт. Возможно она и не понадобится.

1 лайк

А на пальцах прикинуть, что результат не помещается в uint16_t не судьба?

..Подозрительно смотрит.

… а она уже ушла

1 лайк

В Фидо жестоко дрючили за оверквотинг, приучая к лаконичности.
Сейчас в интернете слать сто метров картинки ради пары символов считается нормальным.

Условия задачи указаны минимально, но достаточно.
Правильно строчка кода должна выглядеть как

x=(long)analogRead(an0)*k;

Благодарю всех откликнувшихся, но правильного решения озвучено не было. Никто значит с такими вещами дела не имел.

А мы уж волноваться начали)

2 лайка

С умножением? Нет, ни разу.

1 лайк

Правильной постановки задачи не было. Откуда тогда решению взяться?

1 лайк

Был озвучен ДИАГНОЗ, т.е. причина.
А методов лечения (Вы называете это “решением”) сколько угодно.
Судя по тому, что Вы признаете решением единственный вариант, ПРИЧИНА происходящего так и не была Вами понята.

Нет, это значит, “вещь” настолько элементарная, что ее как-то вслух даже озвучивать неудобно.

А это что?

Кино и немцы)))