Страница 1 из 1

Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Вс сен 13, 2020 18:49:54
Alek_von_German
Здравствуйте товарищи. Столкнулся с очередной непоняткой. Настраиваю таймер2 в atmega8 на асинхронный режим. Прерывания идут по переполнению. Работает. Но когда я хочу чтоб прерывания работали не сразу, а по вызову из главной функции то ничего не работает. Подскажите как правильно это сделать?

void start (void)
{
ASSR =0x08;
TCNT2 =0x00;
TCCR2 =0b00000101;
TIFR=1<<TOV2;
TIMSK=1<<TOIE2;
sei();
}

Добавлено after 3 hours 31 minute 16 seconds:
Насколько я понял читая форумы, таймер в асинхронном режиме должен работать все время. Но как тогда управлять счетом?

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 07:40:45
AlexVi
[uquote="Alek_von_German",url="/forum/viewtopic.php?p=3892019#p3892019"]... я хочу чтоб прерывания работали не сразу, а по вызову из главной функции...[/uquote] Не совсем понятно, что надо-то. Прерывания не вызываются откуда-то, для этого есть функции, прерывания возникают сами при достижении заданных условий. И отрабатывают свой код. Чтобы возникло прерывание по переполнению таймера, надо, чтобы он был запущен. В главной функции запускай таймер, разрешай прерывание. В теле прерывания останавливай таймер, обрабатывай прерывание или поднимай флаг, который отрабатывай в главной. Так?

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 08:30:23
ARV
для управления таймером в асинхронном режиме надо обеспечить синхронизацию записи/чтения с основным потоком - битик там есть специальный, надо его анализировать и читать/менять содержимое регистров только в те моменты, когда он имеет правильное состояние. поскольку мне лень лечить склероз, ни название битика, ни его правильное значение я вам не назову. да и сам алгоритм могу переврать... читайте даташит, там все объясняется - вот это 100% точно.

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 08:47:39
NStorm
[uquote="Alek_von_German",url="/forum/viewtopic.php?p=3892019#p3892019"]Но когда я хочу чтоб прерывания работали не сразу, а по вызову из главной функции то ничего не работает. Подскажите как правильно это сделать?[/uquote]
Прерывания вызываются железом. Когда они разрешены и достигнуто условие, именно железо делает переход по вектору прерывания. Вы наверное хотели сказать - включать таймер и его прерывания из функции можно. Проблем быть не должно.

[uquote="Alek_von_German",url="/forum/viewtopic.php?p=3892019#p3892019"]Насколько я понял читая форумы, таймер в асинхронном режиме должен работать все время. Но как тогда управлять счетом?[/uquote]
Работает он только тогда, когда вы его запустите. Счетом управлять точно также, как и в обычном синхронном режиме. Разница только в том, что он тактируется независимо от остальных тактовых сигналов и имеет независимый источник. Т.е. может работать пока проц полностью спит и т.д.

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 10:38:26
OKF
ТС, не надо ничего мудрить. Настраиваете таймер, не разрешая его прерывания. А когда захочется, разрешите прерывания от таймера2, предварительно сбросив флаг прерывания по переполнению.

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 11:45:49
Alek_von_German
Спасибо за подсказки. Я как буду возле компьютера- попробую сделать так, как вы советуете. И скину исходник.

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 13:29:16
OKF
Там есть нюансик при инициализации асинхронного таймера. Сравните.

Код: Выделить всё

#define set_rtc_mode()      (ASSR = 1<<AS2, TCNT2 = 0)
#define set_rtc_divider()   (TCCR2A = 0<<WGM22 | 1<<WGM21 | 0<<WGM20, \
                             TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20)
#define set_rtc_counter()   (OCR2A = 32 - 1)
#define wait_rtc_update()   while (ASSR & (1<<TCN2UB | 1<<OCR2AUB | 1<<TCR2AUB))
#define set_rtc_interrupt() (TIFR2 = 1<<OCF2A, TIMSK2 |= 1<<OCIE2A)
#define RTC_ISR             TIMER2_COMPA_vect

void rtcInit()
{
  set_rtc_mode();
  wait_rtc_update();
  set_rtc_divider();
  wait_rtc_update();
  set_rtc_counter();
  wait_rtc_update();
  set_rtc_interrupt();
}

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Пн сен 14, 2020 17:39:31
Alek_von_German
Это, выходит таймер работает по совпадению здесь?

Добавлено after 2 hours 40 minutes 49 seconds:
Спасибо большое, работает. Плюс я еще и ошибку в коде сделал, поцепил на одну кнопку и уменьшение значения и старт. Может мои потуги на самом деле были верны изначально. Приделал ваш код, стал проверять, а оно не хотит, потом уж досмотрел :)) :roll:
OKF, если не трудно, просветите, для чего настройки нужно дефайнить? Спасибо!

Добавлено after 37 minutes 55 seconds:
А, всё, я дочитался сам зачем дефайнить)) Ещё раз спасибо всем.

Re: Асинхронный режим timer2 atmega8, вызов из функции

Добавлено: Вт сен 15, 2020 08:01:10
OKF
Для наглядности, для железонезависимости.
Таймер оформлен отдельным файлом - rtc.c. Дефайны тоже отдельно - в rtc.h.
По совпадению - мне нужны были 10 мс метки.