Программа ИК для NEC почему-то не заработала

Всё об интерфейсах, протоколах, подключении к МК разных устройств, подключении контроллеров к ПК...
jrman
Читатель
Читатель
Сообщения: 6
Зарегистрирован: 01 фев 2011, 01:47

Программа ИК для NEC почему-то не заработала

Сообщение jrman »

Вот такой вид посылки и снизу код подписан. Ввожу в программу AH=18 AL=18 COM=B1. Не работает... Стартовый импульс 9,02мс за ним пауза 4,47мс. Длительность маленьких импульсов вверх 605мс, вниз 552мс. Длительность нуля (долгого импульса вниз) 1,66мс. Может сигнал не попадает в тайминги программы? Буду благодарен за помощь!
Вложения
Вид и код пульта
Вид и код пульта
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Программа ИК для NEC почему-то не заработала

Сообщение rhf-admin »

Можно "доверительный интервал" пошире сделать:
заменить

Код: Выделить всё

addlw    .47
andlw     b'11111100'
на

Код: Выделить всё

addlw    .53
andlw     b'11110000'
,

Код: Выделить всё

addlw .223
andlw  b'11111100'
заменить на

Код: Выделить всё

addlw .230
andlw  b'11110000'
, а

Код: Выделить всё

addlw .238
andlw  b'11111100'
заменить на

Код: Выделить всё

addlw .247
andlw  b'11110000'
Кроме этого, перед меткой errors, после команды xorwf GPIO,1 добавить movf GPIO,0
С уважением, администрация сайта.
jrman
Читатель
Читатель
Сообщения: 6
Зарегистрирован: 01 фев 2011, 01:47

Re: Программа ИК для NEC почему-то не заработала

Сообщение jrman »

Если я правильно понял, то все конструкции подобного вида меняем? Или нет?
Там просто некоторые по 2 раза встречаются в подпрограмме обработки...
А ещё одна конструкция не описана в Вашем ответе:

Заменил
addlw .240
andlw b'11111100'
на
addlw .250
andlw b'11110000'

Сейчас программа принимает код, и щёлкает реле (у меня оно на порту GP4, через транзистор), а когда отправляешь код с пульта повторно, не реагирует... После снятия питания первый раз снова принимает и обрабатывает, а второй и последующие разы - нет...
Буду благодарен за помощь!
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Программа ИК для NEC почему-то не заработала

Сообщение rhf-admin »

Кроме этого, перед меткой errors, после команды xorwf GPIO,1 добавить movf GPIO,0
Не совсем то, что я хотел сказать получилось, короче надо вот так:

Код: Выделить всё

                xorwf GPIO,1
errors       movf GPIO,0
                clrf    Flags
Теперь к вопросу:
Если я правильно понял, то все конструкции подобного вида меняем? Или нет?
Ага, все. Там все, кроме стартового импульса аж по 4 раза - для каждого байта.
а когда отправляешь код с пульта повторно, не реагирует...
Возможно это связано с тем, что пульт при повторном нажатии на одну и ту же кнопку посылает специальный код повтора, вместо нормального кода. Попробуй не подряд одну и ту же кнопку жать, а сначала другую кнопку, а потом снова эту же.
С уважением, администрация сайта.
jrman
Читатель
Читатель
Сообщения: 6
Зарегистрирован: 01 фев 2011, 01:47

Re: Программа ИК для NEC почему-то не заработала

Сообщение jrman »

Я не совсем понял, для чего данная команда?
_____ xorwf GPIO,1
errors movf GPIO,0
_____ clrf Flags
Сейчас он же порт инвертирует, значит всё ОК?

У меня пульт выдаёт только одну команду, без сигнала повтора, это 100%, проверено специальным считывателем...
Получается, что он код принял, раскодировал, проверил, он совпал, далее он выполнил подпрограмму "action" сбросил значения регистров, вернулся в основную программу, и больше, почему-то код не подходит??? Там что-то в программе, я уже начал прописывать сигнал в симуляторе MPLAB, но это тяжелый неблагодарный труд... Мне кажется вы как разработчик поможете с проблемой намного быстрее...

А по предыдущему вопросу: я правильно поменял .240 на .250? И честно говоря я не понимаю как оно работает... :( Место, где проверяются временные окна... Так в остальном всё понял, за протокол NEC отдельное спасибо, раньше для меня это было загадкой, а теперь разобрался!

Мне, честно говоря, от этой программы нужно следующее: по сигналу с пульта поднимать и опускать моторизированный экран. То есть одна кнопка пульта вверх - другая вниз. На практике управлять одним реле: включить или выключить. Это думаю сам прикрутить в программе. А то готовые устройства есть только китайские, которые принимают команду своего дурацкого пульта через раз и код там не NEC а какой-то SPACE - типа кодирование интервалами между импульсами... А родной американский блок для экрана - будет ехать 2 месяца и стоить как чугунный мост...
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Программа ИК для NEC почему-то не заработала

Сообщение rhf-admin »

Я не совсем понял, для чего данная команда?
Она перечитывает состояние входов и переписывает их в защёлки (устраняет несоответствие реального уровня на входе и прочитанного ранее значения, которое возникает при изменении уровня на входе). Именно такое несоответствие реального и прочитанного ранее состояния устанавливает флаг GPIF. Если несоответствие не устранить - флаг не сбросится и сразу после выхода из прерывания оно будет сгенерировано опять, короче - вечное прерывание. Там правда в самом начале обработчика это уже выполняется, но потом я подумал, что... ну короче фиг знает - для страховки.
И честно говоря я не понимаю как оно работает... Место, где проверяются временные окна...
Ну вот смотри. Идеальный стартовый импульс (кроме того идеально измеренный) должен получиться равен 9+4,5=13,5 мс. При установленном предделителе 1:64 и частоте 4МГц (при такой частоте машинный цикл равен 1 мкс) это соответствует 13,5/(64*1)=211 отсчётам таймера.
Далее. Любые k младших бит определяют некоторое окно чисел, которые отличаются не более, чем на 2^k (то есть когда старшие биты одинаковые, а младшие k бит - любые). Расположив наше идеальное значение (обозначим как N) в середине этого окна мы получим, что числа из этого окна будут отличаться от N не более, чем на 2^k/2. Раз мы расположили идеальное значение в середине, то нижняя граница - это N минус 2^k/2, а верхняя граница N+2^k/2-1.
Для N=211 и окна в 4 бита получим нижнюю границу 211-2^4/2=203. То есть числа в диапазоне от 203 до 218 отличаются не более чем на 4 младших бита.
Если от любого числа в этом окне отнять нижнюю границу, то получим число, в котором k младших бит будут произвольными, а старшие равны нулю. Поскольку в ПИКах нет команды вычитания, то её можно заменить сложением. Для однобайтового числа Y-X и Y+(256-X) - это одно и тоже, просто во втором случае мы задействуем как бы заёмный бит из второго байта (которого у нас нет, вместо него у нас есть только бит переноса, на который мы благополучно забьём). То есть операцию X-203 можно заменить операцией X+(256-203)=X+53
Младшие биты отбрасываются операцией "побитное И" с маской '11110000' - биты, в которых установлена 1 - не отбрасываются, биты, в которых установлен ноль - отбрасываются (то есть в данном случае четыре старших бита не отбрасываются, а 4 младших - отбрасываются).
Вот как-то так.

А над тем, почему один раз срабатывает - подумаем, по идее прерывание от таймера (которое генерится, если за время 256*64=16,384 мс не было изменений на ногах) должно прогу вернуть к исходному состоянию.
С уважением, администрация сайта.
jrman
Читатель
Читатель
Сообщения: 6
Зарегистрирован: 01 фев 2011, 01:47

Re: Программа ИК для NEC почему-то не заработала

Сообщение jrman »

Попробовал данную программу с пультом на стандартном 8-битном адресе в NEC протоколе, и программа работает как надо, то есть инвертирует порт при получении команды с пульта. Видимо собака порылась в том месте, где идёт определение протокола...

Заранее благодарен за поддержку...
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Программа ИК для NEC почему-то не заработала

Сообщение rhf-admin »

Хм, интересно. Программе на самом деле пофиг на протокол. Она просто определяет его тип и выставляет соответствующий флаг (для дальнейших экспериментов), но потом независимо от определённого типа проверяет оба байта адреса. Так что если работает с обычным протоколом, то должна работать и с расширенным???
Попробуй это место вообще вырезать:

Код: Выделить всё

            comf      ADDRESS_LOW,0
            xorwf     ADDRESS_HIGH,0
            btfss      Status,2
            goto ext_nec
;--------------------------------
                 bsf         Flags,3
                 goto next_trial
ext_nec     bsf         Flags,4
С уважением, администрация сайта.
jrman
Читатель
Читатель
Сообщения: 6
Зарегистрирован: 01 фев 2011, 01:47

Re: Программа ИК для NEC почему-то не заработала

Сообщение jrman »

До сих пор изучаю программу в отладчике...

Нашел маленькую неточность: надо добавить команду "clrf Flags" в main, иначе в отладчике после первого запуска программа сразу заходила в convert. Если неправ - поправьте.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Программа ИК для NEC почему-то не заработала

Сообщение rhf-admin »

После включения питания в пользовательских регистрах нули. Программа после старта загружает калибровочную константу и переходит на main. При этом до первой проверки регистр Flags ни разу нигде не изменяется, так что там нули и будут.
Даже если предположить, что в пользовательских регистрах будет мусор (не могу я что-то сходу найти в доке, чтоб было написано их состояние после сброса по питанию), то в любом случае для того, чтобы он был вменяемо интерпретирован, мусор должен быть строго определённый, иначе функция convert вылетит по ошибке и очистит флаги. Ситуация, что одновременно в нескольких регистрах случайным образом появится строго определённый мусор ну очень мало вероятная.
С уважением, администрация сайта.
Ответить

Вернуться в «Интерфейсы / Протоколы / Периферия»