Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация Таймер1 в режим Input Capture на Mega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DmSk
Инициализация Таймер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
Палыч
Цитата(DmSk @ Jul 24 2009, 09:29) *
Как правильно сконфигурировать таймер 1 чтобы он работал в режиме захвата, а при захвате счетчик сбрасывался в 0 и вызывалось прервание. Также при переполнении счетчика должно быть прерывание.
Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума.
Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал.
DmSk
Цитата(Палыч @ Jul 24 2009, 11:08) *
Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума.
Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал.


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

а если при захвате ICR считывать и записывать туда значение ТOP таймера (65536), таким образом получится, что таймер сбрасывается и начинает считать сначала до 65536 ,
при этом погрешность вычисления уменьшается учитывая что при выводе информации на индикатор прерывания запрещаются, а вероятность что счеттчик дойдет до предыдущего ICR значения в это время когда прерывания запрещены невозможна
ivstech
Цитата(Палыч @ Jul 24 2009, 14:08) *
Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал.

Я хотел предложить включить режим 0 и записывать в перывании по захвату в счетчик TCNT1 значение 0, но посмотрел в документацию, получается, что прерывание срабатывает в момент переключения пина, а не счетчика, и в прескэйлере будет любое значение, и к моменту обнуления TCNT он уже может стать равным ICR+1, таким образом измерение будет менее точным, чем Вы предложили. Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнению
DmSk
Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ? захват и переполнение, или только захват ? Соответсвенно какие прервания возникают ? захвата и потом переполнения или только захвата.
Если только захвата, то о переполнение счетчика можно узнать по флагу , при этом запретить прерывание при перполнении, а при захвате если флаг выставлен игнорировать текущее значение ICR(оно неправльное), и сбрасывать флаг переполнения (ждать следующего значения- бес переполнения оно будет правильным)
Палыч
Цитата(DmSk @ Jul 24 2009, 12:01) *
Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ?
Об этом в DS как-то мутно написано. Нужно попробовать "в железе". Сам я такой режим таймера не пользовал. Для проверки симулятором пользоваться не рекомендую - у симуляторов свои глюки. А, вообще-то, режим таймера выбран интересный. Почему-то в голову не приходило воспользоваться этим режимом таймера, или хотя бы проверить, что можно из него "выжать"... Было бы интересно узнать, что можно получить в этом режиме.

Цитата(DmSk @ Jul 24 2009, 11:33) *
Считать долго нежелательно, хотел как проще

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

Цитата(ivstech @ Jul 24 2009, 11:39) *
Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнению
Вот это - надо делать аккуратно в любом режиме таймера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.