|
|
  |
Менеджер прерываний, Как проще сделать? |
|
|
|
Sep 7 2007, 11:24
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(ivainc1789 @ Sep 7 2007, 14:41)  В задаче на ATmega16 есть необходимость посчитать кол-во импульсов на пине T1 за калиброванный интервал времени. Для этого организуется таймер1 как 24р. счетчик импульсов и необходимо сделать калиброванный интервал времени. Есть два подхода: 1. Сделать интервал без дополнительных ресурсов, запретив все прерывания и разрешив только от таймера 1 для инкремента 8р. старшего байта 24р. таймера по его переполнению. 2. Использовать другой таймер для "изготовления" калиброванного интервала. 3. Ваш вариант.
Интерес пока представляет первый вариант. ИМХО, в AVR очень тяжело запретить на небольшое время все прерывания, разрешив некоторые. Нужно мудрить некий менеджер прерываний, для чего вручную: сохранять статус текущих, потом все запрещать, потом разрешать необходимые. Все это как-то коряво и долго... Есть ли более простой подход для решения задачи? 1.Используйте режим захвата 2.Таймер 1 подсчета считает по кругу импульсы, а по прерыванию от другого таймера считывается содержимое Таймера1. Затем высчитываеие разность спредыдущим съемом. Выбирайте сами.
|
|
|
|
|
Sep 7 2007, 23:06
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата 2. Использовать другой таймер для "изготовления" калиброванного интервала. Я бы остановился на этом варианте. Только это у меня был бы не "калибровочный" таймер, а системный таймер, который бы отмерял интервалы в 1ms или 10ms. Цитата Нужно мудрить некий менеджер прерываний, для чего вручную.. Все зависит от точности которую вы хотите получить. Не исключен вариант, что и без "мудрежа", с разрешенными всеми прерываниями получится приемлемая точность.
|
|
|
|
|
Sep 8 2007, 18:15
|
Участник

Группа: Новичок
Сообщений: 23
Регистрация: 24-03-07
Пользователь №: 26 485

|
А зачем режим захвата? Т1 - это нога внешнего тактирования таймера, вот и считайте этим таймером на здоровье  . А интервал отмеряйте другим, и по прерыванию от него, считывайте значение счетчика.
|
|
|
|
|
Sep 9 2007, 11:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
И все же задам еще один вопрос здесь, чтобы не плодить отдельные топики. Теперь задача ставится несколько по-другому: необходимо считать длительность ОДНОГО периода на пине T1. Fbq = 11059200 Гц, на входе период 1.6 мкс. Код: Код __disable_interrupt(); do {} while (PIN(T1IN));// синхронизация с сигналом (фронт 01) do {} while (!PIN(T1IN)); Tmr1Start; do {} while (PIN(T1IN));do {} while (!PIN(T1IN));// один период на пине Tmr1Stop; __enable_interrupt(); На первый взгляд, должны в таймере получить Tin/(1/Fbq) = 1.6e-6*11059200 = 17.69, но на самом деле получаем 21, иногда 24. Источник сигнала - автогенератор. Вы скажете, что автогенератор нестабилен? Но чем тогда объяснить тот факт, что примерно на 10 исходов 21 приходится один 24. И НИКАКИХ ДРУГИХ РЕЗУЛЬТАТОВ за все время измерений/наблюдений!!! Есть ли здесь тонкости? Хочу сразу оговориться, что не собираюсь измерять такой период таким образом! Это просто отдельный вопрос не нашедший объяснения, не более того!
|
|
|
|
Guest_=AVR=_*
|
Sep 9 2007, 11:29
|
Guests

|
Все предельно просто - в зависимости от того, на какую фазу цикла ожидания придется физический фронт, и будет плясать "измеренное" время. Чтобы этого не было, следует использовать Capture
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|