Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

RC5+atmega 8

Непрочитано 25.08.2012, 19:15  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от miwutka Посмотреть сообщение
tim0_ovf_cnt - 65535 хранит макс значение? Какой тип переменной, непойму ?
uint16_t tim0_ovf_cnt;//счетчик переполнений таймера 0, для вычисления больших задержек

uint16_t = unsigned int (16 бит со знаком)
Реклама:
Flopix вне форума  
Непрочитано 25.08.2012, 19:19  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от miwutka Посмотреть сообщение
переменнач cnt что считает?
cnt хранит номер принимаемого бита в ИК последовательности.
Flopix вне форума  
Непрочитано 25.08.2012, 19:26  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от miwutka Посмотреть сообщение
pulseTime , sigTime , что считают переменные?
sigArr[cnt] , testArr[cnt] , - тоже что пишеться в масив?
sigTime - время первого полупериода сигнала
pulseTime - время второго полупериода сигнала
не совсем удачно обозвал эти переменные

sigArr[cnt] , testArr[cnt] , - это для отладки в них хранил последовательности задержек.
sigArr[cnt] = sigTime;
testArr[cnt] = pulseTime;
Эти массивы можно убрать.
В прерывании по изменению сигнала потому так и много кода чтобы сэкономит ОЗУ. Значение задержек сразу же декодируется.
Flopix вне форума  
Непрочитано 25.08.2012, 19:35  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: RC5+atmega 8

PHP код:
pulseTime = tim0_ovf_cnt * 256 + TCNT0;//расчет времени между этим и предыдущим изменением сигнала на ножке с датчиком
if (VB(PIND, 3) › 0)
{//если на ножке с датчиком 0 то значит задержка которая сейчас в переменной pulseTime  отвечает за первый полупериод сигнала поэтоум копируем ее значение в sigTime 
    sigTime = pulseTime;
}
else
{//иначе задержка которая сейчас в переменной pulseTime отвечает за второй полупериод сигнала, а раз так значит импульс принят (значения хранятся в sigTime и pulseTime) и ниже происходит его обработка
...
} 
Flopix вне форума  
Непрочитано 25.08.2012, 19:42  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: RC5+atmega 8

ага понятно ... надо пробовать значит... Дальше код прожую еще, а то не пойму как срабатывает после простоя больше 20 мс... время простоя храниться же в переменной tim0_ovf_cnt. Значит когда прийдет первый полупериод импульса то умножиться время простоя на 256+TCNT0 и потом после условия запишеться в sigTime. А там дальше усливие не выполниться так как читсло будет вне диапазона (больше чем 3000).... Вот это немножко не пойму... Это я в голове и на листике просчитываю код...
miwutka вне форума  
Непрочитано 25.08.2012, 20:14  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от miwutka Посмотреть сообщение
ага понятно ... надо пробовать значит...
Не стоило обижаться. Я ведь без перехода на личности. А уже и "кента" заработал...
Нашел в своем очень древнем архиве программу, которая работала в устройстве ДУ проектора офтальмолога. Переключала слайды для показа на экране. Если сможешь разобраться, буду рад. Там это самое комментирование самодостаточно.
зы Программа абсолютно работоспособная. С небольшими модификациями в области исполнительных устройств трудится и по сей день во многих "Оптиках" нашего города.
Вложения:
Тип файла: zip RC5 decoding.zip (17.0 Кб, 112 просмотров)
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
miwutka (25.08.2012)
Непрочитано 25.08.2012, 20:18  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от ut1wpr Посмотреть сообщение
Не стоило обижаться. Я ведь без перехода на личности. А уже и "кента" заработал...
Нашел в своем очень древнем архиве программу, которая работала в устройстве ДУ проектора офтальмолога. Переключала слайды для показа на экране. Если сможешь разобраться, буду рад. Там это самое комментирование самодостаточно.
зы Программа абсолютно работоспособная. С небольшими модификациями в области исполнительных устройств трудится и по сей день во многих "Оптиках" нашего города.
Огромное спасибо это прям через чур... качну, изучу. Просто тот тип так достал не одного меня что аж пипец ))) Буду изучать два кода и выводить золотую серединку.
miwutka вне форума  
Непрочитано 25.08.2012, 20:48  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от miwutka Посмотреть сообщение
а то не пойму как срабатывает после простоя больше 20 мс... время простоя храниться же в переменной tim0_ovf_cnt. Значит когда прийдет первый полупериод импульса то умножиться время простоя на 256+TCNT0 и потом после условия запишеться в sigTime. А там дальше усливие не выполниться так как читсло будет вне диапазона (больше чем 3000).... Вот это немножко не пойму... Это я в голове и на листике просчитываю код...
Ниже расписал как работает программа при начале приема сигнала?

PHP код:
pulseTime = tim0_ovf_cnt * 256 + TCNT0;
//так как ИК приемник работает инертно то при наличии сигнала на ноге МК будет 0 
if (VB(PIND, 3) › 0)
{
    sigTime = pulseTime;
}
else
{
//соотвевенно сразу начнет выполнятся эта ветка кода
if ((cnt ‹ 100) && (sigTime › 0))
{
  //все что находится в этом блоке выполнится и что то там неправильно посчитает

  ....
  //но в конце блока идет проверка
  //isTimeout  тут будет равным 1
  if (isTimeout == 0)
  {
    cnt++;
  }
  else
  {
  //и выполнится этот блок
  //да получилось немного через одно место, можно было сделать и красивее
    cnt = 0;
    isTimeout = 0;
  }
}

//ну в ы конце значение этих переменных обнуляются и к следующему срабатыванию прерывания все будет красиво 
Flopix вне форума  
Непрочитано 25.08.2012, 20:53  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: RC5+atmega 8

ну чтото так понятно, но надо это дело отследить в железе весь код понятен, и даже очень начало интересно как проходит пока сажусь за переписывание под себя кода. Еще напишу... спасибо.
miwutka вне форума  
Непрочитано 25.08.2012, 22:11  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: RC5+atmega 8

Сообщение от Flopix Посмотреть сообщение
минимальная задержка измеряемая таймером = 0,88Мс
максимальная 88Мс (пауза между повторными посылками при зажатии кнопки)
Разница в длительности в 100 раз. Как вы предлагаете в 1 байте хранить эти задержки с достаточной точностью?
Блин, а по моим подсчётам (1/250000)*256=1,024мкс...
Сообщение от Flopix Посмотреть сообщение
1 инкремент и 2 команды сравнения это разве много?
чуть больше...
PHP код:
//подпрограмма прерывания по INT1
ISR(SIG_INTERRUPT1)
{
    pulseTime = tim0_ovf_cnt * 256 + TCNT0;
    if (VB(PIND, 3) › 0)
    {
        sigTime = pulseTime;
    }
    else
    {
        if ((cnt ‹ 100) && (sigTime › 0))
        {
            pult_bit = error_bit;
            if ((sigTime › 2100) && (sigTime ‹ 2500) && (pulseTime › 1000) && (pulseTime ‹ 1200))//старт бит
            {
                cnt = 0;
                pult_bit = start_bit;
                pult_state = PULT_NONE;
            }
            else if ((sigTime › 100) && (sigTime ‹ 200))
            {
                if ((pulseTime › 350) && (pulseTime ‹ 600))
                {
                    pult_bit = one_bit;
                }
                else if ((pulseTime › 100) && (pulseTime ‹ 200))
                {
                    pult_bit = zero_bit;
                }
                else if ((pulseTime › 23000) && (pulseTime ‹ 25000))
                {
                    pult_bit = repeat_bit;
                    pult_state = PULT_REPEAT_KEY;
                    SendPacketToUSB(1, 3);
                }
            }                
                
            sigArr[cnt] = sigTime;
            testArr[cnt] = pulseTime;
                
            if ((pult_bit == one_bit) || (pult_bit == zero_bit))
            {
                if ((cnt ›= 1) && (cnt ‹= 8))
                {
                    pult_a1 = (pult_a1 ‹‹ 1);
                    pult_a1 = (pult_a1 | pult_bit);
                }
                else if ((cnt ›= 9) && (cnt ‹= 16))
                {
                    pult_a2 = (pult_a2 ‹‹ 1);
                    pult_a2 = (pult_a2 | pult_bit);
                }
                else if ((cnt ›= 17) && (cnt ‹= 24))
                {
                    pult_c1 = (pult_c1 ‹‹ 1);
                    pult_c1 = (pult_c1 | pult_bit);
                }
                else if ((cnt ›= 25) && (cnt ‹= 32))
                {
                    pult_c2 = (pult_c2 ‹‹ 1);
                    pult_c2 = (pult_c2 | pult_bit);
                }
                if (cnt == 32)//принят весь код
                {
                    pult_state = PULT_PRESS_KEY;
                    SendPacketToUSB(1, 3);
                }                    
            }
            if (isTimeout == 0)
            {
                cnt++;
            }
            else
            {
                cnt = 0;
                isTimeout = 0;
            }
        }
        else
        {
            if (cnt › 100)
                printf_P(PSTR("cnt › 100\n\r"));
        }
    }
        
    //обнуляем таймер
    tim0_ovf_cnt = 0;
    TCNT0 = 0;
} 
Сообщение от Flopix Посмотреть сообщение
таймер будет использоваться и для других задач
Сорри, я ж не телепат...
miwutka, определитесь с протоколом пульта для начала.
http://www.google.ru/url?sa=t&rct=j&...-x27Tg&cad=rjt
omercury вне форума  
Сказали "Спасибо" omercury
miwutka (26.08.2012)
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Декодер RC5 vmax1987 Микроконтроллеры, АЦП, память и т.д 38 25.08.2010 22:26
RC5 transmitter Saadov Микроконтроллеры, АЦП, память и т.д 12 22.12.2008 21:08
Приемник RC5 в малом корпусе? Muzicant Микроконтроллеры, АЦП, память и т.д 1 17.02.2008 11:57
Совмещение динамической индикации и приема команд RC5 megAdriVeR Микроконтроллеры, АЦП, память и т.д 22 24.07.2007 21:18
Декодирование команд RC5 R_V_A Микроконтроллеры, АЦП, память и т.д 10 20.12.2006 19:52


Часовой пояс GMT +4, время: 20:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.