Некоторые протоколы ИК-пультов. Часть вторая

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Дык а что задумывалось-то? И какие результаты? По Файлам Вашим не сильно ясно. Если работает нестабильно, можно попробовать поиграться значениями "тиков" таймера для распознавания, обычно помогает.
Оптимизм х (Опыт + Знания) = const
Реклама
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

d jобщем лема в том что вот код прерывания

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

interrupt [EXT_INT2] void ext_int2_isr(void)
    {
    PORTC.0 = 1;
    TCCR0=0x05;
    /*
    if(first_int)
    {
        first_int = 0;
        TCNT0 = 0;
        start_cond = 0;
        repeat_cond = 0;
        tick = 0;
        x=1;
        y=1;
        PORTC.0=0;       
    }
    */
    
    tick = TCNT0;
    
    // типа вывод таймингов
    if(ShowTiming)
    {
        lcd_gotoxy(x, y-1);
        sprintf(a2, "%i",tick);
        lcd_putstr(a2);
        
        x+=14;
        if(x>=84)
        {
            y+=1;
            x=1;
        }
        if(y>7)
        {
            y=1;
            x=1;
        }
    }       
        if (tick >= st_min && tick <st_max>= rp_min && tick <rp_max>= l_min && tick < l_max && start_cond)                             //если случилось от 22 до 115 тиков
                {
                ++b_cnt;                                                        //приняли "1" и увеличили счетчик битов
                if (b_cnt < 9) addr_1 = (addr_1 <<1>= 9 && b_cnt < 17) addr_0 = (addr_0 <<1>= 16 && b_cnt < 25) cmd_1 = (cmd_1 <<1>= 24) cmd_0 = (cmd_0 <<1>= s_min && tick < s_max && start_cond)                              //если случилось от 10 до 21 тика
                {
                ++b_cnt;                                                        //приняли "0" и увеличили счетчик битов
                if (b_cnt < 9) addr_1 = (addr_1 <<1>= 9 && b_cnt < 17) addr_0 = (addr_0 <<1>= 16 && b_cnt < 25) cmd_1 = (cmd_1 <<1>= 24) cmd_0 = (cmd_0 << 1);
                }
        TCNT0 = 0;                                                              //обнулили тики
        if (b_cnt == 32)                                                        //если приняли уже 4 байта
                {
//                 if ((addr_1+addr_0) == 0xFF) addr = addr_0;                  //закомментировано, потому как в пульте First
//                         else addr = 0;                                       //16-bit адрес 0x6120, т.о. проверка адреса не проходит
                if ((cmd_1 + cmd_0) == 0xFF) cmd = cmd_1;                       //проверили правильность приема команды
                        else cmd = 0;        
                b_cnt = 0;                                                      //обнулили счетчик битов
                start_cond = 0;                                                 //сбросили стартовое условие
                repeat_cond = 0;
                TCCR0=0x00;                                                     //остановили таймер
                TCNT0=0x00;
                first_int = 1;
                printf("addr = %i ... cmd = %i \n\r" , addr_1, cmd_1);
                x=1;
                y=1;
               }  
PORTC.0 = 0;                                                              
    }
И вродебы всё работает правильно когда я клацаю пультиком и ShowTiming = 1 - тоесть результаты замеров длительности импульсов выводятся на экран(вроде бы и очень быстро выводится но вёравно время какое-то есть) а вот как только выключаю вывод отладочной инфы на экран - сразу всё прекращяется, лампочка которую я в начале прерывания зажигаю а потом в конце тушу - горит заметно меньшее время - ибо не надо выводить на экран цыфру значения таймера.
но вот в принципе ж то на периодичность импульсов это не влияет и обработка прерывания вродебы 200 раз успевает закончиться к моменту прихода следующего импульса с ТСОПА.....а в уарт всётаки перестают кидаться адреса и коды кнопок....
и ещё странность - у меня есть пара пультиков от нагревателя (а-ля китайский кондиционер) и от колонок 5.1 Люксеон - так вот пультик от нагревателя в адресе имеет 1 а коды 28 64 125 240 254 - ну это ладно но а как обьяснить что пультик от колонок адрес имеет 0? это разве реально такой адрес? пультики от ТВ у меня сони так что пробывать смысла нет :)
не могу никак понять.....значения таймингов у меня в еепроме валяются:

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

eeprom unsigned char l_min = 19;                     //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс 
eeprom unsigned char l_max = 22;
eeprom unsigned char s_min = 2;                     //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
eeprom unsigned char s_max = 6;
eeprom unsigned char st_min = 180;                     //диапазон для "старт" интервала в посылке, в "тиках" таймера, 0,704..1,088мс
eeprom unsigned char st_max = 210;
eeprom unsigned char rp_min = 160;                     //диапазон для "Повтор" интервала в посылке, в "тиках" таймера, 0,704..1,088мс
eeprom unsigned char rp_max = 170;
и я могу их изменять на ходу не перепрошивая камня - через менюшку ком порта но...блин....оно-то и работает....пока включен вывод на экран....проверенно - это не изза общих переменных и т.д. ибо первый раз я обрадовавшить заремил этот кусочек и прошив офигел что не работает не поверив своим глазам сделал вывод по условию которое менюшкой из ком порта менять можно и оказалось таки да :(((
может переменные границ интервалов сделать нормальными переменными и обновлять их из еепром только при старте системы?

Оказывается причина проста - изза маханькой задержки длинный стартовый импульс в 210 тиков таймера ставал ещё бОльшим в тиках так как при отсутствии задержки на вывод таймер быстрее обнулялся в прерывании и как следствие переполнение таймера :)
ввел дополнительную переменную и по переполнению таймера увеличивал её а по переполнении и переменной - глушу таймер и обнуляю переменную :) вот собственно и всё
Если кому нужны исходники на мегу 16 в которых организована работа с ds18b20 в скоростном режиме(вне зависимости от количества термометров скорость обновления 2 раза в секунду), работа с LCD nokia 3310 + знакосинтезатор, работа с ком-портом(буферизированный приём, менюшка, примеры работы с констанмами, регулирование яркости с запоминанием и т.д.) + работа с ИРДА пультиками (и показан пример как поморгать лампочками )
могу выложить
Исходники на CodeVisionAVR C
+ написанная собственноручно прога для получения по кому данных о температурах и вывод её на экран + рисование графика с маштабируемостью и сохранением накопленных данных на винт(тоже с исходниками на VisualStudio C#)
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Выкладывайте, почему нет? Пригодится. Можно сюда, потом перенесем, когда организуется раздел для этого.
Оптимизм х (Опыт + Знания) = const
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Вот обещянные наработочки

конечно я всё делал под себя но...в принципе-то зарисовочки для будущих паятелей полезные :)

http://clawham.hopto.org/DriveD/PubD/51/

Спасибо, кому-нибудь обязательно пригодится. Aheir
Последний раз редактировалось clawham Ср мар 02, 2011 21:00:54, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Masterskaia
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс сен 27, 2009 19:52:35
Откуда: Тирасполь
Контактная информация:

Сообщение Masterskaia »

Раскажите пожалуйста как вы расчитываете значение таймера вот в этой строке
TCCR0 = 0x04;
Я собрал приёмник на Atmega8 использовал Т0. Значение интервалов первоначально были вот такими:
l_min 40
l_max 68
s_min 22
s_max 34
Не заработало. После смены значений на такие
l_min 90
l_max 200
s_min 40
s_max 70
с третьего нажатия кнопки появлялся результат но соответсвенно постоянно разный. Теперь я думаю, что у меня просто не правильно выставлена частота таймера. Использую кварц 8 мГц. Научите меня расчитывать эту самую частоту. и как правильно расчитать эти самые "тики".
Это только кусок железа но и оно требует уважения.
http://www.radiomaster.info/
Реклама
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

В общем, получилось что код несколько эволюционировал. Потребовалось получить несколько более удобный вариант декодера, в котором основная обработка вынесена из обработчика. Более того, прерывания вовсе не обязательны. В большинстве случаев можно обойтись проверкой флагов. Громоздкий приемный буфер заменен на одно интовое число-приемник. Приемный модуль оформлен в виде .с-модуля (некий аналог плюсового класса) и .h-интерфейса. Компилятор - GCC под Студией.
Отказ от прерываний позволил успешно интегрировать модуль в такую критичную по времени систему как USB-AVR одновременно с аналогичным модулем для трех разновидностей nec-протокола. (для примера, исходники nec-приемника приведены здесь - CVAVR).
Пример использования приемника RC5 в основном модуле (main) - ключевые моменты:

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

//...остальные хидеры
#include "rc5reciver.h"
...
//инициализация:
PORTD|=(1<<PD3); //подтяжка на приемный пин
/*прерывание инт1 сконфигурировано на любое изменение уровня, но не разрешено */
MCUCR=0x04;
GIFR=0x80;
...
int main(void)
{
//---------Локальные переменные---------//
uchar fl_change=0;   //флаг события фронта
uchar fl_begin_ir=0; //флаг начала посылки
uchar time_front=0;  //время между фронтами, в тиках таймера
struct ir_code ir_code;            //тут храним структуру посылки
//--------------------------------------//   
...
 for(;;){
//----обработчик переполнения таймера - это можно и в обработчик
//(только без условия). Плюс тогда надо сделать флаг глобальным
if (TIMER0_OVERFLOW){ 
            	      T0_STOP;
                        TCNT0=0x00;
                        fl_begin_ir=0;
			reset_rc5();
                        CLEAR_FL_T0_OVERFLOW;                                        
                        LED_OFF;
  		        }
//-----------------------------------------------------------
//--------обработчик изменения уровня (можно в обработчик)
if (ANY_CHANGE_INTERRUPT){ 
	uchar tcnt_t0=TCNT0; //чтобы уменьшить погрешность
      TCNT0=0x00;
     //фиксируем время между фронтами
        if(fl_begin_ir)
         {
          time_front=tcnt_t0;
          fl_change=1;
          }
         else
         {
         T0_RUN;
         time_front=0;
         fl_begin_ir=1;
	 reciever_rc5(&time_front); //здесь функция практически сразу
                                                   //завершится после входа в нее
           }	   	
	CLEAR_FL_T0_OVERFLOW; //на всякий случай очищаем флаг 
  	CLEAR_ANY_CHANGE_INTERRUPT;
		   	    	 }
//---------------------------------------------------------
//---------------------------------------------------------

 if(fl_change){//если есть измерение между фронтами
  	 fl_change=0;
	switch (reciever_rc5(&time_front))
        {
         case CONTINUE:
         break;
       
        case ERROR:
        fl_begin_ir=0;
        T0_STOP;
        TCNT0 = 0x00;
	reset_rc5();
        break;

        case RC5_CODE:
        fl_begin_ir=0;
        rc5_parser(&ir_code); //загоняем код в структуру
        //используем лежащий в структуре код
        printf ("(%d,%d,%d,%d)",ir_code.toogle,
        ir_code.device_high,ir_code.device_low,ir_code.command);
        reset_rc5();
	 break;
                    }
	        
   } 
//----------------------------------------------------------------------// 
            }
}
Сами файлы модуля прикреплены. Код выдран из рабочего проекта, поэтому желательно посмотреть внимательно перед использованием на предмет возможного наличия артефактов. Константы в хидере под частоту в 12МГц. МК - Atmega8. Подобный вариант более гибок и легок для встраивания (таймер умышленно не используется в самом модуле (только в одном месте - надо бы убрать) - если таймерных задач несколько, то дирижировать ими удобно в main). Суть в том, чтобы приемной функции передавать время между фронтами, сразу (или почти сразу) после событий этих фронтов. И все. В общем, сами посмотрите...
Вложения
rc5reciver.rar
RC5 module
(1.75 КБ) 371 скачивание
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Помогите пожалуйста с кодом. RC-5. Для ATmega8535, 4МГерц. ИК-приемник посадить на PD2.http://www.docme.ru/doc/1887/dokument-m ... rd-%282%29
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение Aheir »

и шо Ви хотите?)
Оптимизм х (Опыт + Знания) = const
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Я разобрался. Спасибо за помощь.)
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Помогите с кодом. Не работает...

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

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


Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 4,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include <mega8535.h>

unsigned char cnt_bit = 0;              //счетчик принятых бит
unsigned char code [14];                //принятый код

unsigned char counter = 0;              //"тики" таймера

#define l_min    40                     //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс 
#define l_max    68
#define s_min    22                     //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max    34

bit state =  0;                                 //флаг состояния линии приема
bit error = 0;                                  //флаг ошибки

//переменные структуры посылки, всего 14 бит
unsigned char startbit1 = 0;                    //первый стартовый бит, д.б. = 1
unsigned char startbit2 = 0;                    //второй стартовый бит, д.б. = 1                    
unsigned char toggle = 0;                       //триггерный бит, инвертируется в посылке при нажатии кнопки, при удержании - не инв.!
unsigned char address = 0;                      //адрес устройства, 5 бит
unsigned char command = 0;                      //команда (данные), 6 бит
unsigned int COUNT;
unsigned char PTR;
unsigned char PTR1;
const unsigned char CODE_TABLE[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

   
void main(void)
{


DDRA =0b11000000;
COUNT=64;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;    // очистим индикатор
    PORTD=0x00;    // установим нулевой разряд индикатора
    DDRC=0xff;    // определим PC<0> - PC<7> как выходы
    DDRD=0xff;    // определим PD<4> - PD<7> как выходы 
    PORTA=0xff;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected

OCR0=0x00;
 
    TIMSK=0b00000101;
    
    TCCR0 = 0b00000011; //останавливаем таймер
 TCNT0 = 254;
   #asm("sei")
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=254;
TCNT1L=254;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0b00000010;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0b00000101;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
 PTR=0;
 PTR1=0;

while(1) 
{
 if (command>0)PTR=1;
}
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        counter = TCNT0;                        //сохраяем значение таймера-счетчика
        TCNT0 = 0x00;                           //обнуляем таймер
        error = 1;                              //поставили ошибку - потом сбросим в теле, если все ок
               
        if (cnt_bit == 0)                       //старт посылки   
                {
                TCCR0 = 0x04;                           //запускаем таймер, частота 31250кГц (или надо править диапазоны тиков для интервалов)
                code [cnt_bit] = !PIND.2;               //записываем бит кода, PIND.2 - входная нога, прерывание 0
                cnt_bit++;                              //увеличиваем счетчик принятых бит
                state = 1;                              //ставим флаг, т.к. была 1
                }
                  
                else                                        //в других случаях (не первое срабатывание прерывания)
                        {
                        if ((counter>s_min) && (counter<s_max)) //проверка короткого промежутка
                                {
                                if (state)                      //если была 1
                                        {
                                        state = 0;              //обнуляем состояние
                                        error = 0;              //и ошибку, т.к. все корректно
                                        }
                                        else                    //если был 0
                                                {
                                                state = 1;                      //ставим флаг, т.к. теперь - 1
                                                code[cnt_bit] = !PIND.2;        //записываем данные - состояние линии
                                                cnt_bit++;                      //увеличиваем счетчик приема
                                                error=0;                        //обнуляем ошибку, т.к. все корректно
                                                };
                                };     
                   
                        if ((counter>l_min) && (counter<l_max)) //проверка длинного промежутка
                                {
                                code[cnt_bit] = !PIND.2;        //записываем данные - состояние линии
                                cnt_bit++;                      //увеличиваем счетчик приема
                                error = 0;                      //обнуляем ошибку, т.к. все корректно
                                };
                                                  
                        if (error == 1)                         //если не попали ни в один из промежутков, то 
                                {
                                char i = 0;                     //внутренняя переменная
                                
                                TCCR0 = 0x00;                   //останавливаем таймер
                                TCNT0 = 0x00;                   //обнуляем таймер
                                counter = 0;                    //обнуляем счетчик
                                cnt_bit = 0;                    //обнуляем счетчик принятых бит
                                for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
                                };
                   
                        if (cnt_bit == 14)                      //если приняли все 14 бит
                                {
                                char i = 0;                     //внутренняя переменная
                                TCCR0 = 0x00;                   //останавливаем таймер
                                TCNT0 = 0x00;;                  //обнуляем таймер
                                cnt_bit = 0;                    //обнуляем счетчик принятых бит
                                
                                startbit1 = code[0];            //первый стартовый бит
                                startbit2 = code[1];            //второй стартовый бит
                                toggle = code[2];               //триггер-бит
                                                                //формируем переменные адреса и команды
                                address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];                    
                                command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];
                                     
                                for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
                                };
                        };                                                                                
        }

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        char i = 0;                     //внутренняя переменная
        
        TCCR0 = 0x00;                   //останавливаем таймер
        TCNT0 = 0x00;                   //обнуляем таймер
        counter = 0;                    //обнуляем счетчик
        cnt_bit = 0;                    //обнуляем счетчик принятых бит
        for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
        }
        
        
interrupt[9]void timer1_overflow(void)
  {    
         
           switch (COUNT)
           {
           case 64:
           
            PORTC=0x00;
            PORTD=0b10000000;
            PORTC=CODE_TABLE[PTR];
            COUNT=128;
            TCNT1H=254;
            TCNT1L=254;
            break;
            
           case 128:  
           
            PORTC=0x00;
            PORTD=0b01000000;
            PORTC=CODE_TABLE[PTR1];
            COUNT=64;
            TCNT1H=254;
            TCNT1L=254;
            
             break; 
             
           
             
            
           
          };
          
  }
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Выводит цифру один на индикатор при любой команде, принятой с пульта...
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение Goodefine »

То что написали, то и делает... Подсказка - чему у вас равны PTR и PTR1? И как они модифицируются? А вообще, с индикацией, конечно, мрак....
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

В конце функции main написано:

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

PTR=0;
PTR1=0;

while(1) 
{
if (command>0)PTR=1;
}
}
Ну, индикация нормально работает...Сейчас она исправно ноли выдает...Проблема в том что она от принятого кода RC5 не зависит...
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Я не уверен что я правильно MCUCR настроил, я не знаю каким должно быть прерывание INTO по фронту, по спаду, по низкому уровню или по любому изменению...
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение Goodefine »

Так а что она должна еще выдавать?

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

PORTC=CODE_TABLE[PTR];
...
PORTC=CODE_TABLE[PTR1];
Где PTR всегда 1, а PTR1 всегда ноль. Вот одно и тоже и выводится. Здесь нужно модифицировать PTR в зависимости от кода команды. То что вы сделали

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

if (command>0)PTR=1;
Показывает что вы совершенно не понимаете сути преобразования в семисегментный код, что и зачем делается. Исходников на эту тему много, ищите...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Я писал с идеей что PTR и PTR1 равны нулю всегда, кроме случаев, когда command больше ноля...Любая команда должна просигналить что она принята переводом из ноля в единицу.
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

PTR выводится в один разряд индикатора, а PTR1 выводится в другой разряд индикатора, так что они не пересекаются...
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение Goodefine »

Да каким же образом она просигналит??? Всегда будет гореть 0 и 1. Что же непонятного? Переписывайте код...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
capucin20
Родился
Сообщения: 10
Зарегистрирован: Вс авг 15, 2010 11:10:46

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение capucin20 »

Ну, понятно, что я не спец в программировании, поэтому и задаю "такие" вопросы...Но у меня на индикаторе высвечивается не один-ноль, у меня на индикаторе "ноль-ноль", если бы там появилась единица, я бы не задавал никаких вопросов...Я бы сделал вывод что RC5 принимает, а сейчас я делаю вывод что у меня или неправильно настроен RC5 или я не могу связать его с индикацией...
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Некоторые протоколы ИК-пультов. Часть вторая

Сообщение Goodefine »

capucin20 писал(а):...Но у меня на индикаторе высвечивается не один-ноль, у меня на индикаторе "ноль-ноль", если бы там появилась единица, я бы не задавал никаких вопросов....
А не легче в обработчике при успешном приеме светодиод поджигать? И таймер1 пока выключить нафиг....
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Ответить

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