Почему? Я этот кусок кода на stm32 использовала, на реальном камне. Все работало. Но там естественно по другому выглядит условие физического нажатия. Может условие иначе надо прописать?
_________________ Я конечно все понимаю, но этого я не понимаю.
Как почему? У вас при вызове функции Button_count = 0. И потом вы проверяете Button_count<20 У вас никогда Button_count никогда не станет больше 20, следовательно ветка else никогда не выполнится.
Вот здесь наоборот - только ветка else и будет выпоняться, в которой условие key_delay<20000 будет выполняться всегда.
Код:
if (Button_count>0)Button_count--; //подавление дребезга при отжатии else { Button_state=0; //регистрируем отжатие кнопки if (key_delay<20000) Flag=1; //регистрируем короткое нажатие else Flag=2; //регистрируем длительное нажатие
Но это всё уже к таймерам отношения не имеет, imho.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
bezzabotna писал(а):
int Button_count=0,Button_state=0,key_delay=0,Flag=0; //служебные переменные
Неудивительно, что кнопки не опознаются. Процитированная строка по каждому прерыванию от таймера инитит эти самые служебные переменные, поэтому при сравнении if'ами в Button_count ничего, кроме единицы, быть не может.
Когда-то я решал подобную задачу - принять данные с сильно дребезжащего контакта. Я тогда, по-простому, сделал программные аналоги последовательно включенных интегратора и триггера Шмидта. Аналоги грубые, сильно упрощенные, тем не менее...
Итак, предположим, что таймерные прерывания у нас будут с периодом 1 мс (1 кГц). Заводим в статической памяти, вне (до) всех функций (чтобы не возиться с передачей параметров) табличку, которая для каждой из кнопок содержит следующие данные (навскидку) 1) время замкнутого состояния контактов кнопки. 2) флажок "распознанное состояние кнопки" 3) флажок "предыдущее состояние кнопки" 4) (возможно) флажок "состояние кнопки изменилось" в качестве сигнала главной программе, мол проснись и поработай. 5) (если нужно) время распознанного нажатого состояния кнопки, например, для распознавания коротких и длительных нажатий.
При инициализации, обязательно до разрешения таймерных прерываний, все эти поля надо очистить (обнулить).
В программе прерывания по таймеру, для каждой изх кнопок, проверяем, замкнута она, или нет. Если замкнута, инкрементируем поле (1) и, если оно совпадет с порогом срабатывания "триггера Шмидта", взводим флажок (2), если надо, сравниваем этот флажок с (3) и, если они не совпадают взводим флажок (4) и обновляем (3). Далее проверим, не пора ли нашему "интегратору" входить в насыщение. если да, организовываем это насыщение, то есть отменяем инкремент поля (1). Здесь же, обнаружив распознанное состояние кнопки, можно начать инкрементировать (5) и, обнаружив длительное нажатие, послать соответствующий сигнал.
Если же кнопик разомкнут, декрементируем поле (1) и, если оно совпадает с порогом отпускания триггера Шмитта, очищаем флажок (2) и, опять же, сравниваем (2) и (3), действия при несовпадении те же, что и выше. Далее, опять же, проверяем на насыщение (отрицательное), то есть, если (1) станет отрицательным, обнуляем его, и вперед.
Теперь о порогах. Навскидку, порог отпускания триггера Шмитта нужно взять 5-10, порог срабатывания его же - 20-25 и порог насыщения - на 5-10 больше, чем порог срабатывания.
А основная программа должна мониторить поля (2) каждой из кнопок и, обнаружив нажатие, предпринимать соответствующие действия. Или, может быть, флажок (4), если он очищен, можно заснуть (Sleep). Может быть флажок (4) нужен не каждой кнопке, а один на всех, это уже по вкусу.
Да, зачем для этого дела 16-битный таймер 1 ? Там и 8-битного за глаза, только нужен таймер с Clear to Compare (CTC). У 8-й Меги это Т2, 328-ю я наизусть не помню. А так, прескалером делим на 1024, даже из 20 МГц получим порядка 20 кГц, делим таймером на 20 и вот он, желаемый 1 кГц прерываний. Да, 1024 - это не 1000, но точность этой миллисекунды здесь и даром не нужна.
bezzabotna писал(а):
Почему? Я этот кусок кода на stm32 использовала, на реальном камне. Все работало.
Может быть неудачно скопипастила?
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Заводим в статической памяти, вне (до) всех функций (чтобы не возиться с передачей параметров) табличку, которая для каждой из кнопок содержит следующие данные (навскидку)
Можно завести и внутри обработчика, только с использованием модификатора static - так будет правильнее в точки зрения области видимости переменных.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Нет, здесь, как раз, нужна довольно широкая видимость. Таблицу надо проинитить, ее надо видеть из программы обслуживания прерывания, по крайней мере, флажки нужно видеть в программе реакции на нажатие клавиш, там же нужен счетчик длительного нажатия, в общем, проще сделать полную видимость этой таблицы везде и не морочить себе голову.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Карма: 1
Рейтинг сообщений: -2
Зарегистрирован: Пт сен 04, 2015 13:10:49 Сообщений: 121 Откуда: г. Ижевск
Рейтинг сообщения:0
Добрый день! Подскажите пожалуйста, как сделать, чтобы в режиме ШИМ - два канала таймера работали попеременно, т.е. допустим на канале А идут импульсы ШИМ, а на канале В - никаких импульсов не должно быть, даже "иголок". А то даже при OCR0B = 0, присутствуют "иголки". Два канала таймера работают на Н-мост и поэтому из-за "иголок" происходит "сквозняк". Можно ли выключить отдельно тот или другой канал?
во-первых, можно выключить. во-вторых, иголки - это, как правило, ЕСТЕСТВЕННОЕ состояние для Fast-PWM при одном из "крайних" значений регистра сравнения. то есть либо надо выбирать правильный режим PWM, либо отключать канал программно в нужный момент. вы же как-то включали оба канала? значит, и выключить один сумеете.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Детально я, конечно, не вникал, но у Мег 48-88-168-328 блок-схема таймера 0 та же, что и у 2313А. Да и у 16-й (без А) у таймера 0 есть вход и выход. Как мне кажется, только у 8-й Меги такого нет, у остальных Мег должно быть.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Понятно, спасибо. Что-то 8-я мега какая-то обделённая получается. У всех другим мег есть такой таймер, а у 8-й нет. А у меня их целых три не при делах лежит.
Доброго времени суток. Прошу прощения за нубский вопрос. Смотрю даташит на Мегу8, а именно на режимы работы Timer1, и вижу, что режим 4 фактически идентичен режиму 12, режим 8 - режиму 9, режим 10 - режиму 11, а режим 13 - режиму 14. Все эти пары режимов отличаются только регистром, из которого они берут значение для сравнения. В одном случае это ICR1, во втором - OCR1A. И я не понимаю, зачем было так делать, ведь режим таймера может быть включен все равно только один. Какой тогда смысл в таком дублировании ? Может быть я чего-то не понимаю, тогда приведите пожалуйста пример, когда такая организация может пригодится.
У таймера 1 есть два выхода: OC1A и OC1B. При реализации ШИМа каждый из этих выходов управляется, соответственно, регистрами OCR1A и OCR1B. Если нужен ШИМ с какой-нибудь нестандартной длительностью, то нужен ещё один регистр для хранения этого нестандартного потолка таймера. Этим регистром может являться либо OCR1A, либо ICR1. Если использовать первый регистр, то невозможно будет управлять скважностью канала A, то есть сразу лишимся одного ШИМ-канала. Если же использовать второй регистр, то не будет возможности использовать захват по событию.
Конструкторы чипа просто предоставили своим коллегам, которые этот чип будут использовать в своих разработках, некоторую гибкость: можно в зависимости от потребностей использовать тот или иной регистр. Хотя, разумеется, наиболее правильно было бы завести для этого дела отдельный регистр. Но AVR — это не STM32 с её четырьмя гигабайтами на всё-про-всё. У AVR область портов ввода-вывода ограничена. Поэтому конструкторы решили сэкономить: использовать регистры с двойным назначением в зависимости от режима.
не равной разрядности счетчика, а с любым числом, например 100 (будет шим ровно в 100 шагов, например для получения шага ровно в 1%)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Предисловие: Я делаю себе таймер на ATmeg48 с внутренним тактированием от RC 8MHz. Хочу повесить часовой кварц для точного счета.
А вот теперь вопрос: Правильно ли я понимаю, что для данной задачи подойдет только Timer/Counter2? По крайней мере в даташите говориться, что для асинхронного тактирования используется этот счетчик.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения