Не работает ИК пульт для NEC

Поклонники продукции Microchip Technology Inc тусуются тут.
Закрыто
Аватара пользователя
Ilyazh
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср май 21, 2014 13:18:07
Откуда: Санкт-Петербург
Контактная информация:

Не работает ИК пульт для NEC

Сообщение Ilyazh »

Здравствуйте. Хочу сделать пульт для NEC, взамен имеющегося. Делаю на pic 18f45j50. Выпаял светодиод от пульта и впаял к микроконтроллеру. Также впаял кнопку. При нажатии на кнопку диод светит (проверял камерой телефона), подключаю осциллограф - сигнал есть, однако устройство никак не реагирует на него. Адрес устройства известен (016 000), я так понимаю, это расширенный протокол с двухбайтовым адресом. Комманду посылаю любую, ибо устройство показывает код принимаемой команды, поэтому слать можно всё что угодно. Уже грешу что дело в коде, код приведу ниже. Посоветуйте, какие могут быть причины не работоспособности устройства? Уже даже все адреса перебирал программно и отправлял команду - всё равно ничего.

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

#define IRLED LATB.B2
int addd[] = {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}; // двухбайтовый адрес
int comm[] = {1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1}; // прямая и инверсная команда
void main() {
     ANCON0 = 0xFF;
     ANCON1 = 0xFF;
     PLLEN_Bit = 1;
     TRISB = 0x00; // Set all pins at the PORTB to output
     TRISC = 0x04; // Set all pins at the PORTC, except B2, to output. Set B2 to input
  if(если кнопка нажата) { // здесь сократил. В общем условие такого, что если мы нажали кнопку и не отпустили, то тело условия выполняется один раз и ничего не делает больше.
    out_one(9000);
    out_zero(4500);
    for(j=0;j<16;++j) {
                if(addd[j] == 0) {
                  out_one(560);
                  out_zero(1120-560);
                } else if(addd[j] == 1) {
                  out_one(560);
                  out_zero(2250-560);
                }
              }
             for(j=0;j<16;++j) {
                if(comm[j] == 0) {
                  out_one(560);
                  out_zero(1120-560);
                } else if(comm[j] == 1) {
                  out_one(560);
                  out_zero(2250-560);
                }
              }
             out_one(560);
  }
}
void out_one(int duration_us) {
     int currTime = 0;

     while(currTime < duration_us) {
          IRLED = 1;
          Delay_us(13); // 13 us ~ полупериод 38 кГц
     
          IRLED = 0;
          Delay_us(13);

          currTime += (2 * 13);
     }
     IRLED = 0;
}
void out_zero(int duration_us) {
     int currTime = 0;
     while(currTime < duration_us) {
             IRLED = 0;
             Delay_us(13);
             currTime += 13;
     }
}
Реклама
Аватара пользователя
Ilyazh
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср май 21, 2014 13:18:07
Откуда: Санкт-Петербург
Контактная информация:

Re: Не работает ИК пульт для NEC

Сообщение Ilyazh »

Отбой. Проблему чудом решил. В очередной раз сел читать о протоколе, прочитал 1000 статей и только в 1001 статье в каком-то мелком англоязычном бложке человек мельком упомянул об одной важнейшней мелочи. Сигнал должен быть с частотой 38 кГц (так пишут многие и логично предположить, что это меандр, раз иного не говорят), но оказалось скважность должна быть равна 3. Добавил такую скважность - всё заработало.
Реклама
Закрыто

Вернуться в «PIC»