Прием команд с ик-пультов.
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Прием команд с ик-пультов.
Прошу разжевать правильный метод приема команд с ик-пультов для использования в поделках с контроллерами avr. Интересует как правильно захватывать посылку и определять начало и конец.
Не важно чем все начнется. Важно чем кончится!
- Реклама
Re: Прием команд с ик-пультов.
Сначала посмотреть осциллографом, что там делается. Причём в двух вариантах: при первом нажатии и при удержании нажатой кнопки, иногда сигналы отличаются. Можно сделать это, открыв пульт и наблюдая сигнал прямо на излучающем диоде. Если есть TSOP с подходящей несущей частотой, можно смотреть сигнал на его выходе, тогда и пульт вскрывать не придётся. Потом, зная картинку (а она бывает всякой, не обязательно стандартной для пультов), можно реализовать приём.
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Прием команд с ик-пультов.
Роман, это конечно все хорошо и интересно, но, если честно нихрена непонятно. Берем прерывание - окей, что в нем то делать надо? Их за время приема посылок приедет будь здоров. Я процедуру просил описать - сам не доезжаю мозгами. Есть ли пример кода на C, только без библиотек.
Добавлено after 3 minutes 48 seconds:
Mickbell, да задача то простая, взять обычный NECовский пульт и научиться работать с ним. Используя Ардуиновские библиотеки это труда не составляет абсолютно, но бездумное потребление чужого кода, это путь не туда.
Добавлено after 3 minutes 48 seconds:
Mickbell, да задача то простая, взять обычный NECовский пульт и научиться работать с ним. Используя Ардуиновские библиотеки это труда не составляет абсолютно, но бездумное потребление чужого кода, это путь не туда.
Не важно чем все начнется. Важно чем кончится!
Re: Прием команд с ик-пультов.
я могу найти готовое решение, которое делал когда-то для ST, подглядывая у чужого для PIC, если надо...
- Реклама
Re: Прием команд с ик-пультов.
ну там же выше подробно...
1. протокол NEC 2. берём два таймера и одно прерывание в AVR:
-када прилетают импульсы с TSOP - срабатывает прерывание (прерывание по изменению уровня).
-первый таймер (таймер_1) записывает длительность между прерываниями.
-второй таймер (таймер_0) определяет окончания посылки.
подробнее...
-изначало МК находятся в режиме SLEEP...
-при обнаружении пакета МК просыпается и переходит в режим приёма... и запускается (таймер_0).
-при каждом изменении уровня вызывается прерывание (прерывание по изменению уровня), измеряется длительность между прерываниями (с помощью таймер_1) и обнуляется таймер (таймер_0).
данные таймера (таймер_1) записываются в массив (68 байт)... для последующей обработки.
-по окончанию пакета вызывается прерывание таймера (таймер_0). -обрабатываем полученные данные из массива (68 байт).
//TSOP:
//4*8*2 = 64 бит + 4 преамбула = 68 байт после обработки массива (68 байт) на выходе имеем 4 байта данных: 00 FF 01 FE
всё просто))

1. протокол NEC 2. берём два таймера и одно прерывание в AVR:
-када прилетают импульсы с TSOP - срабатывает прерывание (прерывание по изменению уровня).
-первый таймер (таймер_1) записывает длительность между прерываниями.
-второй таймер (таймер_0) определяет окончания посылки.
подробнее...
-изначало МК находятся в режиме SLEEP...
-при обнаружении пакета МК просыпается и переходит в режим приёма... и запускается (таймер_0).
-при каждом изменении уровня вызывается прерывание (прерывание по изменению уровня), измеряется длительность между прерываниями (с помощью таймер_1) и обнуляется таймер (таймер_0).
данные таймера (таймер_1) записываются в массив (68 байт)... для последующей обработки.
-по окончанию пакета вызывается прерывание таймера (таймер_0). -обрабатываем полученные данные из массива (68 байт).
//TSOP:
//4*8*2 = 64 бит + 4 преамбула = 68 байт после обработки массива (68 байт) на выходе имеем 4 байта данных: 00 FF 01 FE
всё просто))
Re: Прием команд с ик-пультов.
не надо два таймера, достаточно одного.
Re: Прием команд с ик-пультов.
для Прием команд с ик-пультов достаточно одного таймера... например (таймер_1).
но мне нужно два таймера... потому что у меня универсальный приёмник... кроме Прием команд с ик-пультов мой приёмник принимает и другие пакеты... по локальной сети умного дома))
два таймера (16 битный - таймер_1) и (8 битный - таймер_0) позволяют более гибко настраивать разные режимы работы моего приёмника и т.д. и т.п.
я не делаю что-то одно)) я делаю всё универсальным))

но мне нужно два таймера... потому что у меня универсальный приёмник... кроме Прием команд с ик-пультов мой приёмник принимает и другие пакеты... по локальной сети умного дома))
два таймера (16 битный - таймер_1) и (8 битный - таймер_0) позволяют более гибко настраивать разные режимы работы моего приёмника и т.д. и т.п.
я не делаю что-то одно)) я делаю всё универсальным))
Re: Прием команд с ик-пультов.
И в этом случае достаточного одного таймера. Но ТС вроде не спрашивал про возможность приёма данных из локальной сети Вашего дома, или я ошибаюсь?
Re: Прием команд с ик-пультов.
о чем спрашивал ТС... нам расскажет сам ТС )) ТС говорить умеет...
сурдопереводчик нам не нужен))
Добавлено after 27 minutes 58 seconds:
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4575871#p4575871"]Есть ли пример кода на C, только без библиотек.[/uquote]
Есть.
допустим сделаем на таймере_0:
-берём 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
всё просто))

на выходе имеем 4 байта данных: 00 FF 01 FE
где:
07h - адрес устройства (SAMSUNG).
07h - адрес устройства (SAMSUNG).
68h - адрес команды (номер кнопки).
97h - инверсия адреса команды (номер кнопки).
все кнопки уже подписаны))
сурдопереводчик нам не нужен))
Добавлено after 27 minutes 58 seconds:
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4575871#p4575871"]Есть ли пример кода на C, только без библиотек.[/uquote]
Есть.
допустим сделаем на таймере_0:
-берём 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
всё просто))
на выходе имеем 4 байта данных: 00 FF 01 FE
где:
07h - адрес устройства (SAMSUNG).
07h - адрес устройства (SAMSUNG).
68h - адрес команды (номер кнопки).
97h - инверсия адреса команды (номер кнопки).
все кнопки уже подписаны))
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Прием команд с ик-пультов.
roman.com, о, а вот так уже гораздо понятнее и приятнее. Спасибо, плагиатить не буду, а вот как пример себе пометочку сделаю. Для моих задач в коде конечно лишнего много, но сам смысл понятен. 
Не важно чем все начнется. Важно чем кончится!


