Измеряем длительность импульса

Поделиться
HTML-код
  • Опубликовано: 3 окт 2023
  • Не все микроконтроллеры имеют таймер с режимом захвата, поэтому программная реализация этого режима на примере Attiny13.
    Проекты из ролика disk.yandex.ru/d/OirNNDu7zJ3SUw
    на всякое yoomoney.ru/to/4100115257108062
  • НаукаНаука

Комментарии • 16

  • @user-br6gp7hc4l
    @user-br6gp7hc4l 6 дней назад

    Спасибо

  • @alekskapitonov2738
    @alekskapitonov2738 8 месяцев назад

    Спасибо за урок.

  • @user-jz8js9me7g
    @user-jz8js9me7g 8 месяцев назад +2

    Приходят INT0 и TIMER0_OVF, в результате выполняется INT0 и счетчик на единицу меньше

  • @vladimirpetrov7943
    @vladimirpetrov7943 4 месяца назад

    Думаю, что проблема состоит в том, что ты не инициализируешь TCNT0. В примере ты запрещаешь и разрешаешь прерывания по таймеру, но это таймер не останавливает и не запускает. Таймер всегда работает и считает тики и на момент когда считывается его значение, оно не определено на фронте.

  • @AlexRootx
    @AlexRootx 8 месяцев назад

    предположу, что в первом варианте прерывание по инт прилетело, когда в счетчике (второе прерывание) было значение 0, отсюда и разница в одно переполнение

  • @MrVersusCR
    @MrVersusCR 8 месяцев назад

    При входе инт0 по фронту обнуляйте tcnt вручную и начинайте считать количество переполнений + остаток по спаду. В практике была подобная задача была найти импульс определённой длины среди кучи других.

    • @andreyfrolov301
      @andreyfrolov301  8 месяцев назад

      если вы не заметили это уже реализовано :)

    • @MrVersusCR
      @MrVersusCR 8 месяцев назад

      ​@@andreyfrolov301 да действительно, не заметил))))

  • @user-nj4vm4sh2l
    @user-nj4vm4sh2l 3 месяца назад

    А есть же в 16 битном таймере режим input capture

  • @GRafGRay81
    @GRafGRay81 8 месяцев назад

    Думаю конфликт прерываний

  • @alexandrvalentinovich164
    @alexandrvalentinovich164 8 месяцев назад +1

    У инт0 приоритет выше, допустим таймер досчитал до 100, тут сработал инт0 по фронту и сбросили коунтер имхо отсюда + лишнее переполнение

    • @andreyfrolov301
      @andreyfrolov301  8 месяцев назад

      мы ж его сбросили а не добавили +1... врядли в в этом дело

    • @alexandrvalentinovich164
      @alexandrvalentinovich164 8 месяцев назад

      @@andreyfrolov301 сбросили коунтер по фронту, а в момент этого фронта сработало прерывание от таймера, т.е. оно встало в очередь т.к. ниже приоритетом чем INT0, когда очередь подошла (закончилась обработка INT0), прерывание от таймера плюсануло коунтер к нулевому значению коунтера, потом первое переполнение еще раз плюсануло, отсюда и +1 переполнение.

    • @andreyfrolov301
      @andreyfrolov301  8 месяцев назад +1

      @@alexandrvalentinovich164 кажется я понял :)

  • @user-hw2eb8bl8e
    @user-hw2eb8bl8e 4 месяца назад

    вычисления в прерывании? ни к чему так делать

  • @user-eg5yi6lo8o
    @user-eg5yi6lo8o 8 месяцев назад +1

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