Привет всем! Дан таймер, который вызывает прерывание SAMPLE_RATE раз в секунду. Есть переменные p2 и fq, которые обозначают амплитуду (0-255) и частоту соответственно. Алгоритм записывает текущее значение в переменную sample, которая затем выводится на ЦАП. Необходимо реализовать генератор треугольной волны. Разрешается хранить промежуточные значения в переменных ph, p1, p3 и p4. Все переменные типа uint16_t. Способы, которые я попробовал: Код (C++): if (ph >= SAMPLE_RATE / fq / p2) { if (p4 == 1) { p3 = ph++; if (ph >= p2) { p4 = 0; } } else { p3 = ph--; if (ph == 65535) { p4 = 0; } } p3 = ph; } sample = p3; Код (C++): sample = abs((ph++ % (SAMPLE_RATE / fq)) - p2); Заранее спасибо.
Проблема была в том, что abs() иногда почему-то выдаёт отрицательные значения (). Второй способ работает.
Отрицательные значения дает не abs(), а неправильное приведение типов. Если вы большой uint засунете в int такого же размера, он станет отрицательным, поскольку старший бит отвечает за знак.
О как! Изречение вида "иногда Солнце крутится вокруг Земли", не меньше По существу: abs не при чём, переполнение - при чём.