nanorobot 1 June 7, 2017 Posted June 7, 2017 (edited) · Report post На вход 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(); счета нет совсем. то есть опять таки ненулевой таймаут не отоабатывает Edited June 7, 2017 by nanorobot Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 93 June 7, 2017 Posted June 7, 2017 · Report post А прерывание системного таймера вызывается? Quote Share this post Link to post Share on other sites More sharing options...
nanorobot 1 June 7, 2017 Posted June 7, 2017 (edited) · Report post А прерывание системного таймера вызывается? похоже я его запретил, когда разрешал прерывание от IC. посыпаю голову пеплом (надо было TIMSK |= (1 << TICIE1);) Edited June 7, 2017 by nanorobot Quote Share this post Link to post Share on other sites More sharing options...