Измеряем длительность импульса
HTML-код
- Опубликовано: 3 окт 2023
- Не все микроконтроллеры имеют таймер с режимом захвата, поэтому программная реализация этого режима на примере Attiny13.
Проекты из ролика disk.yandex.ru/d/OirNNDu7zJ3SUw
на всякое yoomoney.ru/to/4100115257108062 - Наука
Спасибо
Спасибо за урок.
Приходят INT0 и TIMER0_OVF, в результате выполняется INT0 и счетчик на единицу меньше
Думаю, что проблема состоит в том, что ты не инициализируешь TCNT0. В примере ты запрещаешь и разрешаешь прерывания по таймеру, но это таймер не останавливает и не запускает. Таймер всегда работает и считает тики и на момент когда считывается его значение, оно не определено на фронте.
предположу, что в первом варианте прерывание по инт прилетело, когда в счетчике (второе прерывание) было значение 0, отсюда и разница в одно переполнение
При входе инт0 по фронту обнуляйте tcnt вручную и начинайте считать количество переполнений + остаток по спаду. В практике была подобная задача была найти импульс определённой длины среди кучи других.
если вы не заметили это уже реализовано :)
@@andreyfrolov301 да действительно, не заметил))))
А есть же в 16 битном таймере режим input capture
Думаю конфликт прерываний
У инт0 приоритет выше, допустим таймер досчитал до 100, тут сработал инт0 по фронту и сбросили коунтер имхо отсюда + лишнее переполнение
мы ж его сбросили а не добавили +1... врядли в в этом дело
@@andreyfrolov301 сбросили коунтер по фронту, а в момент этого фронта сработало прерывание от таймера, т.е. оно встало в очередь т.к. ниже приоритетом чем INT0, когда очередь подошла (закончилась обработка INT0), прерывание от таймера плюсануло коунтер к нулевому значению коунтера, потом первое переполнение еще раз плюсануло, отсюда и +1 переполнение.
@@alexandrvalentinovich164 кажется я понял :)
вычисления в прерывании? ни к чему так делать
в чем проблема включить дизасемблер в отладке и смотерть куда твоя программа прыгает? во время вычислений происходят прерывания - вот тебе потеряные такты. в прерваниях нечго решать примеры с умножением и делением. ты должен поднять флаг прерывания, который делается за один такт и быстро свалить с прерывания в основную программу, обрабатывать этот флаг. было там прерывание или не было, выполнять рассчеты и прочее. посмотри в даташите сколько тактов занимает умножение и всё станет ясно. прерывание должно выполняться максимально быстро, чтоб не затормаживать работу основной программы. в этом его суть. перемести все расчеты в основную программу по поднятию флага прерывания и будет красота.