Прием команд с ик-пультов.

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

Прием команд с ик-пультов.

Сообщение Viper_Snake »

Прошу разжевать правильный метод приема команд с ик-пультов для использования в поделках с контроллерами avr. Интересует как правильно захватывать посылку и определять начало и конец.
Не важно чем все начнется. Важно чем кончится!
Реклама
Аватара пользователя
mickbell
Друг Кота
Сообщения: 16431
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Re: Прием команд с ик-пультов.

Сообщение mickbell »

Сначала посмотреть осциллографом, что там делается. Причём в двух вариантах: при первом нажатии и при удержании нажатой кнопки, иногда сигналы отличаются. Можно сделать это, открыв пульт и наблюдая сигнал прямо на излучающем диоде. Если есть TSOP с подходящей несущей частотой, можно смотреть сигнал на его выходе, тогда и пульт вскрывать не придётся. Потом, зная картинку (а она бывает всякой, не обязательно стандартной для пультов), можно реализовать приём.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Реклама
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Прием команд с ик-пультов.

Сообщение roman.com »

Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

Re: Прием команд с ик-пультов.

Сообщение Viper_Snake »

Роман, это конечно все хорошо и интересно, но, если честно нихрена непонятно. Берем прерывание - окей, что в нем то делать надо? Их за время приема посылок приедет будь здоров. Я процедуру просил описать - сам не доезжаю мозгами. Есть ли пример кода на C, только без библиотек.

Добавлено after 3 minutes 48 seconds:
Mickbell, да задача то простая, взять обычный NECовский пульт и научиться работать с ним. Используя Ардуиновские библиотеки это труда не составляет абсолютно, но бездумное потребление чужого кода, это путь не туда.
Не важно чем все начнется. Важно чем кончится!
Реклама
Эиком - электронные компоненты и радиодетали
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Прием команд с ик-пультов.

Сообщение Martian »

я могу найти готовое решение, которое делал когда-то для ST, подглядывая у чужого для PIC, если надо...
Реклама
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Прием команд с ик-пультов.

Сообщение roman.com »

ну там же выше подробно...
:roll:
1. протокол NEC
NEC (1).jpg
(89.09 КБ) 33 скачивания
2. берём два таймера и одно прерывание в AVR:
-када прилетают импульсы с TSOP - срабатывает прерывание (прерывание по изменению уровня).
-первый таймер (таймер_1) записывает длительность между прерываниями.
-второй таймер (таймер_0) определяет окончания посылки.

подробнее...
-изначало МК находятся в режиме SLEEP...
-при обнаружении пакета МК просыпается и переходит в режим приёма... и запускается (таймер_0).
-при каждом изменении уровня вызывается прерывание (прерывание по изменению уровня), измеряется длительность между прерываниями (с помощью таймер_1) и обнуляется таймер (таймер_0).
данные таймера (таймер_1) записываются в массив (68 байт)... для последующей обработки.
время пробуждения.jpg
(147.76 КБ) 30 скачиваний

-по окончанию пакета вызывается прерывание таймера (таймер_0).
обработка пакета.jpg
(156.94 КБ) 33 скачивания
-обрабатываем полученные данные из массива (68 байт).
//TSOP:
//4*8*2 = 64 бит + 4 преамбула = 68 байт
NEC.jpg
(81.75 КБ) 28 скачиваний
после обработки массива (68 байт) на выходе имеем 4 байта данных: 00 FF 01 FE

всё просто))
:tea:
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Прием команд с ик-пультов.

Сообщение Martian »

не надо два таймера, достаточно одного.
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Прием команд с ик-пультов.

Сообщение roman.com »

для Прием команд с ик-пультов достаточно одного таймера... например (таймер_1).

но мне нужно два таймера... потому что у меня универсальный приёмник... кроме Прием команд с ик-пультов мой приёмник принимает и другие пакеты... по локальной сети умного дома))

два таймера (16 битный - таймер_1) и (8 битный - таймер_0) позволяют более гибко настраивать разные режимы работы моего приёмника и т.д. и т.п.
я не делаю что-то одно)) я делаю всё универсальным))
:tea:
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Прием команд с ик-пультов.

Сообщение Martian »

И в этом случае достаточного одного таймера. Но ТС вроде не спрашивал про возможность приёма данных из локальной сети Вашего дома, или я ошибаюсь?
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Прием команд с ик-пультов.

Сообщение roman.com »

о чем спрашивал ТС... нам расскажет сам ТС )) ТС говорить умеет...
сурдопереводчик нам не нужен))
)).jpg
(36.19 КБ) 41 скачивание
:tea:

Добавлено after 27 minutes 58 seconds:
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4575871#p4575871"]Есть ли пример кода на C, только без библиотек.[/uquote]
Есть.

допустим сделаем на таймере_0:
:tea:

-берём mega328p:
#include <mega328p.h> //RC - 8 МHz

-переключаем на 8 МHz:
//ATmega328:
//начальное: RC - 1 МHz: Higt D9; Ext 07; Lok 3F; Low 62
// RC - 8 МHz: Higt D9; Ext 07; Lok 3F; Low E2

-создаём массив... куда писать будем... ))
unsigned char Modem_int[]={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //32

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //64

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //96

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //128

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //160

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //192

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //224

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 //256
};

-добавляем флаги... всякие))
unsigned char Modem_flag_full; // Modem флаг полный

-добавляем прерывание таймера_0
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/////////////////////////////////////////////// выкл Timer 0
TCCR0B=0x00; // выкл Timer 0
//TCCR0B=0x01; // вкл Timer 0 (8мгц /1 -делитель) =0,000.032 с
//TCCR0B=0x05; // вкл Timer 0 (8мгц /1024 -делитель) =0,032.768 с
TCNT0=0x00; // сброс счёт Timer 0
/////////////////////////////////////////////// флаги:
Modem_flag_full = 1; // вкл Modem флаг полный
///////////////////////////////////////////////
}

-добавляем счётчик...
unsigned int Modem_len; // Modem_len // int

-добавляем прерывание...
//Pin change 16-23 interrupt service routine (PD0...PD7)
interrupt [PCINT2] void pin_change_isr2(void)
{
TCCR0B=0x05; // вкл Timer 0 (8мгц /1024 -делитель) =0,032.768 с
/////////////////////////////////////////////// запись Timer 0
Modem_int[Modem_len] = TCNT0; // Timer 0 > Modem_int (0...255)
Modem_len++; // счёт Modem_len // int
if (Modem_len > 255) {
Modem_len = 255;
};
/////////////////////////////////////////////// сброс Timer 0
//TCCR0B=0x00; // выкл Timer 0
//TCCR0B=0x01; // вкл Timer 0 (8мгц /1 -делитель) =0,000.032 с
//TCCR0B=0x05; // вкл Timer 0 (8мгц /1024 -делитель) =0,032.768 с
TCNT0=0x00; // сброс счёт Timer 0
///////////////////////////////////////////////
}

-в main настраиваем пины... куда TSOP подключать будем...
void main(void)
{
/////////////////////////////////////////////// RX_TV
DDRD.1=0; // вход RX_TV
PORTD.1=1; // вход RX_TV +

-настраиваем таймер_0
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00; // режим - нормальный
TCCR0B=0x00; // выкл Timer 0
//TCCR0B=0x01; // вкл Timer 0 (8мгц /1 -делитель) =0,000.032 с
//TCCR0B=0x05; // вкл Timer 0 (8мгц /1024 -делитель) =0,032.768 с
TCNT0=0x00; // сброс счёт Timer 0
OCR0A=0x00;
OCR0B=0x00;

-разрешаем прерывание Timer 0
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;

-разрешаем прерывание на пины... куда TSOP подключать будем...
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: On (PB7...PB0)
// Interrupt on any change on pins PCINT8-14: On (PC6...PC0)
// Interrupt on any change on pins PCINT16-23: On (PD7...PD0)
EICRA=0x00;
EIMSK=0x00;
PCICR=0x07;
PCMSK2=0b00101010; //вкл (PD7...PD0) // TV
PCIFR=0x07;

-разрешаем глобальное прерывание
///////////////////////////////////////////////////////Global enable interrupts:
#asm("sei") // вкл Global Interrupts

-в главное цикле ждём пока установится флаг окончания приёма пакета от TSOP...

_1:
if (Modem_flag_full == 0) {
goto _1; // > _1
};
Modem_flag_full = 0; // сброс флаг RX_Modem полный

-обрабатываем массив данных...
//TSOP:
//4*8*2 = 64 бит + 4 преамбула = 68
...
...
...

-на выходе имеем 4 байта данных: 00 FF 01 FE
...

goto _1; // > _1

всё просто))
:tea:

на выходе имеем 4 байта данных: 00 FF 01 FE

где:
07h - адрес устройства (SAMSUNG).
07h - адрес устройства (SAMSUNG).
68h - адрес команды (номер кнопки).
97h - инверсия адреса команды (номер кнопки).

все кнопки уже подписаны))
пульт_SAMSUNG.jpg
(79.5 КБ) 32 скачивания
:tea:
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

Re: Прием команд с ик-пультов.

Сообщение Viper_Snake »

roman.com, о, а вот так уже гораздо понятнее и приятнее. Спасибо, плагиатить не буду, а вот как пример себе пометочку сделаю. Для моих задач в коде конечно лишнего много, но сам смысл понятен. :beer:
Не важно чем все начнется. Важно чем кончится!
Ответить

Вернуться в «Практика»