Перейти к содержанию
    

Инициализация Таймер1 в режим Input Capture на Mega8

Инициализация Таймер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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно сконфигурировать таймер 1 чтобы он работал в режиме захвата, а при захвате счетчик сбрасывался в 0 и вызывалось прервание. Также при переполнении счетчика должно быть прерывание.
Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума.

Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума.

Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал.

 

Считать долго нежелательно, хотел как проще, при переполнении таймера игнорировать следующий захват,

 

а если при захвате ICR считывать и записывать туда значение ТOP таймера (65536), таким образом получится, что таймер сбрасывается и начинает считать сначала до 65536 ,

при этом погрешность вычисления уменьшается учитывая что при выводе информации на индикатор прерывания запрещаются, а вероятность что счеттчик дойдет до предыдущего ICR значения в это время когда прерывания запрещены невозможна

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал.

Я хотел предложить включить режим 0 и записывать в перывании по захвату в счетчик TCNT1 значение 0, но посмотрел в документацию, получается, что прерывание срабатывает в момент переключения пина, а не счетчика, и в прескэйлере будет любое значение, и к моменту обнуления TCNT он уже может стать равным ICR+1, таким образом измерение будет менее точным, чем Вы предложили. Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнению

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ? захват и переполнение, или только захват ? Соответсвенно какие прервания возникают ? захвата и потом переполнения или только захвата.

Если только захвата, то о переполнение счетчика можно узнать по флагу , при этом запретить прерывание при перполнении, а при захвате если флаг выставлен игнорировать текущее значение ICR(оно неправльное), и сбрасывать флаг переполнения (ждать следующего значения- бес переполнения оно будет правильным)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ?
Об этом в DS как-то мутно написано. Нужно попробовать "в железе". Сам я такой режим таймера не пользовал. Для проверки симулятором пользоваться не рекомендую - у симуляторов свои глюки. А, вообще-то, режим таймера выбран интересный. Почему-то в голову не приходило воспользоваться этим режимом таймера, или хотя бы проверить, что можно из него "выжать"... Было бы интересно узнать, что можно получить в этом режиме.

 

Считать долго нежелательно, хотел как проще

А , по поводу более долгих вычислений при mode 0: от вычислений при mode 12 будет отличаться только ещё одной операцией - вычитание шестнадцатибитового значения, т.е. 5-7 лишних тактов в зависимости от того, где разместите предыдущее значение ICR.

 

Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнению
Вот это - надо делать аккуратно в любом режиме таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...