DmSk 0 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Инициализация Таймер1 в режим Input Capture на Mega8 Как правильно сконфигурировать таймер 1 чтобы он работал в режиме захвата, а при захвате счетчик сбрасывался в 0 и вызывалось прервание. Также при переполнении счетчика должно быть прерывание. На данный момент в симуляторе инициировал следующим образом: ; Инициализация таймера .equ DIVIDER=64 ; ldi R16, (1<<ICNC1)|(1<<ICES1)|(0<<CS12)|(1<<CS11)|(1<<CS10)|(1<<WGM13)|(1<<WGM12) out TCCR1B, R16 ldi R16, 0 out TCCR1A, R16 ldi R16, (1<<TICIE1) out TIMSK, R16 sei Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Как правильно сконфигурировать таймер 1 чтобы он работал в режиме захвата, а при захвате счетчик сбрасывался в 0 и вызывалось прервание. Также при переполнении счетчика должно быть прерывание.Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума. Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmSk 0 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума. Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал. Считать долго нежелательно, хотел как проще, при переполнении таймера игнорировать следующий захват, а если при захвате ICR считывать и записывать туда значение ТOP таймера (65536), таким образом получится, что таймер сбрасывается и начинает считать сначала до 65536 , при этом погрешность вычисления уменьшается учитывая что при выводе информации на индикатор прерывания запрещаются, а вероятность что счеттчик дойдет до предыдущего ICR значения в это время когда прерывания запрещены невозможна Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivstech 0 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал. Я хотел предложить включить режим 0 и записывать в перывании по захвату в счетчик TCNT1 значение 0, но посмотрел в документацию, получается, что прерывание срабатывает в момент переключения пина, а не счетчика, и в прескэйлере будет любое значение, и к моменту обнуления TCNT он уже может стать равным ICR+1, таким образом измерение будет менее точным, чем Вы предложили. Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнению Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmSk 0 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ? захват и переполнение, или только захват ? Соответсвенно какие прервания возникают ? захвата и потом переполнения или только захвата. Если только захвата, то о переполнение счетчика можно узнать по флагу , при этом запретить прерывание при перполнении, а при захвате если флаг выставлен игнорировать текущее значение ICR(оно неправльное), и сбрасывать флаг переполнения (ждать следующего значения- бес переполнения оно будет правильным) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ?Об этом в DS как-то мутно написано. Нужно попробовать "в железе". Сам я такой режим таймера не пользовал. Для проверки симулятором пользоваться не рекомендую - у симуляторов свои глюки. А, вообще-то, режим таймера выбран интересный. Почему-то в голову не приходило воспользоваться этим режимом таймера, или хотя бы проверить, что можно из него "выжать"... Было бы интересно узнать, что можно получить в этом режиме. Считать долго нежелательно, хотел как проще А , по поводу более долгих вычислений при mode 0: от вычислений при mode 12 будет отличаться только ещё одной операцией - вычитание шестнадцатибитового значения, т.е. 5-7 лишних тактов в зависимости от того, где разместите предыдущее значение ICR. Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнениюВот это - надо делать аккуратно в любом режиме таймера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться