Сбросить таймер на msp430

Использование CCS, встроенное программирование, MSP430F63736A

В моем приложении я использую Timer A для переключения светодиода (ON/OFF) в разное время.

Например: Светодиод горит - 0,5 сек. Светодиод не горит - 3 сек.

Мне нужно сбросить таймер, когда он достигнет значения в регистре TA1CCR0. Эти времена (0,5 с и 3 с) находятся в регистре TA1CCR0. Проблема в том, что если я изменю значение регистра TA1CCR0 с 0,5 сек до 3 сек, он будет считать от 0,5 до 3 сек. И мне нужны полные 3 секунды, поэтому мне нужен таймер сброса.

Это процедура прерывания, в которой я переключаю светодиод

    if (P4OUT == 0x00)
    {

        P4OUT ^= BIT6; // LED ON
        TA1CCR0 = (sekunda*t1);  //t1- 3 s.... pc 2s
    }

    else
    {

        P4OUT = 0x00;
        TA1CCR0 = (sekunda*t2);
    }
}

person user5939530    schedule 22.03.2016    source источник
comment
Какой режим таймера вы используете, повышающий или непрерывный? Почему? И почему вы не используете режим установки/сброса для CCR?   -  person CL.    schedule 22.03.2016
comment
Вы должны установить регистр счетчика таймера A (TAR) вместо регистра сравнения захвата, чтобы изменить значение счетчика. Перед этим лучше остановить таймер.   -  person Onur    schedule 22.03.2016


Ответы (2)


Какой режим счетчика вы используете? Вам нужно установить режим, записав в регистр TA1CTL. Режимы:

#define MC_0                (0x0000)  /* Timer A mode control: 0 - Stop */
#define MC_1                (0x0010)  /* Timer A mode control: 1 - Up to CCR0 */
#define MC_2                (0x0020)  /* Timer A mode control: 2 - Continuous up */
#define MC_3                (0x0030)  /* Timer A mode control: 3 - Up/Down */

«Непрерывный» режим обычно используется чаще всего. Считает до переполнения регистра таймера, затем перезапускается с нуля. Если он у вас включен, добавляйте в CCR постоянно, а не устанавливайте для него значение интервала:

TA1CCR0 += (sekunda*t1);

Вы также можете использовать режим «вверх». В этом случае счетчик таймера должен автоматически сбрасываться на ноль после достижения CCR. Если вы изменяете CCR в ISR, а затем, по-видимому, этого сброса не происходит, вы можете изменить регистр счетчика таймера (TAR или TA1R), вычитая значение самого короткого периода. Не устанавливайте регистр таймера просто в ноль, так как обычно это не очень хорошая практика кодирования: это открывает двери для накопления неточности синхронизации в случае, если вызовы ISR иногда задерживаются (например, потому что какое-то другое прерывание выполняется для нескольких тиков).

person kfx    schedule 22.03.2016
comment
используя режим UP, но когда я изменяю значение регистра TACCR0 с более низкого на более высокое значение в регистре TACCR0, таймер не ведет отсчет с 0, но продолжает отсчет с предыдущего значения - person user5939530; 22.03.2016
comment
@kfx Я еще этого не понимаю, но я помечаю свой комментарий для удаления. - person HeadCode; 24.03.2016

В вашем ISR добавьте смещение к TA1CCR0 и не сбрасывайте его:

Допустим, вам нужна задержка в 1 секунду после первого прерывания, и скажем, чтобы сгенерировать задержку в 1 секунду, таймер должен считать до 50000. Итак, что вам нужно сделать в ISR, это TA1CCR0 += 50000.

В твоем случае:

if (P4OUT == 0x00)
{

    P4OUT ^= BIT6; // LED ON
    TA1CCR0    +=    (sekunda*t1);  //t1- 3 s.... pc 2s
}

else
{

    P4OUT = 0x00;
    TA1CCR0    +=    (sekunda*t2);
}

}

Полный пример см.

person Amjad    schedule 30.03.2017