Глобальная переменная delay_timer
разделяется между кодом прерывания и без прерывания.Он должен быть объявлен как volatile
, так как значение может меняться за пределами delay()
.
Если вы посмотрите на сгенерированный код для delay()
, вы, вероятно, увидите, что значение delay_timer отсутствуетперечитайте во время вращения в цикле while
.
Кроме того, volatile
недостаточно.У вас есть код без прерываний и код прерывания, записывающие одну и ту же переменную (delay_timer).Вам нужно защитить записи в переменную в коде без прерываний, там есть условие гонки.Простой / ленивый способ - отключить прерывания и восстановить их в коде без прерываний.
(Что касается настройки прерываний и запуска таймера, эта информация должна быть в таблице данных чипа. Обычно это частьэто легче сделать правильно, это общедоступные данные, которые кусают людей.)