реклама на сайте
подробности

 
 
> "Быстрое" прерывание
Salazar
сообщение Jul 7 2007, 07:34
Сообщение #1





Группа: Новичок
Сообщений: 11
Регистрация: 30-06-07
Пользователь №: 28 801



Здравствуйте, подскажите пожалуйста как сделать быстрое (Т=1мс) прерывание на MSP430F149.
Сейчас делаю так:
TBCTL = CNTL_3 + TBSSEL_1 + MC_1;
TBCCR0 = 33; //32768/1000
TBCCTL0 = CCIE;

#pragma vector = TIMERB0_VECTOR
__interrupt void TIMERB0_VECTOR_code( void )
{
rtc_msec++;
}

Частота ACLK = 32768. При периоде прерывания в Т=10мс основная программа работает, при уменьшении периода до 5мс основной цикл уже не выполняется. (Похоже, что программа "задыхается" в обработчике прерывания и процессор рестартится).

Ещё раз вопрос:
Как правильно сделать прерывание с периодом T=1мс на MSP430F149 ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Salazar
сообщение Jul 7 2007, 23:10
Сообщение #2





Группа: Новичок
Сообщений: 11
Регистрация: 30-06-07
Пользователь №: 28 801



Видимо, как и положено начинающему, я неправильно инициализирую процессор. Может у кого есть пример, ка завести МСП430Ф149 на частоте достаточной для моего (1мс) прерывания не используя внешний кварц?

Систему тактирования сейчас инициализирую так:

// Может, моя проблема в значении параметра Delta?
Delta = 375;
BCSCTL1 &= 0xc0; //Set ACLCK to 32768 and rsel to 0
BCSCTL1 |= 0x21; //Now Set ACLCK to 32768/4 and rsel to 7!
CCTL2 = 0x5100; // CCR2 forced into Rising adge, source is aclock, set capture mode
TACTL = 0x220; // System clock as input to counter cont. UP counting.
TACTL |= 0x4; //Reset Counter

DCOCTL=0x80;
do {
Ovf2=0;
while (((CCTL2 & 0x01) != 0x01) && (Ovf2++ <30000)); // Wait until capture occured!
CCTL2 &= 0xfffe ; // Capture occured, clear flag and overflow
Compare = CCR2; // Get current captured SMCLK
Gap = Compare - Oldcapture; // SMCLK difference
Oldcapture = CCR2; // Save current captured SMCLK
R_Sel=BCSCTL1&0x07;
if(Delta == Gap) {
Err=0; break;
}
else if (Delta < Gap) { // DCO is too fast, slow it down
DCOCTL--;
if (DCOCTL ==0xff && R_Sel>0)BCSCTL1--; // Did DCO role under? Select next lower RSEL
}
else {
DCOCTL++;
if (DCOCTL ==0x00 && R_Sel<7)BCSCTL1++; // Did DCO role over?
}
}while(++Ovf<30000);
CCTL2 = 0; // Stop CCR2 function
TACTL = 0; // Stop Timer_A

BCSCTL1 &= 0xcf; // Set ACLCK to 32768

Сообщение отредактировал Salazar - Jul 7 2007, 23:19
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 9 2007, 06:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Salazar @ Jul 8 2007, 02:10) *
Может у кого есть пример, ка завести МСП430Ф149 на частоте достаточной для моего (1мс) прерывания не используя внешний кварц?

Я просто делаю DCO немного быстрее, с запасом относительно частоты 8 МГц, чтобы ее не превысить при изменении температуры и прочих факторов, и проверяю наличие генерации кварца.

Код
void ClockConfiguration(void)
{    //    DCOCTL= 0x56;                // without change after reset
    BCSCTL1=0x87;                //  CPU faster  RSEL=7
                                // XT2 off, XT1 - low frequency
...                                // divider for ACLK = 1
}

void CheckOscillator(void)
{    OnWorkRed1;
do  {
    TACTL=TASSEL_1+TACLR+MC_2;    //    Timer A counts ACLK clocks continuos
    for (del=0;del<31000;del++)       PulseWDI  ;    //105 ms
      TACTL=TASSEL_1+MC_0;            // stop timer
    del=TAR;
    ToggleWorkRed;
    }
while ((del<5000) | (del>8000));
    OffWork;    
...
};


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 17:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016