Очень красивая иллюстрация того, как нельзя делать.
Переменная timer у Вас модифицируется в прерывании, а анализируете ее в основном цикле. Представьте, что во время анализа (число двухбайтовое) произошло прерывание таймера и переменная изменилась. Программа возвращается в основной цикл, продолжает анализ
Какой переменной ? Той, что она достала из стека при восстановлении контекста или той, что уже изменилась? Даже задумываться не хочу...
Переменная меняется в прерывании - вот в прерывании ее и сравнивайте. По событию сравнения выставьте флаг - и именно его уже смотрите в основном цикле.