реклама на сайте
подробности

 
 
> Менеджер прерываний, Как проще сделать?
ivainc1789
сообщение Sep 7 2007, 10:41
Сообщение #1


Профессионал
*****

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



В задаче на ATmega16 есть необходимость посчитать кол-во импульсов на пине T1 за калиброванный интервал времени. Для этого организуется таймер1 как 24р. счетчик импульсов и необходимо сделать калиброванный интервал времени. Есть два подхода:
1. Сделать интервал без дополнительных ресурсов, запретив все прерывания и разрешив только от таймера 1 для инкремента 8р. старшего байта 24р. таймера по его переполнению.
2. Использовать другой таймер для "изготовления" калиброванного интервала.
3. Ваш вариант.

Интерес пока представляет первый вариант. ИМХО, в AVR очень тяжело запретить на небольшое время все прерывания, разрешив некоторые. Нужно мудрить некий менеджер прерываний, для чего вручную: сохранять статус текущих, потом все запрещать, потом разрешать необходимые. Все это как-то коряво и долго... Есть ли более простой подход для решения задачи?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ivainc1789
сообщение Sep 9 2007, 11:08
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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. И НИКАКИХ ДРУГИХ РЕЗУЛЬТАТОВ за все время измерений/наблюдений!!! Есть ли здесь тонкости?
Хочу сразу оговориться, что не собираюсь измерять такой период таким образом! Это просто отдельный вопрос не нашедший объяснения, не более того!
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 9 2007, 13:53
Сообщение #3


кекс
******

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



Цитата(ivainc1789 @ Sep 9 2007, 14:08) *
Есть ли здесь тонкости?

Есть, тут уже действуют времена исполнения команд.
Поэтому лучше ловить не длительность одного импульса, а длительность нескольких идущих подряд импульсов, например 100, результирующую длительность делить на 100.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 10 2007, 06:01
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(defunct @ Sep 9 2007, 17:53) *
Есть, тут уже действуют времена исполнения команд.
Поэтому лучше ловить не длительность одного импульса, а длительность нескольких идущих подряд импульсов, например 100, результирующую длительность делить на 100.

Я согласен, но с одной оговоркой. Если у автора топика разовое или конечное измерение, то это некорректно. Автору видней.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016