По логіці роботи програми. Використовуються два таймери - 0 та 2. Таймер0 викорисовується лише для запуску перетворень АЦП. В обробнику переривань від АЦП обчислюється напруга мережі 220В, детектується перехід через "0", та виконується ПІД-синхронізація частоти другого таймера до частоти мережі. Таймер0 налаштовано на частоту 5 кГц (період 200 мкс) - в 100 разів більше від частоти мережі. Десь читав, що треба 100+ разів від частоти вимірюваної напруги. Тобто треба збільшити частоту? Таку частоту не можна задати віртуальному таймеру - треба шукати інші можливості для запуску АЦП з потрібною частотою. Зідно налаштувань таймера - в дійсності його частота в два рази менша, тобто період 400 мкс. Можливо помилка налаштування. Таймер2 працює з частотою 50 Гц (період 20 мс), в процссі роботи підстроюється під частоту мережі. В обробнику переривань теймеру2 виконуються: - Razgon_() - управління релє - якщо pdm, то PDM_() - твердотільне релє, щось там рахують і міняють прапорець ,по якому вже буде TURN_SSR_ON чи TURN_SSR_OFF - інвертується флаг напівволни мережевої напруги (?) - завантажуєтся нове значення в дільник таймеру2 - рахуються періоди до секунди. коли секунда: - оновлення дісплею(?) - контролюється таймаут меню - контроль таймауту для усарт - відсилання репорту на ADprotocol - Buttons_() - опитування кнопок. Зроблю: один VT на 50 Гц - релюхі другий VT на 1 сек третій VT на 50 Гц - кнопки. або, краще, окремий потік. ----- Опитування кнопок - евенти https://www.playembedded.org/blog/mastering-exti-chibios-pal/ ----- 20.11.2023 На цьому - все. тут тупік. воно не робить - скоріш за все прибрав щось зайве, код такий, що розбиратись в ньому немає жодного бажання. краще почати з 0.