в таймере-счетчике у меня отсчитываются секунды. а в прерывании pcint я хочу обработать короткое и длинное нажатия кнопки. когда нажимаю кнопку, возникает прерывание pcint, где я "запоминаю" имеющееся значение секунд. затем, дождавшись момента, когда кнопка будет отпущена, я проверяю разницу между новым значением секунд(таймер-то считает) и "запомненным" значением. в итоге синий светодиод загорается, а зеленый нет, сколько ни дави на кнопку. как можно это победить?
Комментарии: 13
Anton
Потенциально бесконечный цикл в обработчике прерываний? Прекрасный способ провести ночь в обнимку с отладчиком :) Так делать не надо. Сделай прерывание от таймера с частотой 100 Гц, и там проверяй состояния портов. Для таймаута в этом случае подойдет простейшая реализация софтового таймера. Реализация через внешнее прерывание по нажатию кнопки оправдано тогда, когда надо пробудить МК из сна. В остальных случаях только добавляет головной боли и гемороя на жопу :)
Paschendale
я с отладчиком еще не знаком. но и без него я часами сижу в поисках решения вроде бы простых вещей у меня в обработчике по переполнению таймера0 настроен отсчет секунд, поэтому я их и пытался "присобачить". Значит надобно от этого таймера замутить прерывание по совпадению.
Anton
Да, только надо прерывания почаще сделать... раз в секунду маловато для обработки нажатий кнопки.... 100Гц оптимально..
Ogurezzz
Присоединюсь по поводу бесконечного цикла. Плюс в перывании вообще не стоит никакие расчеты вести. Сцапал переменный и валить подальше. А расчеты/сравнения/логика отдельно.
Anton
Ну никакие рассчеты это сильно. Если очень хочется то можно, только без фанатизма. Но посыл верный, с прерывания нужно свалить как можно быстрее. Но бывают случаи когда вся логика вертится в этом самом прерывании :)
Ogurezzz
3ак кнопка подключена? Подтяжка к земле что ли? Когда понимаешь риски - вэлкам, а для начинающи - валить,валить... Сам такой
Anton
Скорее не риски, а считать надо, успеешь или не успеешь. Но да, понимание нужно ясен :)
Paschendale
нет, все стандартно, к питанию.
Ogurezzz
Условие попробуй мое
Ogurezzz
И условие при обнулении таймера странное. Если у кнопки не 1й пин, то значение может быть >0. После инверсии я бы ещё сделал сдвиг в право до 1го разряда.
Anton
Тут как бы если например выполнение прерывания занимает 60% всего времени МК, на логику остаётся 40... если этого достаточно, то почему бы и нет?
Ogurezzz
if(!((PINB>>button)&1)))
Ogurezzz
Скобки лишние? Да, я лишнюю скобку в конце нарисовал