Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#1: 2011-04-23 21:50:10 ЛС | профиль | цитата
Форумчане, занялся ИК-контроллером. И как уже писал, хочу свой софт под него написать. И вот получаю я от него через свой терминальчик инфу о паузах и импульсах, которые излучает ИК-пульт. Получаю примерно такое:
code_23487.txt

Так вот на сайте производителя есть инфа о расшифровке кода, но больше ничего пояснять они не желают. а написано следующее:
"Каждый байт в посылке обозначает импульс или паузу и данные о масштабе.
http://www.hiasm.com/forum_serv.php?q=56&id=2328- фото таблички-пояснения разбора байта

Например ИК импульс длительностью 8,9 мс будет обозначаться байтом 0xC1, а пауза длительностью 4,4 мс будет обозначаться байтом 0xA0. ИК импульс, длительностью 417 мкс будет обозначаться 0x0E. ИК импульс длительностью более 256/14400 обозначается 0xFF. ИК пауза длительностью более 256/14400 обозначается 0xFE."

Так вот может ли кто помочь расшифровать одно: как ИК импульс длительностью 8,9 мс будет обозначаться байтом 0xC1? Во что они переводят это C1 чтоб получить эти заветные 8,9мс? Очень прошу натолкнуть на мысль или хотя бы ткнуть в ссылочку на матчасть? Гугл кроме того, что в байте 8 бит нихрена не научил.
карма: 0

1
файлы: 1code_23487.txt [225B] [130]
Голосовали:Blok
Разработчик
Ответов: 26270
Рейтинг: 2142
#2: 2011-04-23 22:00:44 ЛС | профиль | цитата
Neo0xC1, 0xC1 превратить в биты, то получится -- 110000001. Если разложить по твоей картинки, то старший бит будет означать, что полученное число надо разделить на 14400, младший бит заменяем нулем, остается 10000000, что равно 128. делим 128 на 14400 и получаем 0,008(8) сек, или приблизительно 8,9 msec
карма: 22

1
Голосовали:Neo
Ответов: 704
Рейтинг: 7
#3: 2011-04-23 22:46:37 ЛС | профиль | цитата
nesco, а в 110000001 нет опечатки? разве 9 символов, а не 8? И можно уточнить почему младший бит заменяем нулем?
Кстати, я правильно пытаюсь 10000000 перевести в число чтоб повторить за Вами - 128?
code_23488.txt

Ну и вопрос, претендующий на запуск в меня ракеты - чем можно перевести 0xC1 в биты? Конвертнуть его из hex в чисто, а там IntToBits?
карма: 0

0
файлы: 1code_23488.txt [1.2KB] [131]
Разработчик
Ответов: 26270
Рейтинг: 2142
#4: 2011-04-23 22:51:50 ЛС | профиль | цитата
Neo, что-то я слажал малость. У тебя есть еще набор значений, чтобы точно вычислить алгоритм
карма: 22

0
Ответов: 704
Рейтинг: 7
#5: 2011-04-23 22:54:41 ЛС | профиль | цитата
Кроме "ИК импульс длительностью 8,9 мс будет обозначаться байтом 0xC1, а пауза длительностью 4,4 мс будет обозначаться байтом 0xA0. ИК импульс, длительностью 417 мкс будет обозначаться 0x0E. ИК импульс длительностью более 256/14400 обозначается 0xFF. ИК пауза длительностью более 256/14400 обозначается 0xFE." ничего не поясняют. Мол и так все ясно должно быть наверное...
карма: 0

0
Разработчик
Ответов: 26270
Рейтинг: 2142
#6: 2011-04-23 22:55:34 ЛС | профиль | цитата
Все правильно, ошибка в преобразовании. 0xС1 -- 11000001. Седьмой разряд означает, что это не 1/14400, а 1/3600. 8,9 msec дает деление 32 на 3600, 32 получается из 1000001 методом сдвига вправо на один разряд, замещая тем самым разряд который означает признак ИК
карма: 22

0
Ответов: 704
Рейтинг: 7
#7: 2011-04-23 23:01:57 ЛС | профиль | цитата
Их софт как-то переводит и пытается все значения приводить в масштабу 14400, но такие переделки не воспринимает телевизор и кондишка. а вот когда я им передаю в порт на излучение тупо то, что считываю от пульта - они реагируют. Я бы и не заморачивался дальше, но хочется научиться разберать какую клавишу пульта нажимаю, чтоб управлять можно было как универсального пульта. А выходит, что сигналы у пультов гуляют немного и дважды нажав на одну и ту же кнопку, получаются чуть разные данные. Но как потом выяснил, эти данные на столько же визуально чуть разные, как и данные с других кнопок этого пульта. Тогда уж дошло, что нужно именно вычислять длительности этих пауз/импульсов и сравнивать их последовательности как эталонные.

code_23491.txt
карма: 0

0
файлы: 1code_23491.txt [704B] [89]
Разработчик
Ответов: 26270
Рейтинг: 2142
#8: 2011-04-23 23:05:25 ЛС | профиль | цитата
Neo писал(а):
а пауза длительностью 4,4 мс будет обозначаться байтом 0xA0. ИК импульс, длительностью 417 мкс будет обозначаться 0x0E

Давай проверим.
0xA0 -- 10100000. Старший разряд равен 1 -- 1/3600, младший равен 0 -- пауза. Сдвигаем остаток вправо убрав старший разряд, получаем 10000 -- 16, делим 16 на 3600, получаем 4,4 мс

0x0E -- 00001110. Старший разряд равен 0 -- 1/14400, младший 0 -- пауза. Сввигаем остаток вправо убрав последний разряд, получам 111 -- 7, делим 7 на 14400 получаем 486 мксек. Почему-то не 417
карма: 22

0
Ответов: 704
Рейтинг: 7
#9: 2011-04-23 23:07:32 ЛС | профиль | цитата
nesco писал(а):
методом сдвига вправо на один разряд
но тогда получается нужно сдвинуть и младший бит, поскольку он означает пауза это или импульс? (в данном случае импульс)
карма: 0

0
Разработчик
Ответов: 26270
Рейтинг: 2142
#10: 2011-04-23 23:10:55 ЛС | профиль | цитата
Neo писал(а):
но тогда получается нужно сдвинуть и младший бит

Не надо, по нему ты определяешь, что давать -- паузу или импульс
А куда ты его собрался сдвигать, если он находится в нулевом бите
карма: 22

0
Ответов: 704
Рейтинг: 7
#11: 2011-04-23 23:11:27 ЛС | профиль | цитата
Если я правильно въехал, то промежуток времени это у них биты, между младшим и старшим? то есть мы их просто убираем и вычисляем:

0xOA -- 010000
0x0E -- 000111


карма: 0

0
Разработчик
Ответов: 26270
Рейтинг: 2142
#12: 2011-04-23 23:12:55 ЛС | профиль | цитата
Neo писал(а):
то есть мы их просто убираем и вычисляем:

Можно и так, если с текстом работать, а не с числами. Я на числовых значениях показывал
карма: 22

0
Ответов: 704
Рейтинг: 7
#13: 2011-04-23 23:13:27 ЛС | профиль | цитата
nesco писал(а):
по нему ты определяешь, что давать
но я же смогу различать пауза это или импульс разу после разложения на биты, а потом, по таблице, получается я их отбрасываю и просто вычисляю время паузы или импульса?
карма: 0

0
Разработчик
Ответов: 26270
Рейтинг: 2142
#14: 2011-04-23 23:13:48 ЛС | профиль | цитата
Neo писал(а):
но я же смогу различать пауза это или импульс разу после разложения на биты, а потом, по таблице, получается я их отбрасываю и просто вычисляю время паузы или импульса?

Вполне, если работать с текстовым представлением битов
карма: 22

0
Ответов: 704
Рейтинг: 7
#15: 2011-04-23 23:18:36 ЛС | профиль | цитата
nesco, огромное спасибо, что помог осилить алгоритм!
Только так и не понял как эти биты -то получить? code_23492.txt

упорно выдает 1. это я совсем не туда зашел?
------------ Дoбавленo в 23.17:
чем можно перевести 0xC1 в биты? Конвертнуть его из hex в чисто, а там IntToBits?
------------ Дoбавленo в 23.18:
Не могу опытным путем проверить, опыта работы с переводом в биты 0, а так поковыряю и разберусь с пинка ))
карма: 0

0
файлы: 1code_23492.txt [1.2KB] [136]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)