MSP430 Timer_A - шкала регистра

программирование на MSP430 в CCS

С помощью Timer_A, ACLK и его прерывания помигать светодиодом (сейчас просто моргает-тоже давно оторвался-то же время включился).

Этот код мигает светодиодом с задержкой в ​​2 секунды. Проблема в том, что регистр TA1CCR0 может иметь максимальное значение 0xFFFF= 65535 (2 секунды для ACLK). И для моего приложения (мигающий светодиод - это только пример) мне понадобится шкала от 1 секунды до 999 секунд. (6-7 строки в коде). Как я могу это сделать? Является ли это возможным?

#include <msp430.h> 
#include <msp430f6736.h>

void CfgTA(unsigned long delayCycles)
{
    int t2=2;  // must be variable from 1 to 999
    t2=delayCycles*t2;
    TA1CCTL0 |= CCIE;   //Enable Interrupts on Timer
    TA1CCR0 = t2-1;     //Number of cycles in the timer
    TA1CTL |= TASSEL_1 | MC_1;  //ACLK , UP mode

}

void ledblink()
{
    //LED config
     P4DIR |= BIT6;
     P4OUT &= ~BIT6;

     CfgTA(32768);  //Timer configuration to blink every 1 sec
    while (1)
    {
        _bis_SR_register(LPM3_bits + GIE); //Enter Low Power Mode 3 with interrupts
    }

}


#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer_A0(void)
{

   P4OUT ^= BIT6;   // Swapping on/off LED
}


int main(void) {
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

    ledblink();

    return 0;
}

person M.Scottman    schedule 27.11.2015    source источник
comment
Самый простой способ? Добавьте счетчик в свое прерывание и подсчитайте прошедшую секунду...   -  person LPs    schedule 27.11.2015
comment
^ может быть, это было слишком очевидно :)   -  person Martin James    schedule 27.11.2015
comment
ЭТО — хорошее руководство, чтобы понять, как работает таймер. Регистры CCRx творят чудеса.   -  person LPs    schedule 27.11.2015
comment
Извините, Lps, но я не понимаю. Как считать прошедшие секунды?   -  person M.Scottman    schedule 27.11.2015
comment
Мне не нужно считать секунды. Мне нужно войти в значение TACCR0, чтобы включить светодиод, т.е. 999 сек.   -  person M.Scottman    schedule 27.11.2015


Ответы (2)


как считать секунды на 1-секундном прерывании.

1) инициализировать прерывание, которое будет происходить каждую секунду, и перезагрузить его регистр таймера/счетчика

2) установите глобальную переменную на количество секунд для задержки:

int delaySeconds = 10;

3) внутри функции прерывания

static int count =0;
count++;
if( count >= delaySeconds )
{
    count = 0;
    P4OUT ^= BIT6;   // Swapping on/off LED
}

Я думаю, что функция прерывания перед выходом также должна очистить флаг ожидания прерывания time1

person user3629249    schedule 27.11.2015

На вашем MSP430 вы можете замедлить ACLK с помощью поля DIVA в регистре UCSCTL5, и вы можете дополнительно разделить ввод часов таймера с помощью полей ID и IDEX в регистрах TAxCTL и TAxEX0.

С входом таймера, разделенным до 16 Гц, вы сможете считать до 4096 секунд.

person CL.    schedule 27.11.2015
comment
Большое спасибо, знал об ID и IDEX, но не знал о UCSCTL5 :)... Теперь все работает - person M.Scottman; 29.11.2015