AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
25.08.2012, 19:15
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: RC5+atmega 8
Сообщение от miwutka
|
tim0_ovf_cnt - 65535 хранит макс значение? Какой тип переменной, непойму ?
|
uint16_t tim0_ovf_cnt;//счетчик переполнений таймера 0, для вычисления больших задержек
uint16_t = unsigned int (16 бит со знаком)
|
|
|
|
25.08.2012, 19:19
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: RC5+atmega 8
Сообщение от miwutka
|
переменнач cnt что считает?
|
cnt хранит номер принимаемого бита в ИК последовательности.
|
|
|
|
25.08.2012, 19:26
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: RC5+atmega 8
Сообщение от miwutka
|
pulseTime , sigTime , что считают переменные?
sigArr[cnt] , testArr[cnt] , - тоже что пишеться в масив?
|
sigTime - время первого полупериода сигнала
pulseTime - время второго полупериода сигнала
не совсем удачно обозвал эти переменные
sigArr[cnt] , testArr[cnt] , - это для отладки в них хранил последовательности задержек.
sigArr[cnt] = sigTime;
testArr[cnt] = pulseTime;
Эти массивы можно убрать.
В прерывании по изменению сигнала потому так и много кода чтобы сэкономит ОЗУ. Значение задержек сразу же декодируется.
|
|
|
|
25.08.2012, 19:35
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
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) и ниже происходит его обработка ... }
|
|
|
|
|
25.08.2012, 19:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: RC5+atmega 8
ага понятно ![Улыбка](images/smilies/icon_smile.gif) ... надо пробовать значит... Дальше код прожую еще, а то не пойму как срабатывает после простоя больше 20 мс... время простоя храниться же в переменной tim0_ovf_cnt. Значит когда прийдет первый полупериод импульса то умножиться время простоя на 256+TCNT0 и потом после условия запишеться в sigTime. А там дальше усливие не выполниться так как читсло будет вне диапазона (больше чем 3000).... Вот это немножко не пойму... Это я в голове и на листике просчитываю код...
|
|
|
|
25.08.2012, 20:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: RC5+atmega 8
Сообщение от miwutka
|
ага понятно ... надо пробовать значит...
|
Не стоило обижаться. Я ведь без перехода на личности. А уже и "кента" заработал... ![Обижен](images/smilies/icon_beee.gif)
Нашел в своем очень древнем архиве программу, которая работала в устройстве ДУ проектора офтальмолога. Переключала слайды для показа на экране. Если сможешь разобраться, буду рад. Там это самое комментирование самодостаточно.
зы Программа абсолютно работоспособная. С небольшими модификациями в области исполнительных устройств трудится и по сей день во многих "Оптиках" нашего города.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
25.08.2012, 20:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: RC5+atmega 8
Сообщение от ut1wpr
|
Не стоило обижаться. Я ведь без перехода на личности. А уже и "кента" заработал... ![Обижен](images/smilies/icon_beee.gif)
Нашел в своем очень древнем архиве программу, которая работала в устройстве ДУ проектора офтальмолога. Переключала слайды для показа на экране. Если сможешь разобраться, буду рад. Там это самое комментирование самодостаточно.
зы Программа абсолютно работоспособная. С небольшими модификациями в области исполнительных устройств трудится и по сей день во многих "Оптиках" нашего города.
|
Огромное спасибо ![Улыбка](images/smilies/icon_smile.gif) это прям через чур... качну, изучу. Просто тот тип так достал не одного меня что аж пипец ))) Буду изучать два кода и выводить золотую серединку.
|
|
|
|
25.08.2012, 20:48
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
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;
}
}
//ну в ы конце значение этих переменных обнуляются и к следующему срабатыванию прерывания все будет красиво
|
|
|
|
|
25.08.2012, 20:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: RC5+atmega 8
ну чтото так понятно, но надо это дело отследить в железе ![Улыбка](images/smilies/icon_smile.gif) весь код понятен, и даже очень ![Улыбка](images/smilies/icon_smile.gif) начало интересно как проходит ![Улыбка](images/smilies/icon_smile.gif) пока сажусь за переписывание под себя кода. Еще напишу... спасибо.
|
|
|
|
25.08.2012, 22:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
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
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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, время: 22:04.
|
|