На вход 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();
счета нет совсем. то есть опять таки ненулевой таймаут не отоабатывает
Сообщение отредактировал nanorobot - Jun 7 2017, 09:44