Ассемблер (ASM) для AVR в вопросах и ответах
Тогда учитесь на чистом АСМе. К чему эти СИшные вставки?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Здравствуйте, я где-то видел (а теперь не нахожу) пример масштабирования диапазонов. Например, есть некая величина, изменяющаяся от 0А до 8С. Как её растянуть до диапазона байта? Какова там математика? Может кто-нибудь тоже встречал? Подскажите, пж, где искать.
Я всё-всё узнAю и стану профессором.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="dgrett",url="/forum/viewtopic.php?p=4010207#p4010207"]Например, есть некая величина, изменяющаяся от 0А до 8С. Как её растянуть до диапазона байта? Какова там математика?[/uquote]
Очевидно же, что нужно умножать на 256 / 0x8C = ~1.83. Если под дробную часть выделить 7 бит, т.е. 128 будет равно 1, то 1.83 превращается в 1.83 * 128 = 234, что удобно, т.к. есть аппаратное умножение 8x8:
(234 * 0x0A) >> 7 = 18
(234 * 0x8C) >> 7 = 255
Очевидно же, что нужно умножать на 256 / 0x8C = ~1.83. Если под дробную часть выделить 7 бит, т.е. 128 будет равно 1, то 1.83 превращается в 1.83 * 128 = 234, что удобно, т.к. есть аппаратное умножение 8x8:
(234 * 0x0A) >> 7 = 18
(234 * 0x8C) >> 7 = 255
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Понял, спасибо.
О, немного не так. 0А должно было стать нулём. Запутался.
О, немного не так. 0А должно было стать нулём. Запутался.
Я всё-всё узнAю и стану профессором.
- Реклама
между 8C и 0A лежит 130 чисел. если диапазон 0-255 приводить к этому количеству, то коэффициент будет не 1,8 а 1,97, т.е. почти 2.
следовательно, из кода надо отнять 10 и результат умножить на 2 - примерно то и выйдет, что надо.
следовательно, из кода надо отнять 10 и результат умножить на 2 - примерно то и выйдет, что надо.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=4010219#p4010219"]следовательно, из кода надо отнять 10 и результат умножить на 2 - примерно то и выйдет, что надо.[/uquote]
Ох уж эти оптимизаторы
(0x8C - 10) * 2 = 260
Вычитать нужно, дальше лучше делать как я изначально показывал:
256 / (0x8C - 10) * 128 = 252
((0x8C - 10) * 252) >> 7 = 255
Вместо сдвига вправо на 7 естественно будет 16-ти битный сдвиг влево на 1 с извлечением старшего байта.
Ох уж эти оптимизаторы
(0x8C - 10) * 2 = 260
Вычитать нужно, дальше лучше делать как я изначально показывал:
256 / (0x8C - 10) * 128 = 252
((0x8C - 10) * 252) >> 7 = 255
Вместо сдвига вправо на 7 естественно будет 16-ти битный сдвиг влево на 1 с извлечением старшего байта.
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Akl, не понял что такое 502, посчитал на бумажке( в екселе то есть), работает. Reflector, доходчиво, на бумажке тоже работает. Посмотрю, как лучше в ассемблере сделать.
Единственное, что я и сам пока не знаю, а не придётся ли это преобразование делать нелинейным.
типа х^2. Но пока для тестов подойдёт линейное преобразование.
СПАСИБО.
Единственное, что я и сам пока не знаю, а не придётся ли это преобразование делать нелинейным.
СПАСИБО.
Я всё-всё узнAю и стану профессором.
[uquote="ARV",url="/forum/viewtopic.php?p=4010219#p4010219"]коэффициент будет ... 1,97[/uquote]
502/256 = 1.96
502/256 = 1.96
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
[uquote="dgrett",url="/forum/viewtopic.php?p=4010231#p4010231"]Единственное, что я и сам пока не знаю, а не придётся ли это преобразование делать нелинейным.
типа х^2.[/uquote]
Тогда проще из таблицы дёргать, если есть ограничения у МК.
Тогда проще из таблицы дёргать, если есть ограничения у МК.
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Тоже неплохо. Мега8, места во флеше свободного доуя. Протестирую и решу. Спс всем!!

Я всё-всё узнAю и стану профессором.
Наиболее эффективно будет таки при помощи табличного декодера выполнить.

[uquote="BOB51",url="/forum/viewtopic.php?p=4010250#p4010250"]Наиболее эффективно...[/uquote]... с точки зрения быстродействия.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Да, хорошее решение. Только таблицу надо предварительно составить и занести в память.
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
{.. с точки зрения быстродействия}
По сути и расчёт на асме не займёт значительного времени. Да и спешить некуда. В моём случае 100 мс ничего не решают.
{таблицу надо предварительно составить и занести в память.}
Я же «на бумажке « посчитал уже, Вам спасибо.
По сути и расчёт на асме не займёт значительного времени. Да и спешить некуда. В моём случае 100 мс ничего не решают.
{таблицу надо предварительно составить и занести в память.}
Я же «на бумажке « посчитал уже, Вам спасибо.
Я всё-всё узнAю и стану профессором.
Ну там не только быстродействие - возможность оперативного изменения диапазона и/или характеристик преобразования при коэффициенте в виде данных в любом из регистров (0-31) или константного смещения 0-63 для регистровой пары как указателя.Gudd-Head писал(а):...с точки зрения быстродействия.
Единственный минус - придется Z занять.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4010251#p4010251"]c точки зрения быстродействия.[/uquote]
Умножение 8x8 вместе со сдвигом на 1 бит влево - это одна FMUL выполняемая за 2 такта, плюс еще одна LDI нужна, итого 3 такта.
Умножение 8x8 вместе со сдвигом на 1 бит влево - это одна FMUL выполняемая за 2 такта, плюс еще одна LDI нужна, итого 3 такта.
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
[uquote="BOB51",url="/forum/viewtopic.php?p=4010261#p4010261"]Единственный минус - придется Z занять.
[/uquote]
Ассемблер это всегда поиск компромиссов. Объем памяти, быстро действие, занимаемые регистры.
Я не вижу минуса в том, что ах, регистры Z надо занимать. Минуса как такового нет. Это ваше личное предпочтение, как вы распределяете регистры в своих программах. Ваши личные правила.
Есть задача. Есть условия. И ты определяешь, на какие компромиссы идёшь, и какие регистры использовать. Нужно чётко разделять личные предпочтения и целесообразность.
Ассемблер это всегда поиск компромиссов. Объем памяти, быстро действие, занимаемые регистры.
Я не вижу минуса в том, что ах, регистры Z надо занимать. Минуса как такового нет. Это ваше личное предпочтение, как вы распределяете регистры в своих программах. Ваши личные правила.
Есть задача. Есть условия. И ты определяешь, на какие компромиссы идёшь, и какие регистры использовать. Нужно чётко разделять личные предпочтения и целесообразность.
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Да в конце концов с пушпопом можно любой регистр пользовать.
Я всё-всё узнAю и стану профессором.


