Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.06.2007, 13:11
|
|
Прописка
Регистрация: 21.10.2005
Сообщений: 251
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 17 сообщении(ях)
|
преобразование позиции бита в код
Господа ! Посоветуйта быстрый алгоритм .Ситуация такая - на один из выводов порта контроллера (8 бит)подается 1. Надо позицию этой единици быстренько преобразовать в шестнадцатеричный код . Т.е. если на входе р2 появилась единица то выдается код 2 ,если на входе р5 то выдается код 5.В случае появления более одной единици на входе старшие биты должны игнорироваться .Вобщем получается программный шифратор. Существуют ли какие математические функции для подобного преобразования.
|
|
|
|
25.06.2007, 13:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Re: преобразование позиции бита в код
Сообщение от Beduin
|
Господа ! Посоветуйта быстрый алгоритм .Ситуация такая - на один из выводов порта контроллера (8 бит)подается 1. Надо позицию этой единици быстренько преобразовать в шестнадцатеричный код . Т.е. если на входе р2 появилась единица то выдается код 2 ,если на входе р5 то выдается код 5.В случае появления более одной единици на входе старшие биты должны игнорироваться .Вобщем получается программный шифратор. Существуют ли какие математические функции для подобного преобразования.
|
Если не сложно, ответьте на наводящий вопрос, какой МК (есть ли, в системе команд операции работы с битами)? Если есть, можно обрабатывать входы побитно,начиная с младшего.
|
|
|
|
25.06.2007, 13:47
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Если правильно понял ... Вам нужно получить младший номер бита порта, который выставлен в единицу.
например ... установили в один биты 2 и 3 ... с порта считывается 4+8=12 (2^2 + 2^3) ... Вам нужно получить ответ "2".
Точных формул не знаю ... но можно сделать маленьким циклом:
Код:
|
unsigned char i=8;
do{
if (data & 0x80)
break //прерываем цикл
data = data ‹‹ 1;
i--;
}while (i)
return i |
таким макаром мы поочередно просматриваем биты и считаем их номера(i)
После цикла смотрим на i ... 8-1 -- номера бит ... 0 -- нет установленных бит
Идея черновая -- мелочи требуют проверки
|
|
|
|
25.06.2007, 15:04
|
|
Прописка
Регистрация: 21.10.2005
Сообщений: 251
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 17 сообщении(ях)
|
sanitar249 контроллер - тиня 2313.
AndryG Вы правильно все поняли .Идея с последовательным сдвигом и инкрементом первая что приходит на ум ,но получается медленно .Это потребует максимум 8 раз выполнять один и тот-же набор команд ,а хотелось-бы ограничиться 3-4мя командами логических и арифметических операций без цикла.[/b]
|
|
|
|
25.06.2007, 15:30
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Ну... флаг Вам ик... в руки! извините ...
если найдете решение ... ОБЯЗАТЕЛЬНО ... напишите сюда - я подписался на тему -- интересно решение.
|
|
|
|
25.06.2007, 15:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Сообщение от AndryG
|
Ну... флаг Вам ик... в руки! извините ...
если найдете решение ... ОБЯЗАТЕЛЬНО ... напишите сюда - я подписался на тему -- интересно решение.
|
Попробую на словах: используем циклический сдвиг значения входного байта через перенос "С"("С" предварительно сбросить) ,после каждого сдвига проверяем бит "С" командой условного перехода, как только 1 идем из цикла на выход, в счетчике цикла получаем требуемое число.
|
|
|
|
25.06.2007, 15:46
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Вам сейчас ответят тоже, что и мне
Разница лишь в том, что я на "С"(ЯВУ) описал, а Вы предлагаете более "железоприближенное" решение.
|
|
|
|
25.06.2007, 15:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Сообщение от AndryG
|
Вам сейчас ответят тоже, что и мне
Разница лишь в том, что я на "С"(ЯВУ) описал, а Вы предлагаете более "железоприближенное" решение.
|
СОРИ! Вашего поста не заметил.
Но, если безцикла, то проверять побитно. Только это не так красиво
|
|
|
|
25.06.2007, 16:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Табличный метод.
Считываем значение порта в переменную.
Эта переменная - индекс в таблице.
Считываем из таблицы шестнадцатеричное значение по индексу.
Понадобится всего несколько команд для любого процессора и 256 байт для таблицы значений.
|
|
|
|
25.06.2007, 16:38
|
|
Гражданин KAZUS.RU
Регистрация: 27.07.2006
Сообщений: 659
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Сообщение от lsa
|
Табличный метод.
Считываем значение порта в переменную.
Эта переменная - индекс в таблице.
Считываем из таблицы шестнадцатеричное значение по индексу.
Понадобится всего несколько команд для любого процессора и 256 байт для таблицы значений.
|
Это самый быстрый способ,если только автора не подожмет память.В остальном - быстрее невозможно.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:00.
|
|