Например TDA7294

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

Текущее время: Пт ноя 21, 2025 00:21:11

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


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



Начать новую тему Ответить на тему  [ Сообщений: 45 ]    , 2,  
Автор Сообщение
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 04, 2009 09:00:27 
Модератор
Аватар пользователя

Карма: 27
Рейтинг сообщений: 58
Зарегистрирован: Пн апр 03, 2006 11:43:25
Сообщений: 4517
Откуда: Санкт - Петербург
Рейтинг сообщения: 0
Медали: 3
Получил миской по аватаре (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Дык а что задумывалось-то? И какие результаты? По Файлам Вашим не сильно ясно. Если работает нестабильно, можно попробовать поиграться значениями "тиков" таймера для распознавания, обычно помогает.

_________________
Оптимизм х (Опыт + Знания) = const


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 04, 2009 17:45:35 
Поставщик валерьянки для Кота

Карма: 11
Рейтинг сообщений: 58
Зарегистрирован: Пт окт 31, 2008 09:38:55
Сообщений: 1957
Откуда: Одесса
Рейтинг сообщения: 0
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#)


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 06, 2009 20:55:53 
Модератор
Аватар пользователя

Карма: 27
Рейтинг сообщений: 58
Зарегистрирован: Пн апр 03, 2006 11:43:25
Сообщений: 4517
Откуда: Санкт - Петербург
Рейтинг сообщения: 0
Медали: 3
Получил миской по аватаре (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Выкладывайте, почему нет? Пригодится. Можно сюда, потом перенесем, когда организуется раздел для этого.

_________________
Оптимизм х (Опыт + Знания) = const


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 09, 2009 11:20:47 
Поставщик валерьянки для Кота

Карма: 11
Рейтинг сообщений: 58
Зарегистрирован: Пт окт 31, 2008 09:38:55
Сообщений: 1957
Откуда: Одесса
Рейтинг сообщения: 0
Вот обещянные наработочки

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

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

Спасибо, кому-нибудь обязательно пригодится. Aheir


Последний раз редактировалось clawham Ср мар 02, 2011 21:00:54, всего редактировалось 1 раз.

Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 16, 2009 17:49:32 
Открыл глаза

Зарегистрирован: Вс сен 27, 2009 19:52:35
Сообщений: 40
Откуда: Тирасполь
Рейтинг сообщения: 0
Раскажите пожалуйста как вы расчитываете значение таймера вот в этой строке
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/


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 16, 2009 20:59:27 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
В общем, получилось что код несколько эволюционировал. Потребовалось получить несколько более удобный вариант декодера, в котором основная обработка вынесена из обработчика. Более того, прерывания вовсе не обязательны. В большинстве случаев можно обойтись проверкой флагов. Громоздкий приемный буфер заменен на одно интовое число-приемник. Приемный модуль оформлен в виде .с-модуля (некий аналог плюсового класса) и .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). Суть в том, чтобы приемной функции передавать время между фронтами, сразу (или почти сразу) после событий этих фронтов. И все. В общем, сами посмотрите...


Вложения:
Комментарий к файлу: RC5 module
rc5reciver.rar [1.75 KiB]
Скачиваний: 362

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вс авг 15, 2010 11:28:58 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
Помогите пожалуйста с кодом. RC-5. Для ATmega8535, 4МГерц. ИК-приемник посадить на PD2.http://www.docme.ru/doc/1887/dokument-microsoft-office-word-%282%29


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 17, 2010 15:40:39 
Модератор
Аватар пользователя

Карма: 27
Рейтинг сообщений: 58
Зарегистрирован: Пн апр 03, 2006 11:43:25
Сообщений: 4517
Откуда: Санкт - Петербург
Рейтинг сообщения: 0
Медали: 3
Получил миской по аватаре (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
и шо Ви хотите?)

_________________
Оптимизм х (Опыт + Знания) = const


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 17, 2010 21:50:03 
Родился

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Пн авг 23, 2010 22:29:00 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
Помогите с кодом. Не работает...


Код:
/*****************************************************


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;
             
           
             
           
           
          };
         
  }


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Пн авг 23, 2010 22:32:28 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
Выводит цифру один на индикатор при любой команде, принятой с пульта...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Пн авг 23, 2010 23:23:48 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
То что написали, то и делает... Подсказка - чему у вас равны PTR и PTR1? И как они модифицируются? А вообще, с индикацией, конечно, мрак....

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 08:09:39 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
В конце функции main написано:
Код:
PTR=0;
PTR1=0;

while(1)
{
if (command>0)PTR=1;
}
}

Ну, индикация нормально работает...Сейчас она исправно ноли выдает...Проблема в том что она от принятого кода RC5 не зависит...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 08:22:31 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
Я не уверен что я правильно MCUCR настроил, я не знаю каким должно быть прерывание INTO по фронту, по спаду, по низкому уровню или по любому изменению...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 10:20:28 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
Так а что она должна еще выдавать?
Код:
PORTC=CODE_TABLE[PTR];
...
PORTC=CODE_TABLE[PTR1];

Где PTR всегда 1, а PTR1 всегда ноль. Вот одно и тоже и выводится. Здесь нужно модифицировать PTR в зависимости от кода команды. То что вы сделали
Код:
if (command>0)PTR=1;

Показывает что вы совершенно не понимаете сути преобразования в семисегментный код, что и зачем делается. Исходников на эту тему много, ищите...

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 10:50:21 
Родился

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 10:52:23 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
PTR выводится в один разряд индикатора, а PTR1 выводится в другой разряд индикатора, так что они не пересекаются...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 11:56:07 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
Да каким же образом она просигналит??? Всегда будет гореть 0 и 1. Что же непонятного? Переписывайте код...

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 14:15:18 
Родился

Зарегистрирован: Вс авг 15, 2010 11:10:46
Сообщений: 10
Рейтинг сообщения: 0
Ну, понятно, что я не спец в программировании, поэтому и задаю "такие" вопросы...Но у меня на индикаторе высвечивается не один-ноль, у меня на индикаторе "ноль-ноль", если бы там появилась единица, я бы не задавал никаких вопросов...Я бы сделал вывод что RC5 принимает, а сейчас я делаю вывод что у меня или неправильно настроен RC5 или я не могу связать его с индикацией...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некоторые протоколы ИК-пультов. Часть вторая
СообщениеДобавлено: Вт авг 24, 2010 14:29:07 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
capucin20 писал(а):
...Но у меня на индикаторе высвечивается не один-ноль, у меня на индикаторе "ноль-ноль", если бы там появилась единица, я бы не задавал никаких вопросов....

А не легче в обработчике при успешном приеме светодиод поджигать? И таймер1 пока выключить нафиг....

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


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

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


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

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


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

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


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