Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 25.06.2007, 13:11  
Beduin
Прописка
 
Регистрация: 21.10.2005
Сообщений: 251
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 17 сообщении(ях)
Beduin на пути к лучшему
По умолчанию преобразование позиции бита в код

Господа ! Посоветуйта быстрый алгоритм .Ситуация такая - на один из выводов порта контроллера (8 бит)подается 1. Надо позицию этой единици быстренько преобразовать в шестнадцатеричный код . Т.е. если на входе р2 появилась единица то выдается код 2 ,если на входе р5 то выдается код 5.В случае появления более одной единици на входе старшие биты должны игнорироваться .Вобщем получается программный шифратор. Существуют ли какие математические функции для подобного преобразования.
Реклама:
Beduin вне форума  
Непрочитано 25.06.2007, 13:31  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию Re: преобразование позиции бита в код

Сообщение от Beduin
Господа ! Посоветуйта быстрый алгоритм .Ситуация такая - на один из выводов порта контроллера (8 бит)подается 1. Надо позицию этой единици быстренько преобразовать в шестнадцатеричный код . Т.е. если на входе р2 появилась единица то выдается код 2 ,если на входе р5 то выдается код 5.В случае появления более одной единици на входе старшие биты должны игнорироваться .Вобщем получается программный шифратор. Существуют ли какие математические функции для подобного преобразования.
Если не сложно, ответьте на наводящий вопрос, какой МК (есть ли, в системе команд операции работы с битами)? Если есть, можно обрабатывать входы побитно,начиная с младшего.
sanitar249 вне форума  
Непрочитано 25.06.2007, 13:47  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Если правильно понял ... Вам нужно получить младший номер бита порта, который выставлен в единицу.
например ... установили в один биты 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 -- нет установленных бит

Идея черновая -- мелочи требуют проверки
AndryG вне форума  
Непрочитано 25.06.2007, 15:04  
Beduin
Прописка
 
Регистрация: 21.10.2005
Сообщений: 251
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 17 сообщении(ях)
Beduin на пути к лучшему
По умолчанию

sanitar249 контроллер - тиня 2313.
AndryG Вы правильно все поняли .Идея с последовательным сдвигом и инкрементом первая что приходит на ум ,но получается медленно .Это потребует максимум 8 раз выполнять один и тот-же набор команд ,а хотелось-бы ограничиться 3-4мя командами логических и арифметических операций без цикла.[/b]
Beduin вне форума  
Непрочитано 25.06.2007, 15:30  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Ну... флаг Вам ик... в руки! извините ...

если найдете решение ... ОБЯЗАТЕЛЬНО ... напишите сюда - я подписался на тему -- интересно решение.
AndryG вне форума  
Непрочитано 25.06.2007, 15:40  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

Сообщение от AndryG
Ну... флаг Вам ик... в руки! извините ...

если найдете решение ... ОБЯЗАТЕЛЬНО ... напишите сюда - я подписался на тему -- интересно решение.
Попробую на словах: используем циклический сдвиг значения входного байта через перенос "С"("С" предварительно сбросить) ,после каждого сдвига проверяем бит "С" командой условного перехода, как только 1 идем из цикла на выход, в счетчике цикла получаем требуемое число.
sanitar249 вне форума  
Непрочитано 25.06.2007, 15:46  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Вам сейчас ответят тоже, что и мне

Разница лишь в том, что я на "С"(ЯВУ) описал, а Вы предлагаете более "железоприближенное" решение.
AndryG вне форума  
Непрочитано 25.06.2007, 15:52  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

Сообщение от AndryG
Вам сейчас ответят тоже, что и мне

Разница лишь в том, что я на "С"(ЯВУ) описал, а Вы предлагаете более "железоприближенное" решение.
СОРИ! Вашего поста не заметил.
Но, если безцикла, то проверять побитно. Только это не так красиво
sanitar249 вне форума  
Непрочитано 25.06.2007, 16:28  
lsa
Почётный гражданин KAZUS.RU
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
lsa на пути к лучшему
По умолчанию

Табличный метод.
Считываем значение порта в переменную.
Эта переменная - индекс в таблице.
Считываем из таблицы шестнадцатеричное значение по индексу.
Понадобится всего несколько команд для любого процессора и 256 байт для таблицы значений.
lsa вне форума  
Непрочитано 25.06.2007, 16:38  
EVGENIY1962
Гражданин KAZUS.RU
 
Регистрация: 27.07.2006
Сообщений: 659
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
EVGENIY1962 на пути к лучшему
По умолчанию

Сообщение от lsa
Табличный метод.
Считываем значение порта в переменную.
Эта переменная - индекс в таблице.
Считываем из таблицы шестнадцатеричное значение по индексу.
Понадобится всего несколько команд для любого процессора и 256 байт для таблицы значений.
Это самый быстрый способ,если только автора не подожмет память.В остальном - быстрее невозможно.
EVGENIY1962 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование чисел Alien2057 Цифровые сигнальные процессоры 1 25.04.2009 09:44
преобразователь код-код zazan111 TTL и CMOS логика 18 05.01.2009 06:11
Преобразование данных Chemst Делимся опытом 0 08.10.2008 10:38
[Решено] Определение позиции. Святослав Автоматика и аппаратура связи 2 22.01.2006 00:39
[Решено] преобразование RGB Евгений Видеотехника 7 07.09.2005 14:30


Часовой пояс GMT +4, время: 05:00.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot