реклама на сайте
подробности

 
 
> Вычисления на ATmega88
koluna
сообщение Dec 2 2008, 14:00
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Здравствуйте!

Использую WinAVR, ATmega88, сигнал синхронизации - внтутренняя RC-цепь (частота 8 МГц).
Необходимо как можно быстрее вычислить значение следующего выражения:

C = Y * C' / 255.
Причём:
C, Y, C' - unsigned char, т. е., действительные числа мне не нужны...

В данный момент вычисления производятся приблизительно за 92 мкс (в программе три выражения подряд).

Можно, конечно, кварц поставить на большую частоту, но хотелось бы пока без него smile.gif

Фрагмент программы:

Код
...
OCR0A = n_red * dmx[0] / 255;
OCR0B = n_green * dmx[0]  / 255;
OCR2B = n_blue * dmx[0] / 255;
...



Спасибо заранее!


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
koluna
сообщение Dec 12 2008, 20:39
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Вот ещё одна задача.
Как аналогичным образом целочисленно поделить одно 8-битное число на другое 8-битное число?
Более конкретно - деление на 10.


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Dec 12 2008, 23:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата(n_bogoyavlensky @ Dec 12 2008, 22:39) *
Вот ещё одна задача.
Как аналогичным образом целочисленно поделить одно 8-битное число на другое 8-битное число?
Более конкретно - деление на 10.


Для диапазона A=[0..255): (unsigned char)(А+1)*51>>9

Для диапазона A=[0..255] ((unsigned char)(А*51) + 51)>>9

или на асме соответственно
Код
    ldi    temp,51
    inc    A    
    mul    A,temp
    lsr    R1

и
    ldi    temp,51
    mul    A,temp
    add    R0,temp
    adc    R1,zero
    lsr    R1
Go to the top of the page
 
+Quote Post
koluna
сообщение Dec 13 2008, 11:33
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата
Для диапазона A=[0..255): (unsigned char)(А+1)*51>>9

Для диапазона A=[0..255] ((unsigned char)(А*51) + 51)>>9


Спасибо! smile.gif
Кстати, откуда вы с такой лёгкостью извлекаете эти волшебные выражения? smile.gif
Они где-то перечислены или их можно достаточно просто придумать самому? Каков принцип?

А для диапазона A=[0..65535]?

Цитата(singlskv @ Dec 13 2008, 01:13) *
Дык все точно так же,
умножте на 26(~256/10) или на 6554(~65536/10) ну и если нужно скоректируйте...



Всмысле?
Что умножить и как скорректировать?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 13 2008, 12:06
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(n_bogoyavlensky @ Dec 13 2008, 14:33) *
Всмысле?
Что умножить и как скорректировать?

Именно так как в посте №21

51 ~= 256 * 2 / 10

+ 51 корректировка
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- n_bogoyavlensky   Вычисления на ATmega88   Dec 2 2008, 14:00
- - Непомнящий Евгений   а если поделить на 256? Компилер должен превратить...   Dec 2 2008, 14:12
- - Арк К   А надо делить именно на 255? не на 256? тогда было...   Dec 2 2008, 14:16
|- - Непомнящий Евгений   Цитата(Арк К @ Dec 2 2008, 17:16) Критичн...   Dec 2 2008, 14:24
|- - n_bogoyavlensky   Цитата(Арк К @ Dec 2 2008, 18:16) А надо ...   Dec 3 2008, 08:26
|- - _Pasha   Цитата(n_bogoyavlensky @ Dec 3 2008, 12:2...   Dec 3 2008, 08:55
|- - n_bogoyavlensky   ЦитатаВ догонку. Деление на 255 в данном случае мо...   Dec 3 2008, 09:46
- - _Pasha   Цитата(n_bogoyavlensky @ Dec 2 2008, 18:0...   Dec 2 2008, 14:24
|- - Непомнящий Евгений   Цитата(_Pasha @ Dec 2 2008, 17:24) Исполь...   Dec 2 2008, 15:14
|- - _Pasha   Цитата(Непомнящий Евгений @ Dec 2 2008, 19...   Dec 2 2008, 15:20
|- - =GM=   Цитата(Непомнящий Евгений @ Dec 2 2008, 15...   Dec 2 2008, 16:53
|- - Непомнящий Евгений   Цитата(=GM= @ Dec 2 2008, 19:53) Вот здес...   Dec 3 2008, 05:26
|- - =GM=   Цитата(Непомнящий Евгений @ Dec 3 2008, 05...   Dec 3 2008, 11:00
- - =GM=   Цитата(n_bogoyavlensky @ Dec 2 2008, 14:0...   Dec 2 2008, 14:52
|- - Непомнящий Евгений   Цитата(=GM= @ Dec 2 2008, 17:52) C=(Y*C1*...   Dec 2 2008, 15:00
|- - =GM=   Цитата(Непомнящий Евгений @ Dec 2 2008, 15...   Dec 2 2008, 15:05
- - LordVader   Вот что нагуглилось: http://www.sharpthinking.net/...   Dec 2 2008, 16:48
- - VDG   Человек скорее всего управляет RGB-светодиодом, а ...   Dec 2 2008, 22:02
|- - n_bogoyavlensky   Цитата(singlskv @ Dec 13 2008, 16:06) Име...   Dec 13 2008, 12:16
|- - xemul   Цитата(n_bogoyavlensky @ Dec 13 2008, 15...   Dec 13 2008, 12:56
||- - n_bogoyavlensky   Цитата(xemul @ Dec 13 2008, 16:56) x/10 ~...   Dec 13 2008, 18:34
||- - xemul   Цитата(n_bogoyavlensky @ Dec 13 2008, 21...   Dec 13 2008, 20:41
||- - singlskv   Цитата(xemul @ Dec 13 2008, 23:41) Спасиб...   Dec 13 2008, 21:33
||- - xemul   Цитата(singlskv @ Dec 14 2008, 00:33) на ...   Dec 13 2008, 22:41
||- - Александр Куличок   Цитата(singlskv @ Dec 13 2008, 23:33) -ит...   Dec 13 2008, 23:35
|- - SSerge   Цитата(n_bogoyavlensky @ Dec 13 2008, 18...   Dec 13 2008, 13:00
- - singlskv   Дык все точно так же, умножте на 26(~256/10) или н...   Dec 12 2008, 21:13
- - ae_   x/10 = x*(1/10) = x*(205/2048) = (x*205)>>11...   Dec 13 2008, 12:56
- - ae_   Так, что бы во всём диапазоне 0...255 / 10 выполня...   Dec 14 2008, 11:51
- - n_bogoyavlensky   Кстати, а что за метод в 11 посте? Там логика друг...   Dec 15 2008, 09:59
- - SSerge   Цитата(n_bogoyavlensky @ Dec 15 2008, 15...   Dec 15 2008, 11:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 16:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016