Цитата(Арк К @ Dec 2 2008, 18:16)

А надо делить именно на 255? не на 256?
тогда было бы нужно просто выкинуть младший байт
Критичные ко времени места лучше делать на ассемблере.
Понятно, что на ассемблере быстрее будет работать...
Но я не знаю как сопрячь WinAVR C и ассемблер

Цитата(_Pasha @ Dec 2 2008, 18:24)

Используйте предварительно посчитанные значения K=M*dmx[0]/255
где М выбирается таким, чтобы получалось то, что делается быстрее, т.е. умножение на К и взятие старшего байта произведения.
асмовый текст, раз уж заговорили про скорость
Код
lds r24,K
lds r25,n_red
mul r24,r25
out OCR0A,r1
lds r25,n_green
mul r24,r25
out OCR0A,r1
lds r25,n_blue
sts OCR2A,r1
Надеюсь, принцип понятен.
К сожалению принцип не понятен пока.
Сколько нужно памяти для предварительно посчитанных значений?
Цитата(_Pasha @ Dec 2 2008, 19:20)

Я обратил внимание на то, что эта часть dmx[0] / 255; должна быть вычислена один раз и больше не участвовать в окончательных выражениях. Таблицей, конечно, не получится
ЗЫ - наверное, автору все-таки нужно сразу делить на 256, потому что разница в 3 промилле, наверняка, не важна.
f = dmx[0] / 255 делается действительно 1 раз.
Я вынес эту операцию в другое место.
Теперь делаю только
С = C' * f.
Время выполнения сократилось приблизительно на 10 мкс (кстати, я ещё кварц на 20 МГц поставил).
Но хотелось бы ещё побыстрее...
Цитата(VDG @ Dec 3 2008, 02:02)

Человек скорее всего управляет RGB-светодиодом, а деление на 255 - это соответственно "нормализация в восьмибитное число" после умножения на коэффициент яркости. В таком случае, деление на 255 - ошибка. На 256 надо делить, или как выше сказали - взять HIBYTE.
Ими и управляю. Поясню.
Регулирую яркость 8-битным ШИМом микроконтроллера.
Имеем 4 внешних контролла, от которых зависит результирующий цвет луча и его интенсивность.
1 - Общая световая интенсивность dmx[0].
2 - Интенсивность красного n_red.
3 - Интенсивность зелёного n_green.
4 - Интенсивность синего n_blue.
Т. е., моя задача - вычислить значение 8-битного регистра сравнения OCR микроконтроллера, которое зависит от dmx[0] и n_red/n_green/n_blue.
Придумал управлять так:
Код
OCR0A = n_red * dmx[0] / 255;
OCR0B = n_green * dmx[0] / 255;
OCR2B = n_blue * dmx[0] / 255;
Но подвело меня деление...
Почему надо делить на 256?
Ясное дело, это сдвиг вправо на 8 - выполняется молниеносно, но почему 256?
Т. е., просто согласиться с появляющейся ошибкой?