Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/147: Рейтинг темы: голосов - 147, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
1

Сигнал во время задержки для AVR

22.04.2013, 18:44. Просмотров 27144. Ответов 80
Метки нет (Все метки)

Добрый вечер!
У меня такая проблема.

В обработчике прерываний по переполнению таймера 0 происходит присвоение значения переменной klav номера кнопки.
В основной программе - проверка, при изменении состояния, этой переменной.
При первом нажатии задержка 20 с, установка бита 0 порта B, задержка 300 мс, сброс бита.
Но, в интервале 20 с может произойти(и обязательно произойдет) еще 5 нажатий на кнопку, которые так же необходимо обработать(задержка 20 с, установка бита 0 порта B, задержка 300 мс, сброс бита). Код на Си, ATmega16.
Подскажите, как быть. Понимаю, что как-то через ОС, но не понимаю как.
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2013, 18:44
Ответы с готовыми решениями:

Функция задержки в МК AVR
Речь идёт о программировании микроконтроллеров с помощью C/C++. Очень нужна библиотека,...

Как сделать нулевой ШИМ сигнал на avr
Здравствуйте! Написал программу, которая генерирует ШИМ в зависимости от напряжения, которое...

Задать время задержки для выпадающего меню
Нужна помощь. Сразу после отвода курсора от гиперссылки выпадающее меню пропадает. Как можно...

Максимальное время задержки в сети для 90% запросов
Здравствуйте, у меня только один вопрос по GPSS. Как определить максимальное время задержки в...

80
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
22.04.2013, 18:47 2
Каждое нажатие увеличивает счетчик, каждый отработаный цикл уменьшает счетчик, обычный цикл
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 19:15 3
Я не понимаю, ведь во время задержки МК затыкается.
Кнопку нажали и отпустили, идет задержка 20с, и во время этой задержки приходит еще несколько нажатий на кнопку.
Извиняюсь за свою непонятливость. Спасибо.
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 19:23 4
Код
if(klav_pr != klav)//если состояние изменилось
{
if(klav != 0) //lcd_dat(klav);//и если кнопки не нажаты, то выводим символ на ЖКИ
{
switch(klav)
{
case (1):
{
PORTB |= (1<<0);
_delay_s(20);//Вот во время этой задержки приходит еще сигнал
PORTB &= ~(1<<0);
} briok;
}
}
}
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
22.04.2013, 19:26 5
сделайте еще один системный таймер, где-то на 100мс, чтобы там сделать конечный автомат. Тогда вместо _delay_s(20); надо будет присвоить какой-нибудь переменной автомата нужное значение секунд, он сам себе дотикает в прерывании этого системного таймера, и сам себя отрубит.
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 20:50 6
Уважаемый Hotd!
Не могли бы Вы показать примерный шаблон кода?
С уважением, Korhom.
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2013, 20:56 7
Цитата Сообщение от Korhom
При первом нажатии задержка 20 с, установка бита 0 порта B, задержка 300 мс, сброс бита.
Но, в интервале 20 с может произойти(и обязательно произойдет) еще 5 нажатий на кнопку, которые так же необходимо обработать(задержка 20 с, установка бита 0 порта B, задержка 300 мс, сброс бита).
Не совсем понятен алгоритм....

Такая логика верна?
Нажали кнопку (задержка установилась 20сек), через 10 сек нажали еще раз, при этом переменная задержки обновилась опять на 20 сек.... Т.е. сработка условия должна произойти через 20 сек после последнего отжатия?

Или же программа должна запоминать все события кнопки, и после каждого спустя 20 сек произвести операцию с битом порта? Т.е. если мы в течение 10 сек нажали 5 раз на кнопку, то через 20 сек после первого нажатия начнут идти импульсы в порт с периодичностью, соответствующей периодичности нажатия кнопки.....
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 21:26 8
Между нажатиями максимальный интервал 4 с.(т.о. всего 5 нажатий)
Первое нажатие - установлен бит через 20 с в любом случае, затем, через 300 мс - сброшен.
Т.е. второй вариант верен.
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 21:34 9
20 с после первого нажатия
периодичность последующих импульсов 4 с

if Кн = 1, Кн = 0
//на каждое нажатие:
Delay_s(20);//В это время нажали, отпустили кнопку 3 раза с интервалом 4 с -
Byt = 1;
Delay_ms(300);
Byt = 0;
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2013, 22:04 10
Цитата Сообщение от Korhom
по переполнению таймера 0 происходит присвоение значения переменной klav номера кнопки.
А кнопка одна? если да то что за номер кнопки?

Про Delay_s(20); забудьте.... там надо счетчиками задержки делать.

Наверное вам надо завести столько переменных, сколько возможно нажатий в течение 20 сек.
В прерывании активные переменные декрементировать, если какая то обнулилась - вызывать отработку импульса.
При обнаружении нажатия инитить одну из отработавших переменных на 20 сек.
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 22:10 11
Кнопок 4.

Кнопка 1 - PORTB Byt 0, задержка 20 с, интервал 4 с
Кнопка 2 - PORTB Byt 1, задержка 20 с, интервал 4 с

Кнопка 3 - PORTB Byt 0, задержка 25 с, интервал 4 с
Кнопка 4 - PORTB Byt 1, задержка 25 с, интервал 4 с
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 22:12 12
По поводу счетчика я уже думал. Т.к. на _delay_s(); МК встанет на те самые 20с.
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2013, 23:04 13
Все равно не совсем понятно, например что это за кнопки, что у них известный период активности.....
Может кратко опиште назначение устройства, ато так до пенсии будем выяснять нюансы алгоритма (ну если конечно не каканибудь тайна коммерческая....)
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 23:45 14
Значит так. Объекты сортировки, 2 оператора и 2 приемника для объекта сортировки.
Есть 4 кнопки. По две кнопки на оператора. Выход1(приемник1) и Выход2(приемник2).

Кнопка1 оператора1 соответствует приемнику1
Кнопка2 оператора2 соответствует приемнику1
Кнопка3 оператора1 соответствует приемнику2
Кнопка4 оператора2 соответствует приемнику2

Объект движется со скоростью 33 шт/мин. (между объектами 1,82 с(2 с))
От оператора1 до приемника1 20 с
От оператора2 до приемника1 25 с
Интервал нажатий между 2 объектов одного оператора 3,64 с(4 с)

Оператор1 нажал на кнопку1 - через 20 с объект упал в приемник1
Оператор1 нажал на кнопку2 - через 30 с объект упал в приемник2

Оператор2 нажал на кнопку1 - через 25 с объект упал в приемник1
Оператор2 нажал на кнопку2 - через 35 с объект упал в приемник2
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
22.04.2013, 23:47 15
Интервалы для примера
0
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
23.04.2013, 00:30 16
Цитата Сообщение от Korhom
Кнопок 4.

Кнопка 1 - PORTB Byt 0, задержка 20 с, интервал 4 с
Кнопка 2 - PORTB Byt 1, задержка 20 с, интервал 4 с

Кнопка 3 - PORTB Byt 0, задержка 25 с, интервал 4 с
Кнопка 4 - PORTB Byt 1, задержка 25 с, интервал 4 с
Необходимы переменные для флагов контроля занятости программных таймеров, каждая для своей кнопки. При нажатии на кнопку проверяем есть ли свободный таймер, если есть то, запускается таймер (таймеры программные но не _delay_s()), на нужное кол-во времени и устанавливается флаг занятости этого таймера и в течении этого времени происходят еще нажатия, которые запускают свои программные таймеры и устанавливают соответствующие флаги занятости, т.е. после каждого нажатия на кнопку запускается очередной свободный таймер, когда закончится отсчет соответствующего таймера запускаем подпрограмму вывода данных в бит порта и сбрасываем флаг занятости соответствующего таймера. К примеру для кнопки 1 получается, что первый таймер, освободится после инициализации шестого программного таймера через 20 сек. Итого получаем шесть программных таймеров по 20 сек. каждый. Ну и так для каждой кнопки.
P.S. Наверное громоздко получится, но как вариант попробовать можно.
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 60
23.04.2013, 01:32 17
stritsh!
Не мог бы накидать примерный код?
Спасибо.
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
23.04.2013, 03:16 18
Ну ты хотя бы схемку свою накидай в протеусе например, а мы уже ченить сообразим.....
0
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
23.04.2013, 08:48 19
Цитата Сообщение от Korhom
stritsh!
Не мог бы накидать примерный код?
Спасибо.
С проходняка под такой алгоритм быстро я не смогу написать, надо немного подумать, чтобы поменьше косяков было. Мож хто поопытнее быстро смогут накидать. Да и по поводу кнопок неплохо бы схемку, а то из вот этого
Значит так. Объекты сортировки, 2 оператора и 2 приемника для объекта сортировки.
Есть 4 кнопки. По две кнопки на оператора. Выход1(приемник1) и Выход2(приемник2).

Кнопка1 оператора1 соответствует приемнику1
Кнопка2 оператора2 соответствует приемнику1
Кнопка3 оператора1 соответствует приемнику2
Кнопка4 оператора2 соответствует приемнику2

Объект движется со скоростью 33 шт/мин. (между объектами 1,82 с(2 с))
От оператора1 до приемника1 20 с
От оператора2 до приемника1 25 с
Интервал нажатий между 2 объектов одного оператора 3,64 с(4 с)

Оператор1 нажал на кнопку1 - через 20 с объект упал в приемник1
Оператор1 нажал на кнопку2 - через 30 с объект упал в приемник2

Оператор2 нажал на кнопку1 - через 25 с объект упал в приемник1
Оператор2 нажал на кнопку2 - через 35 с объект упал в приемник2
я не очень понял у какого оператора какие номера кнопок.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
23.04.2013, 09:10 20
TC. Распишите алгоритм следующим образом. Кнопки, выходы.
Номера кнопок. Номера выходов.
Пример:
Нажали на кнопку 1. Выход 3 установился в 1 на N секунд.
Так задача будет всем понятнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2013, 09:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Различное время задержки для разных заявок
Добрый день. У меня в задаче есть 2 типа агентов, нужно сделать чтобы время delay зависело от типа...

Разное время задержки Delay для разных заявок
Здравствуйте.Подскажите пожалуйста,как выполнить такое: с одного источника выходят 2 наименования...

Время задержки delay
Доброго времени суток. столкнулся с AnyLogic University 6.9.0. задача: Есть 3 блока Sourсе. из них...

Разное время задержки
Здравствуйте. Такая проблема, есть функция, которая должна выполняться каждые N минут. Причем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.