Программа ИК для NEC почему-то не заработала
Программа ИК для NEC почему-то не заработала
Вот такой вид посылки и снизу код подписан. Ввожу в программу AH=18 AL=18 COM=B1. Не работает... Стартовый импульс 9,02мс за ним пауза 4,47мс. Длительность маленьких импульсов вверх 605мс, вниз 552мс. Длительность нуля (долгого импульса вниз) 1,66мс. Может сигнал не попадает в тайминги программы? Буду благодарен за помощь!
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Программа ИК для NEC почему-то не заработала
Можно "доверительный интервал" пошире сделать:
заменить
на ,
заменить на
, а
заменить на
Кроме этого, перед меткой errors, после команды xorwf GPIO,1 добавить movf GPIO,0
заменить
Код: Выделить всё
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'
С уважением, администрация сайта.
Re: Программа ИК для NEC почему-то не заработала
Если я правильно понял, то все конструкции подобного вида меняем? Или нет?
Там просто некоторые по 2 раза встречаются в подпрограмме обработки...
А ещё одна конструкция не описана в Вашем ответе:
Заменил
addlw .240
andlw b'11111100'
на
addlw .250
andlw b'11110000'
Сейчас программа принимает код, и щёлкает реле (у меня оно на порту GP4, через транзистор), а когда отправляешь код с пульта повторно, не реагирует... После снятия питания первый раз снова принимает и обрабатывает, а второй и последующие разы - нет...
Буду благодарен за помощь!
Там просто некоторые по 2 раза встречаются в подпрограмме обработки...
А ещё одна конструкция не описана в Вашем ответе:
Заменил
addlw .240
andlw b'11111100'
на
addlw .250
andlw b'11110000'
Сейчас программа принимает код, и щёлкает реле (у меня оно на порту GP4, через транзистор), а когда отправляешь код с пульта повторно, не реагирует... После снятия питания первый раз снова принимает и обрабатывает, а второй и последующие разы - нет...
Буду благодарен за помощь!
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Программа ИК для NEC почему-то не заработала
Не совсем то, что я хотел сказать получилось, короче надо вот так:Кроме этого, перед меткой errors, после команды xorwf GPIO,1 добавить movf GPIO,0
Код: Выделить всё
xorwf GPIO,1
errors movf GPIO,0
clrf Flags
Ага, все. Там все, кроме стартового импульса аж по 4 раза - для каждого байта.Если я правильно понял, то все конструкции подобного вида меняем? Или нет?
Возможно это связано с тем, что пульт при повторном нажатии на одну и ту же кнопку посылает специальный код повтора, вместо нормального кода. Попробуй не подряд одну и ту же кнопку жать, а сначала другую кнопку, а потом снова эту же.а когда отправляешь код с пульта повторно, не реагирует...
С уважением, администрация сайта.
Re: Программа ИК для NEC почему-то не заработала
Я не совсем понял, для чего данная команда?
_____ xorwf GPIO,1
errors movf GPIO,0
_____ clrf Flags
Сейчас он же порт инвертирует, значит всё ОК?
У меня пульт выдаёт только одну команду, без сигнала повтора, это 100%, проверено специальным считывателем...
Получается, что он код принял, раскодировал, проверил, он совпал, далее он выполнил подпрограмму "action" сбросил значения регистров, вернулся в основную программу, и больше, почему-то код не подходит??? Там что-то в программе, я уже начал прописывать сигнал в симуляторе MPLAB, но это тяжелый неблагодарный труд... Мне кажется вы как разработчик поможете с проблемой намного быстрее...
А по предыдущему вопросу: я правильно поменял .240 на .250? И честно говоря я не понимаю как оно работает... Место, где проверяются временные окна... Так в остальном всё понял, за протокол NEC отдельное спасибо, раньше для меня это было загадкой, а теперь разобрался!
Мне, честно говоря, от этой программы нужно следующее: по сигналу с пульта поднимать и опускать моторизированный экран. То есть одна кнопка пульта вверх - другая вниз. На практике управлять одним реле: включить или выключить. Это думаю сам прикрутить в программе. А то готовые устройства есть только китайские, которые принимают команду своего дурацкого пульта через раз и код там не NEC а какой-то SPACE - типа кодирование интервалами между импульсами... А родной американский блок для экрана - будет ехать 2 месяца и стоить как чугунный мост...
_____ 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 почему-то не заработала
Она перечитывает состояние входов и переписывает их в защёлки (устраняет несоответствие реального уровня на входе и прочитанного ранее значения, которое возникает при изменении уровня на входе). Именно такое несоответствие реального и прочитанного ранее состояния устанавливает флаг 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 мс не было изменений на ногах) должно прогу вернуть к исходному состоянию.
С уважением, администрация сайта.
Re: Программа ИК для NEC почему-то не заработала
Попробовал данную программу с пультом на стандартном 8-битном адресе в NEC протоколе, и программа работает как надо, то есть инвертирует порт при получении команды с пульта. Видимо собака порылась в том месте, где идёт определение протокола...
Заранее благодарен за поддержку...
Заранее благодарен за поддержку...
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Программа ИК для NEC почему-то не заработала
Хм, интересно. Программе на самом деле пофиг на протокол. Она просто определяет его тип и выставляет соответствующий флаг (для дальнейших экспериментов), но потом независимо от определённого типа проверяет оба байта адреса. Так что если работает с обычным протоколом, то должна работать и с расширенным???
Попробуй это место вообще вырезать:
Попробуй это место вообще вырезать:
Код: Выделить всё
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
С уважением, администрация сайта.
Re: Программа ИК для NEC почему-то не заработала
До сих пор изучаю программу в отладчике...
Нашел маленькую неточность: надо добавить команду "clrf Flags" в main, иначе в отладчике после первого запуска программа сразу заходила в convert. Если неправ - поправьте.
Нашел маленькую неточность: надо добавить команду "clrf Flags" в main, иначе в отладчике после первого запуска программа сразу заходила в convert. Если неправ - поправьте.
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Программа ИК для NEC почему-то не заработала
После включения питания в пользовательских регистрах нули. Программа после старта загружает калибровочную константу и переходит на main. При этом до первой проверки регистр Flags ни разу нигде не изменяется, так что там нули и будут.
Даже если предположить, что в пользовательских регистрах будет мусор (не могу я что-то сходу найти в доке, чтоб было написано их состояние после сброса по питанию), то в любом случае для того, чтобы он был вменяемо интерпретирован, мусор должен быть строго определённый, иначе функция convert вылетит по ошибке и очистит флаги. Ситуация, что одновременно в нескольких регистрах случайным образом появится строго определённый мусор ну очень мало вероятная.
Даже если предположить, что в пользовательских регистрах будет мусор (не могу я что-то сходу найти в доке, чтоб было написано их состояние после сброса по питанию), то в любом случае для того, чтобы он был вменяемо интерпретирован, мусор должен быть строго определённый, иначе функция convert вылетит по ошибке и очистит флаги. Ситуация, что одновременно в нескольких регистрах случайным образом появится строго определённый мусор ну очень мало вероятная.
С уважением, администрация сайта.