|
|
  |
Инициализация Таймер1 в режим Input Capture на Mega8, Инициализация Таймер1 в режим Input Capture на Mega8 |
|
|
|
Jul 24 2009, 06:29
|
Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518

|
Инициализация Таймер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
|
|
|
|
|
Jul 24 2009, 08:33
|
Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518

|
Цитата(Палыч @ Jul 24 2009, 11:08)  Ну, Вы и закрутили с режимом таймера... Поскольку Вы используете mode 12 (наверное для сброса в ноль счетчика при захвате), то счетчик будет считать до значения ICR1. Значение ICR1 нужно выставлять при инициализации (по сбросу там будет 0). Но, как только произайдет захват, то значение ICR1 изменится! Имхо, с таким режимом можно сойти с ума. Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал. Считать долго нежелательно, хотел как проще, при переполнении таймера игнорировать следующий захват, а если при захвате ICR считывать и записывать туда значение ТOP таймера (65536), таким образом получится, что таймер сбрасывается и начинает считать сначала до 65536 , при этом погрешность вычисления уменьшается учитывая что при выводе информации на индикатор прерывания запрещаются, а вероятность что счеттчик дойдет до предыдущего ICR значения в это время когда прерывания запрещены невозможна
|
|
|
|
|
Jul 24 2009, 08:39
|
Местный
  
Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860

|
Цитата(Палыч @ Jul 24 2009, 14:08)  Не лучше ли поставить счетчик в mode 0, включить прерывание по Input Capture и по переполнению и вычислять интервалы по двум значениям (предыдущему и текущему) ICR1 и числу переполнений счетчика между ними? Я бы так и делал. Я хотел предложить включить режим 0 и записывать в перывании по захвату в счетчик TCNT1 значение 0, но посмотрел в документацию, получается, что прерывание срабатывает в момент переключения пина, а не счетчика, и в прескэйлере будет любое значение, и к моменту обнуления TCNT он уже может стать равным ICR+1, таким образом измерение будет менее точным, чем Вы предложили. Но тут надо аккуратно "разруливать" перехождение через 0, если практически одновременно произойдет прерывание по захвату и переполнению
|
|
|
|
|
Jul 24 2009, 09:01
|
Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518

|
Интересно если в режиме 12 (СТС) инициировать таймер то при захвате какие флаги включаются ? захват и переполнение, или только захват ? Соответсвенно какие прервания возникают ? захвата и потом переполнения или только захвата. Если только захвата, то о переполнение счетчика можно узнать по флагу , при этом запретить прерывание при перполнении, а при захвате если флаг выставлен игнорировать текущее значение ICR(оно неправльное), и сбрасывать флаг переполнения (ждать следующего значения- бес переполнения оно будет правильным)
|
|
|
|
|
Jul 24 2009, 09:36
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(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, если практически одновременно произойдет прерывание по захвату и переполнению Вот это - надо делать аккуратно в любом режиме таймера.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|