в таймере-счетчике у меня отсчитываются секунды. а в прерывании pcint я хочу обработать короткое и длинное нажатия кнопки. когда нажимаю кнопку, возникает прерывание pcint, где я "запоминаю" имеющееся значение секунд. затем, дождавшись момента, когда кнопка будет отпущена, я проверяю разницу между новым значением секунд(таймер-то считает) и "запомненным" значением. в итоге синий светодиод загорается, а зеленый нет, сколько ни дави на кнопку. как можно это победить?

Комментарии: 13

  1. Anton

    Потенциально бесконечный цикл в обработчике прерываний? Прекрасный способ провести ночь в обнимку с отладчиком :) Так делать не надо. Сделай прерывание от таймера с частотой 100 Гц, и там проверяй состояния портов. Для таймаута в этом случае подойдет простейшая реализация софтового таймера. Реализация через внешнее прерывание по нажатию кнопки оправдано тогда, когда надо пробудить МК из сна. В остальных случаях только добавляет головной боли и гемороя на жопу :)

    • Paschendale

      я с отладчиком еще не знаком. но и без него я часами сижу в поисках решения вроде бы простых вещей у меня в обработчике по переполнению таймера0 настроен отсчет секунд, поэтому я их и пытался "присобачить". Значит надобно от этого таймера замутить прерывание по совпадению.

      • Anton

        Да, только надо прерывания почаще сделать... раз в секунду маловато для обработки нажатий кнопки.... 100Гц оптимально..

  2. Ogurezzz

    Присоединюсь по поводу бесконечного цикла. Плюс в перывании вообще не стоит никакие расчеты вести. Сцапал переменный и валить подальше. А расчеты/сравнения/логика отдельно.

    • Anton

      Ну никакие рассчеты это сильно. Если очень хочется то можно, только без фанатизма. Но посыл верный, с прерывания нужно свалить как можно быстрее. Но бывают случаи когда вся логика вертится в этом самом прерывании :)

      • Ogurezzz

        3ак кнопка подключена? Подтяжка к земле что ли? Когда понимаешь риски - вэлкам, а для начинающи - валить,валить... Сам такой

        • Anton

          Скорее не риски, а считать надо, успеешь или не успеешь. Но да, понимание нужно ясен :)

        • Paschendale

          нет, все стандартно, к питанию.

          • Ogurezzz

            Условие попробуй мое

  3. Ogurezzz

    И условие при обнулении таймера странное. Если у кнопки не 1й пин, то значение может быть >0. После инверсии я бы ещё сделал сдвиг в право до 1го разряда.

    • Anton

      Тут как бы если например выполнение прерывания занимает 60% всего времени МК, на логику остаётся 40... если этого достаточно, то почему бы и нет?

      • Ogurezzz

        if(!((PINB>>button)&1)))

        • Ogurezzz

          Скобки лишние? Да, я лишнюю скобку в конце нарисовал

Не нашли ответ?

Вам также может быть интересно