Здравствуйте товарищи. Столкнулся с очередной непоняткой. Настраиваю таймер2 в atmega8 на асинхронный режим. Прерывания идут по переполнению. Работает. Но когда я хочу чтоб прерывания работали не сразу, а по вызову из главной функции то ничего не работает. Подскажите как правильно это сделать?
Добавлено after 3 hours 31 minute 16 seconds:
Насколько я понял читая форумы, таймер в асинхронном режиме должен работать все время. Но как тогда управлять счетом?
Хочется всё и сразу, а получаешь нихрена и постепенно...
[uquote="Alek_von_German",url="/forum/viewtopic.php?p=3892019#p3892019"]... я хочу чтоб прерывания работали не сразу, а по вызову из главной функции...[/uquote] Не совсем понятно, что надо-то. Прерывания не вызываются откуда-то, для этого есть функции, прерывания возникают сами при достижении заданных условий. И отрабатывают свой код. Чтобы возникло прерывание по переполнению таймера, надо, чтобы он был запущен. В главной функции запускай таймер, разрешай прерывание. В теле прерывания останавливай таймер, обрабатывай прерывание или поднимай флаг, который отрабатывай в главной. Так?
для управления таймером в асинхронном режиме надо обеспечить синхронизацию записи/чтения с основным потоком - битик там есть специальный, надо его анализировать и читать/менять содержимое регистров только в те моменты, когда он имеет правильное состояние. поскольку мне лень лечить склероз, ни название битика, ни его правильное значение я вам не назову. да и сам алгоритм могу переврать... читайте даташит, там все объясняется - вот это 100% точно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="Alek_von_German",url="/forum/viewtopic.php?p=3892019#p3892019"]Но когда я хочу чтоб прерывания работали не сразу, а по вызову из главной функции то ничего не работает. Подскажите как правильно это сделать?[/uquote]
Прерывания вызываются железом. Когда они разрешены и достигнуто условие, именно железо делает переход по вектору прерывания. Вы наверное хотели сказать - включать таймер и его прерывания из функции можно. Проблем быть не должно.
[uquote="Alek_von_German",url="/forum/viewtopic.php?p=3892019#p3892019"]Насколько я понял читая форумы, таймер в асинхронном режиме должен работать все время. Но как тогда управлять счетом?[/uquote]
Работает он только тогда, когда вы его запустите. Счетом управлять точно также, как и в обычном синхронном режиме. Разница только в том, что он тактируется независимо от остальных тактовых сигналов и имеет независимый источник. Т.е. может работать пока проц полностью спит и т.д.
ТС, не надо ничего мудрить. Настраиваете таймер, не разрешая его прерывания. А когда захочется, разрешите прерывания от таймера2, предварительно сбросив флаг прерывания по переполнению.
Добавлено after 2 hours 40 minutes 49 seconds:
Спасибо большое, работает. Плюс я еще и ошибку в коде сделал, поцепил на одну кнопку и уменьшение значения и старт. Может мои потуги на самом деле были верны изначально. Приделал ваш код, стал проверять, а оно не хотит, потом уж досмотрел OKF, если не трудно, просветите, для чего настройки нужно дефайнить? Спасибо!
Добавлено after 37 minutes 55 seconds:
А, всё, я дочитался сам зачем дефайнить)) Ещё раз спасибо всем.
Хочется всё и сразу, а получаешь нихрена и постепенно...
Для наглядности, для железонезависимости.
Таймер оформлен отдельным файлом - rtc.c. Дефайны тоже отдельно - в rtc.h.
По совпадению - мне нужны были 10 мс метки.