Приветствую всех ещё раз.

Теперь я написал программу, по нажатию кнопки меняющая скорость мигания светодиодам.
Работает так:
- нажал на кнопку - и мигание происходит в 2 раза быстрее.
- и так далее, пока мигание не станет максимально быстрым. Если мигание самое быстрое, то при очередном нажатии кнопки мигание светодиодами становится самым медленным.
При "нормальной" работе требуется 6 нажатий, для прохода от самого медленного мигания до самого медленного же, по кругу.
Работает.

Проблема в том, что для прохода от самого медленного мигания до самого медленного же по кругу, проходит разное количество нажатий - то 6, то 5, а то и 4.
Никак не могу понять, в чём дело.
Пробовал сбрасывать таймер, останавливать вручную прерывания (при обработке прерываний) - нивкакую.
Подскажите, в чём проблема.
P.S.Код привёл. В нём то, что я добавил для отладки, я отметил пустым //.
Спойлер
#include "io430g2553.h"
unsigned int maxPause=0x1F;//FFF;
unsigned int maxDelitel = 16;
unsigned int i_time = 0, i_delitel = 1;
void timer_run();
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//готовим порт с диодам
P1DIR = (BIT0 + BIT6); //инициализируем выходы 0 и 6
P1OUT = BIT6; //ставим выход 6 в 1
//готовим таймер
CCTL0 = CCIE; //разрешаем прерывание по переполнению счётчика-таймера
timer_run();
__enable_interrupt(); //глобально разрешаем прерывания в status register
//готовим кнопку
P1REN |= BIT3; //разрешаем подтяжку
P1OUT |= BIT3; //подтяжка вывода P1.3 вверх, иначе будет всегда срабатывать if ((P1IN & BIT3) == 0)
P1IFG &= ~BIT3; // Очистка флага прерываний для P1.3
// P1IES |= BIT3; // Прерывание происходит по 1/0 (отпусканию/нажатию)
P1IE |= BIT3; //разрешаем прерывание для P1.3
while(1);
}
//
void timer_run()
{
TACTL = 0; //останов таймера
//используются три системных тактовых сигнала: ACLK, MCLK и SMCLK и INCLK (INCLK is device-specific)
TACTL = (TASSEL_2 + MC_2 + ID_0); //ставим источник тактов на SMCLK, и режим таймера - continuous, и делитль =1 (1 2 4 
}
//прерывание по таймеру используем для вкл/выкл с/диодов
#pragma vector = TIMER0_A0_VECTOR //приоритет 0xFFF0
__interrupt void TIMER0_A0_PRE (void)
{
//
__disable_interrupt(); //глобально запрещаем прерывания в status register
i_time += i_delitel;
if (i_time >= maxPause)
{
P1OUT ^= (BIT0 + BIT6);
i_time = 0;
}
//
__enable_interrupt(); //глобально разрешаем прерывания в status register
}
//прерывание по кнопке используем для игр с паузой
#pragma vector = PORT1_VECTOR //приоритет 0xFFE4
__interrupt void PORT1_VECTOR_PRE (void)
{
//
__disable_interrupt(); //глобально запрещаем прерывания в status register
P1IE &= ~BIT3; // Запрет прерываний на P1.3
if (i_delitel<=maxDelitel) i_delitel *= 2;
else i_delitel = 1;
P1IFG &= ~BIT3; // Очистка флага прерываний для P1.3, т.к. это прерывание имеет несколько флагов
P1IE |= BIT3; // Разрешение прерываний на P1.3
timer_run();
//
__enable_interrupt(); //глобально разрешаем прерывания в status register
}