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

Как Пользоваться Timer1, И Прерывание В Прерывании


Рекомендуемые сообщения

Приветствую всех!

У меня есть 2 вопроса по поводу использования функций МЕГИ 16:

1. Мне нужно использовать таймер1 следующим образом:

А) я его запускаю на постоянный счет. Считает с частотой 500кГц. При достижении значения 49, вызывается прерывание и выполняется что-то (очистка флага прерывания инт0, разрешение прерывания). Таймер продолжает считать дальше.

Б) При вызове прерывания по инт0, оно читает значение таймера, очищает и перезапускает его.

В) Если таймер переполнился до макс. значения (не вызвалось прерывание) - сделать то-то

Пункт Б и В мне ясен. Здесь мне несложно разобраться. Что касается пункта А. Вот скрин, скажите плиз, правильно ли я выставил настройки. Мне не понятно что такое noise canceller?? Читал ДШ, но не совсем понял...

post-19544-1262861521_thumb.jpg

Если все правильно, то в коде я разберусь)) Всегда возникают траблы почему-то с настройками и ничего не работает(

Вопрос2:

Вот у меня вызвалось прерывание инт0, в самом его конце написано обратится к такой-то функции. Назовем ее меню. В ф-и меню есть команда стартовать АЦ преобразование и дождаться результата преобразования Рез-т сохранить где-то. Потом в этой же ф-и перенастраиваю конфигурацию АЦП, стартую следующее преобразование и рез-т тоже сохраняю где-то. Вот я и думаю, если я вызываю ф-ю меню из обработчика прерывания и оцифровую сигнал. Чтобы считать значение этого сигнала я думаю использовать прерывание по приходу АЦ преобразования. То будут ли эти прерывания работать, будучи "как-бы" вызванными из прерывания инт0???

Может можно как-то отказаться от прерываний для считывания результата АЦП ?

Или альтернативный вариант решения дилемы...

Заранее благодарен :)

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

Сам механизм прерываний создан не для удобства, а для временных привязок (режим реального времени). если нет необходимости точной привязки, то достаточно программных вызовов...

戦う前に相手のベルトの色に注目

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

"...Вот скрин, скажите плиз, правильно ли я выставил настройки. Мне не понятно что такое noise canceller?? Читал ДШ, но не совсем понял..."

В данном случае Вы не работаете с режимом "захвата" значения таймера при поступлении активного фронта сигнала на вход ICP1 (или срабатывание аналогового компаратора, если он есть в данном камне), а 2-х разрядный счетчик "noise canceller" стоит именно в этой цепи и служит для устранения "дребезга" входного сигнала в течение 4-х тиков таймера.

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

Еще есть вопрос по поводу быстродействия:

Мне нужно произвести расчет по формуле:

Х=30 000 000/(У*2). У принимает значения от 1 до 65 535. Слышал, что операция деления занимает много времени. Насколько долго будет производится подобный расчет?

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

Вот здесь есть подпрограмма деления больших чисел на AVR. При меньших числах ее можно значительно сократить, при этом время нахождения результата уменьшится. Выполнение деления максимально возможного числа на 1 выполняется за 5761 такт. Ваш пример (30'000'000/2) выполняется за 1757 тактов.

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

Еще есть вопрос по поводу быстродействия:

Мне нужно произвести расчет по формуле:

Х=30 000 000/(У*2). У принимает значения от 1 до 65 535. Слышал, что операция деления занимает много времени. Насколько долго будет производится подобный расчет?

Дмитрий! Всегда в подобных ситуациях нужно адекватно оценивать потребную точность. Смешно считать 48...32 разрядные числа, когда входные переменные максимум 10-и, а то и реально 8-и разрядные... Даже с учетом накопления ошибок округления достаточно 16-ти. Но Вам виднее...

Кроме того по конкретному случаю.

30 миллионов имеют кратный степени двойки делитель 128, тогда разрядность первого операнда понижается на 7 - получается Х = 128*(234375/(У*2)) = 64*(234375/У).

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

При делении можно получить любую точность, достаточно продолжать деление после двоичной точки. Таким образом получить абсолютную точность при иррациональных двоичных числах не удается и вопрос разумного округления все равно остается... Так что думайте...

PS. И еще. При разноразрядных операндах при делении проще написать собственное деление, чем использовать стандартные проограммы. Алгоритм очень прост. Основное время в циклах занимают длинные вычитания и если делитель короче делимого, то экономия времени чрезвычайно велика, особенно когда разрядность делимого не кратна 8 (в приведенном случае получается 18). Вспомним, что количество циклов для целочисленного деления равно разрядности делимого, а разрядность вычитаний равна разрядности делителя (у Вас 16).

Общая рекомендация. Понизить разрядность константы до 16(поделив на 4), а результат умножить на 4 двумя левыми сдвигами (если это вообще нужно). Получится следующее: Х = 256*(58594/У). Ошибка составит 0,00043%.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

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

)))))))))))))))))))

Спасибо! Признаться честно, не все понял из вышеприведенного текста, но суть ясна! :) Эта операция используется вот для чего:

Я запускаю таймер и он тикает. Когда вызывается прерывание (приход. сигнал с трамблера), мы считываем текущее значение таймера (период счета) и вычисляем по вышеприведенному примеру значениечастоты вращения КВ))

Спасибо за дельный совет! О рез-тах отпишусь.

Изменено пользователем Дмитрий Андреевич
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...