Приходят INT0 и TIMER0_OVF, в результате выполняется INT0 и счетчик на единицу меньше
@GRafGRay81 Жыл бұрын
Думаю конфликт прерываний
@ЭльМеф8 ай бұрын
А есть же в 16 битном таймере режим input capture
@MrVersusCR Жыл бұрын
При входе инт0 по фронту обнуляйте tcnt вручную и начинайте считать количество переполнений + остаток по спаду. В практике была подобная задача была найти импульс определённой длины среди кучи других.
@andreyfrolov301 Жыл бұрын
если вы не заметили это уже реализовано :)
@MrVersusCR Жыл бұрын
@@andreyfrolov301 да действительно, не заметил))))
@vladimirpetrov79439 ай бұрын
Думаю, что проблема состоит в том, что ты не инициализируешь TCNT0. В примере ты запрещаешь и разрешаешь прерывания по таймеру, но это таймер не останавливает и не запускает. Таймер всегда работает и считает тики и на момент когда считывается его значение, оно не определено на фронте.
@AlexRootx Жыл бұрын
предположу, что в первом варианте прерывание по инт прилетело, когда в счетчике (второе прерывание) было значение 0, отсюда и разница в одно переполнение
@alexandrvalentinovich164 Жыл бұрын
У инт0 приоритет выше, допустим таймер досчитал до 100, тут сработал инт0 по фронту и сбросили коунтер имхо отсюда + лишнее переполнение
@andreyfrolov301 Жыл бұрын
мы ж его сбросили а не добавили +1... врядли в в этом дело
@alexandrvalentinovich164 Жыл бұрын
@@andreyfrolov301 сбросили коунтер по фронту, а в момент этого фронта сработало прерывание от таймера, т.е. оно встало в очередь т.к. ниже приоритетом чем INT0, когда очередь подошла (закончилась обработка INT0), прерывание от таймера плюсануло коунтер к нулевому значению коунтера, потом первое переполнение еще раз плюсануло, отсюда и +1 переполнение.
@andreyfrolov301 Жыл бұрын
@@alexandrvalentinovich164 кажется я понял :)
@АлексейАмброзяк Жыл бұрын
в чем проблема включить дизасемблер в отладке и смотерть куда твоя программа прыгает? во время вычислений происходят прерывания - вот тебе потеряные такты. в прерваниях нечго решать примеры с умножением и делением. ты должен поднять флаг прерывания, который делается за один такт и быстро свалить с прерывания в основную программу, обрабатывать этот флаг. было там прерывание или не было, выполнять рассчеты и прочее. посмотри в даташите сколько тактов занимает умножение и всё станет ясно. прерывание должно выполняться максимально быстро, чтоб не затормаживать работу основной программы. в этом его суть. перемести все расчеты в основную программу по поднятию флага прерывания и будет красота.