nanorobot 6 7 июня, 2017 Опубликовано 7 июня, 2017 (изменено) · Жалоба На вход Input Capture поступат импульсы от детектора перехода через ноль сетевого напряжения. Цель - определть момен пропадания этого нпряжения. в процессе с наименьшим приоритетом выполняется следующий фрагмент. Print() выводит на LCD значение счетчика. Счет в плюс выполняется с правильной частотой. Если перемыкаю выход оптрона детектора, счет останавливается, но счетчик не сбрасывается в 0, как ожидалось. Частота системного тика близка к 1000 Гц. То есть wait() c ненулевым таймаутом ждет event бесконечно... ev_psync - поле класса, но полагаю, это не имеет значения... bool ok; TIMSK= (1 << TICIE1); // разрешим прерывания PSYNC while(1){ ok = ev_psync.wait(10); if(ok){ psync_cnt++; ev_psync.clear(); // добавил на всякий случай, не помогло } else psync_cnt = 0; Print(); } обработчик прерывания: OS_INTERRUPT void TIMER1_CAPT_vect() { OS::TISRW_SS ISRW; ENABLE_NESTED_INTERRUPTS(); cc.ev_psync.signal_isr(); } переделал так: OS::sleep(10); ok = ev_psync.is_signaled(); if(ok){ ev_psync.clear(); psync_cnt++;} else{ psync_cnt = 0;} Print(); счета нет совсем. то есть опять таки ненулевой таймаут не отоабатывает Изменено 7 июня, 2017 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 157 7 июня, 2017 Опубликовано 7 июня, 2017 · Жалоба А прерывание системного таймера вызывается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 7 июня, 2017 Опубликовано 7 июня, 2017 (изменено) · Жалоба А прерывание системного таймера вызывается? похоже я его запретил, когда разрешал прерывание от IC. посыпаю голову пеплом (надо было TIMSK |= (1 << TICIE1);) Изменено 7 июня, 2017 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться