Например TDA7294

Форум РадиоКот • Просмотр темы - ИК протокол NEC
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 15:47:03

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 59 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 02:06:05 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 1
Ну вот, домучил, обработку IR NEC, вот что получилось:
Спойлер
Код:
//***************************************************************************************************************************
//БИБЛИОТЕКА ОБРАБОТКИ СИГНАЛА ИК ПУЛЬТА ДИСТАНЦИОННОГО УПРАВЛЕНИЯ СТАНДАРТА NEC
//для частоты контроллера 8000000 Hz
//при работе IR NEC задействован таймер\счетчик T0.
//выход IR сенсора подать на внешнее прерывание INT0
//программа создана SHADS

//НАСТРОЙКА ПОРТА И ВЫВОДА IR СЕНСОРА
#define IR_NEC_PORT    PORTD
#define IR_NEC_DDR    DDRD
#define IR_NEC_Line    (1<<2)


//***************************************************************************************************************************
//переменные и флаги библиотеки
char IrNecData [4];                //массив байтов для приема данных
char IrNecCounBites;            //счетчик принятых битов данных

volatile char IrNecFlags;        //байт флагов
#define bIrNecStreamEnb    (1<<0)    /*флаг наличия запущеннного процесса приема серии*/
#define bIrNecRcvCmpltd    (1<<1)    /*флаг завершения приема данных*/
#define bIrNecTmrOvf     (1<<2)    /*флаг фиксации переполнения счетчика\таймера*/


//***************************************************************************************************************************
//инициализация работы библиотеки
void IrNecInit (void)
{
    //настройка порта
    IR_NEC_DDR &= ~IR_NEC_Line;    //линия на ввод
    IR_NEC_PORT |= IR_NEC_Line;    //включить подтяжку

    //Настройка таймера/счетчика T0
    TCCR0 = 0x05;                 //настройка тактирования T0 (0x01-clk, 0x02-clk/8, 0x03-clk/64, 0x04-clk/256, 0x05-clk/1024)    
    TIMSK |= (1<<TOIE0);        //включить прерывание по переполнению T0

    //Настройка внешнего прерывания
    GICR  |= (1<<INT0);            //включить внешнее прерывание с вывода INT0
    MCUCR |= (1<<ISC01);         //генерация прерывания по спадающему фронту 
}


//***************************************************************************************************************************
//проверка готовности данных IR NEC
//ЗНАЧЕНИЕ - результат проверки на готовность принятых данных к чтению (0x00 - данные не готовы, 0xFF - данные готовы)
//ВАЖНО!!!!! если с помощью этой функции определено что имеются поступившие данные, то следом необходимо вызвать
//функцию чтения команды IrNecCommandGet (), (или сначала IrNecDevNumGet (), а потом IrNecCommandGet ()), 
//только после этого может быть принята следующая команда.
char IrNecDataCheck (void)
{
    if (IrNecFlags & bIrNecRcvCmpltd)
        return 0xff;
    return 0x00;
}


//***************************************************************************************************************************
//чтение данных адреса IR NEC
//ЗНАЧЕНИЕ - номер адресуемого устройства.
unsigned char IrNecDevNumGet (void)
{
    volatile char* pAddr = &IrNecData[0];            //адрес байта номера устройства в буфере данных
    return *pAddr;
}


//***************************************************************************************************************************
//чтение данных команды IR NEC
//ЗНАЧЕНИЕ - принятая команда.
//ВАЖНО!!!!! также тут происходит сброс флага наличия готовых данных bIrNecRcvCmpltd,
//если с помощью функции IrNecDataCheck() определено, что данные готовы,
//то пока не будет вызвана функция IrNecCommandGet (), новые данные не будут приниматся!
unsigned char IrNecCommandGet (void)
{
    volatile char* pCommand = &IrNecData[2];        //адрес байта команды в буфере данных
    IrNecFlags &= ~bIrNecRcvCmpltd;                    //сброс флага окончания приема данных
    return *pCommand;
}


//***************************************************************************************************************************
//Внешнее прерывание INT0 (по спаду сигнала)
ISR (INT0_vect)
{
    uint8_t val = TCNT0;                            //копируем и обнуляем счетчик таймера
    TCNT0 = 0;
    char flags = IrNecFlags;                        //копия флагов из волатильной переменной (для увеличения скорости работы )
    if (flags & bIrNecRcvCmpltd)                    //если предыдущие данные не обработаны - выход
        return;                                        //флаг сбрасывается функцией забирающей данные

    //проверка на переполнение
    if (flags & bIrNecTmrOvf){                        
        flags 
&= ~(bIrNecTmrOvf | bIrNecStreamEnb);    //сбросить флаги переполнения и приема (т.е. начать с начала)
        IrNecFlags = flags;
        return;
    }

    //проверка на заголовок пакета
    if ((val > 70) && (val < 140)){                    //105 - длительность периода импульса старта (берем шире 70 - 140)
        IrNecCounBites = 0;                            //обнулить счетчик принятых битов
        flags |= bIrNecStreamEnb;                    //установить флаг приема
        IrNecFlags = flags;                
        return
;
    }    

    
//если прием активен (т.е. заголовок пакета уже был)
    if (flags & bIrNecStreamEnb){                    
    
        
//проверка на правильность длины импульса
        if ((val < 6) || (val >= 24)){                //ошибочный размер периода
            flags &= ~bIrNecStreamEnb;                //сбросить флаг приема (т.е. начать с начала)
            IrNecFlags = flags;    
            return
;
        }

        //вычисляем место в буфере, куда поместим принятый бит
        char* pIrNecData = IrNecData + (IrNecCounBites >> 3);    
        char BitNum 
= 0x80 >> (IrNecCounBites & 0x07);
        if (val >= 12)                                                
            
*pIrNecData |= BitNum;                    //принятый бит = 1 (бит = 1 если значение 12-23)    
        else
            
*pIrNecData &= ~BitNum;                    //принятый бит = 0 (бит = 0 если значение 6-11)
            
        
//проверка, принята ли вся серия IR NEC
        if (++IrNecCounBites == 32){                //приняты все 32 бита    
            if ((char)~IrNecData[0] == IrNecData[1]){        //сравниваем прямую и инверсную части адреса устройства
                if ((char)~IrNecData[2] == IrNecData[3])    //сравниваем прямую и инверсную части команды

                    //данные верны - установить флаг наличия готовых данных    
                    flags |= bIrNecRcvCmpltd;        
            
}

            flags &= ~bIrNecStreamEnb;                //сбросить флаг приема (т.е. начать с начала)
            IrNecFlags = flags;    
        
}
    }
}


//***************************************************************************************************************************
//Прерывание по переполнению T0
ISR (TIMER0_OVF_vect)
{
    IrNecFlags |= bIrNecTmrOvf;                        //флаг переполнения
}


//***************************************************************************************************************************   


Пока что для одной частоты (8000000) и константы заданы жестко. Потом надо будет докумекать автоматический рассчет для разных частот.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 22, 2013 10:45:32 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
    //Настройка таймера/счетчика T0
    TCCR0 = 0x05;                 //настройка тактирования T0 (0x01-clk, 0x02-clk/8, 0x03-clk/64, 0x04-clk/256, 0x05-clk/1024)    
    TIMSK |= (1<<TOIE0);        //включить прерывание по переполнению T0

У вас тут получается частота 8мгц/256/1024=30Гц? Разве не нужно чтобы было 36кГц? или я что-то не так понял

    //Настройка внешнего прерывания
    GICR  |= (1<<INT0);            //включить внешнее прерывание с вывода INT0
    MCUCR |= (1<<ISC01);         //генерация прерывания по спадающему фронту 

и вот тут происходит внешнее прерывание, а где обработчик прерывания для него? а то немного не пойму принцип подсчета длины импульса у вас. (с прерываниями у меня вообще туго, кажется, что вот наконец-то понял, но увижу чуть другой пример и опять теряюсь)


А так в общем классно, но для меня еще сложновато. И кварц в приемнике у меня 12МГц((
В какой программе вы пишите? Я начал с codevision и там по-мойму биты в байте задаются самостоятельно, т.е. нельзя вписать просто его название и что он устанавливается в 1, нужно знать его номер и там уже ставить единичку. Или я просто еще не дошел до урока где это описывается))

Вообще если в 2 словах то принцип передачи по ик таков: на ножке задаем шим несущей частоты и потом для передачи делаем так, что он то есть определенный промежуток времени, когда идет передача определенной команды команды, то его нет, когда ничего не передается?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 22, 2013 13:11:39 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Alkarax писал(а):
У вас тут получается частота 8мгц/256/1024=30Гц? Разве не нужно чтобы было 36кГц? или я что-то не так понял
Дело в том, что в вашем коде реализован и прием и передача, и 36000 нужны только для передачи.....
А в моем коде реализован только прием, и речь идет о стандарте NEC (какой у вас стандарт реализован не знаю).
Хочу в своей передачу тоже реализовать, посмотрю вашу, мож быстрей получится.....


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 22, 2013 16:20:03 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Alkarax писал(а):
где обработчик прерывания?
Чуть ниже
Код:
//Внешнее прерывание INT0 (по спаду сигнала)
ISR (INT0_vect) 


Alkarax писал(а):
кварц в приемнике у меня 12МГц((
Ды не сложно на несколько ходовых частот рассчитать..... сделаем.

Alkarax писал(а):
В какой программе вы пишите? Я начал с codevision и там по-мойму биты в байте задаются самостоятельно, т.е. нельзя вписать просто его название и что он устанавливается в 1, нужно знать его номер и там уже ставить единичку. Или я просто еще не дошел до урока где это описывается))
Я пишу в AVRStudio4, советую тоже перейти на студию.....

Alkarax писал(а):
Вообще если в 2 словах то принцип передачи по ик таков: на ножке задаем шим несущей частоты и потом для передачи делаем так, что он то есть определенный промежуток времени, когда идет передача определенной команды команды, то его нет, когда ничего не передается?
Именно так и попробую заварганить.....


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 17:37:19 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Уже мозги сломал, но все никак не получается. Настроил приемник так, чтобы когда сигнал есть горел светодиод, пытаюсь задать пульту несущую частоту, по идее когда она появится, то на приемнике светодиод засветится. Пробую сделать так, чтобы было 36кгц вроде бы правильно, но не светится, и методом тыка в codevision сгенерировал такую програмульку
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x6C;
TCNT2=0x00;
OCR2=0xDE;

и о чудо, светодиод на приемнике начал постоянно светится, результат вроде бы есть, но теперь я окончательно запутался, ведь частота совсем не та, которая нужна. К стати на пульте частотак мк8МГц


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 20:01:45 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Скажи, пожалуйста вот этот код правельный? Он генерирует на выходе OC2 36кГц?
#include <avr/io.h>

void init_pwm (void) //программа инициализации шима

{
TCCR2|=(1<<FOC2)|(1<<CS20)|(1<<COM20)|(1<<WGM21); //тактировать с делителем 1,состояне ОС2 мняется на против-е при совпадении, вкл режим стс
TCNT2=0; //просто обнулил счетный регистр
OCR2=0b01101111; //при достижении этого значения(111) в счетном регистре будет сброс и переключение ОС2
}
int main(void)
{
DDRB|=(1<<3); //установка ОС2 на выход

init_pwm();

while(1)
{}

return 1;}


У меня почему то при его заливке светодиод на приемнике 1 раз моргает ярко, хорошо и гаснет. Если сбросить мк пульта, на приемнике опять 1 раз моргает и все.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 20:38:45 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Да правильно генерит.....

Изображение


Alkarax писал(а):
У меня почему то при его заливке светодиод на приемнике 1 раз моргает ярко, хорошо и гаснет. Если сбросить мк пульта, на приемнике опять 1 раз моргает и все.
Скорее всего, это нормальное явление, т.к. частота 36000 должна модулировать полезный сигнал, тогда сенсор его обрабатывает нормально, а если постоянно подать 36000 то я чет так смутно припоминаю сто сенсор так и должен себя вести.....


Вложения:
pg1.jpg [32.83 KiB]
Скачиваний: 6606
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 20:56:15 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
А как ее теперь сделать полезной, то есть вклчить на 20мкс например? Или вообще как ее включать только по требованию на определенный промежуток времени?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 21:06:19 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Alkarax писал(а):
А как ее теперь сделать полезной, то есть вклчить на 20мкс например? Или вообще как ее включать только по требованию на определенный промежуток времени?

Ща попробую.
Ты в чем проверяеш, в железе? какой контроллер? что вообще есть, отдельно контроллер на передатчик и отдельно на приемник?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 21:52:18 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Пульт: Atmega8L-8,работает от внутреннего генератора 8МГц, ик диод повешан на PB3. PC0, P2, PC3, PC4-кнопки и на PD2-светодиод, повесил чтобы кнопки проверять, иногда бывает, что работают с глюками.

Приемник: Atmega8-16 c кварцем на 12МГц, на PD2(INT0) - TSOPxx36(вообще какой-то неизвестный аналог, но работает так же) PD0,PD1-светодиоды.

А так мне не важно на примере чего, мне главное узнать как задать именно так, чтобы по нажатию кнопки у меня "вылетел" сигнал продолжительностью такой какой я захочу, ну чтобы для каждой кнопки потом что-нибудь придумать свое(не хочу париться с разными протоколами для 4х кнопок, просто на каждую разную длительность сигнала повешу и все).

Нашел даташит на TSOP, оказалось верно, если несущая не прерывает определенное время, то она подавляется как шум.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 22:18:37 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Alkarax писал(а):
не хочу париться с разными протоколами для 4х кнопок, просто на каждую разную длительность сигнала повешу и все.

Нене.... ты это брось, по взрослому сделаем... да в принципе уже готово, ща только под твои моменты подкорректирую.....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 22:59:15 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Ну вот лови.

Нажимаеш кнопочку а приемник светиками (на пол секунды) должен показать номер кнопки.
Единственное у меня в приемнике светики к другому порту подключены, но там и сам можеш исправить как надо.....

Передача и прием идут по полноценному протоколу NEC, так что можеш и любой пульт под это дело заюзать. Я у себя проверил, из 20 валяющихся пультов, почти все протокола NEC, пару штук какого то сониевского, и ни одного стандарта RC5.....

В принципе в передатчике я сделал две функции - вкл частоту и выкл частоту, так что можеш и свой протокол смастерить, просто паузы выдерживаеш между вызовами этих функций и все.... Например "включить_частоту", "пауза_100_мс", "выключить_частоту" ну и т.д.

Изображение


Вложения:
IR_NEC_Test.7z [18.51 KiB]
Скачиваний: 818
sh1.jpg [79.62 KiB]
Скачиваний: 6959
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 23:38:53 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Включил так как я писал выше, задержка, TCCR2 = 0 - выключил, все, послал сигнал длины какой хотел, :shock: неужели все так просто, блин я чего только не передумал уже, а оно вот под носом было.
Ну теперь нужно разбираться с приемом, там думаю посложней. Большое спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 23:43:48 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Ну вот например как получить частоту 36 КГц, модулированную частотой 1 КГц.

Код:
//файлы
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>


//настройка портов
#define IR_PORT     PORTB    
#define IR_DDR         DDRB
#define IR_HF_Line     (1<<3)


//объявления функций
void FreqOn  (void);
void FreqOff (void);


//основная программа
int main (void)
{
    IR_DDR |= (IR_HF_Line);                    

    while 
(1){

        FreqOn ();                        //включить генерацию
        _delay_us (500);                //ждем 0,5мс
        FreqOff ();                        //выключить генерацию
        _delay_us (500);                //ждем 0,5мс

    }
}


//включение частоты 36000 Hz
void FreqOn (void) 
{
    TCCR2 = (1<<FOC2)                    //принудительное изменение состояния вывода при совпадении
    |(1<<CS20)|(0<<CS21)|(0<<CS22)        //прямое тактирование от генератора
    |(1<<COM20)|(0<<COM21)                //состояние вывода меняется на противоположное
    |(0<<WGM20)|(1<<WGM21);             //режим CTC (сброс при совпадении)

    TCNT2 = 0;                             //просто обнулил счетный регистр
    OCR2 = 0b01101111;                     //при достижении этого значения(111) в счетном регистре будет сброс и переключение ОС2
}


//выключение частоты 36000 Hz
void FreqOff (void) 
{
    TCCR2 = 0;                            //выключить генератор 36000 Hz
    IR_PORT &= ~IR_HF_Line;                //высокочастотный вывод сбросить
}
 


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 23:46:13 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Все, с передачей понятно стало, прям по полочкам разложилось все сразу.
Только не пойму
IR_PORT &= ~IR_Line; //сбросить прямой вывод
IR_PORT |= IR_Line; //установить прямой вывод
это что и зачем вообще?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Пт мар 22, 2013 23:51:46 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Alkarax писал(а):
Все, с передачей понятно стало, прям по полочкам разложилось все сразу.
Только не пойму
IR_PORT &= ~IR_Line; //сбросить прямой вывод
IR_PORT |= IR_Line; //установить прямой вывод
это что и зачем вообще?


Это вывод имитирующий сигнал с TSOP, например его можно подать на вход приемника в протеусе и настраивать работу совместно передатчика и приемника. (короче сигнал без наполнения 36КГц)

Если с протеусом не балуешся, можеш выбросить все что с этим связано


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Сб мар 23, 2013 00:00:29 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Ясно, еще раз спасибо. Прям я поражен неделю хожу вокруг да около с этим пультом, а подумать, что все так просто не мог, сидел про прерывания про шим про счетчики читал кучу всего, оказывается несущую я уже давно понял как сделать, но незная что она не принимается постоянно, а только в самом начале 1 раз моргает, я думал что не получилось у меня.

Теперь про прием: :)) (достал уже навеное) У вас при первом же импульсе идет внешнее прерывание по INT0, а вот сколько оно длилось, то есть те самые тики вы как считаете? Другой таймер запускается внутри прерывания? Или он вообще всегда работает а внутри прерывания передает значение между прерываниями, т.е. между первым "импульсом старта" и последующими, а сколько длится само прерывание не важно?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Сб мар 23, 2013 00:18:11 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Alkarax писал(а):
Теперь про прием: :))

Тут действительно все сложнее.....

Словами сразу сложновато описать, почитай про протокол NEC, посмотри на мою библиотечку декодирования, там достаточно хорошо все закомментировано, и постепенно въедеш, шо называется.....

Изображение


Вложения:
строение команд ИК пульта.gif [61.98 KiB]
Скачиваний: 7085


Последний раз редактировалось shads Сб мар 23, 2013 00:40:04, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Сб мар 23, 2013 00:22:03 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт мар 21, 2013 16:22:09
Сообщений: 27
Рейтинг сообщения: 0
Это конечно понятно, что ничего так сразу не понять, поэтому я и задал вопрос-основу. Как считать тики? Внутри внешнего прерывания? Между прерываниями? Или еще как-нибудь?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ИК протокол NEC
СообщениеДобавлено: Сб мар 23, 2013 00:38:29 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 1
Alkarax писал(а):
Это конечно понятно, что ничего так сразу не понять, поэтому я и задал вопрос-основу. Как считать тики? Внутри внешнего прерывания? Между прерываниями? Или еще как-нибудь?

Один таймер всегда включен. Предделитель таймера выбран так, чтобы при самом длинном импульсе (стартовый импульс = 13,5мс) он не переполнялся.
Переполнение таймера (отдельное прерывание) означает, что полезного сигнала нет и происходит инициализация всех переменных.

Когда приходят импульсы посылки, то по каждому падающему фронту происходит прерывание (меряем длину периода импульсов), в прерывании проверяется счетчик (и тут же сбразывается на 0 чтобы потом мерять следующий имп), если счетчик в разумных пределах, то происходит дальнейшая обработка, если вне разумных пределов - инициализация.

Если счетчик насчитал около 13,5 мс (тики рассчитываются) это означает что сейчас должен пойти пакет данных.
Во время приема пакета данных смотрим длину поступающих импульсов и относительно некоего порога определяем что это 1 или 0 и записываем в буфер.
После приема 32-х бит данных, (с учетом что все временные параметры импульсов были корректны) проверяем корректность посылки, 1-й байт это инвертированный 0-й, а 3-й байт это инвертированный 2-й (речь сейчас о протоколе NEC), если все верно, выставляем флаг наличия данных, и ждем пока основная программа их заберет.

Как то так.....


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 59 ]  1, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y