Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с RTC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Zyoma
Вот все пытаюсь сделать RTC через Timer A на своем MSP430G2231.
Вот код:
Код
#include  <msp430g2231.h>

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    P1DIR |= 0x01;                            // P1.0 output
    CCR0 = 32768;                         //  Generate an interrupt every 32768 ACLK cycles.
    TACTL = TASSEL_1 + MC_1;              // 32 KHz ACLK, contmode
    CCTL0 = CCIE;                         // CCR0 interrupt enabled
    _BIS_SR(GIE);
    while (1) {}
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
}



По идее лампочка должна гореть ровно 1 сек., но горит она гораздо дольше. И еще, когда останавливаю дебаггер, программа перестает выполняться. Заранее спасибо за помощь.
rezident
Какой часовой кварц (тип/производитель) используете? У серии 2xxx это очень существенный фактор. Почитайте описание бага XOSC8 в errata. Убедитесь с помощью осциллографа, что у вас имеется генерация на кварце с частотой 32кГц. Хотя лучше/проще это будет сделать, если вывести частоту ACLK на пин P1.0, настроив его соответствующим образом.
По поводу остановки см. опции дебаггера. Там где-то есть управление тактовыми сигналами и таймерами. Их можно останавливать или не останавливать.
Zyoma
Спасибо большое.
Вроде нашел свою проблему:
Цитата
Function: Interrupt is lost (slow ACLK)
Description: Timer_A counter is running with slow clock (external TACLK or ACLK) compared to
MCLK. The compare mode is selected for the capture/compare channel and the CCRx
register is incremented by one with the occurring compare interrupt (if TAR = CCRx).
Due to the fast MCLK, the CCRx register increment (CCRx = CCRx + 1) happens before
the Timer_A counter has incremented again. Therefore, the next compare interrupt
should happen at once with the next Timer_A counter increment (if TAR = CCRx + 1).
This interrupt is lost.
Workaround: Switch capture/compare mode to capture mode before the CCRx register increment.
Switch back to compare mode afterward.


То есть мне надо переключиться в capture mode перед тем как я плюсую к CCR0, а после этого переключиться в compare mode. Как это реализовать? И как вывести частоту ACLK на P1.0?

Кварц:
Micro Crystal
MS3V-T1R 32.768kHz.
rezident
Цитата(Zyoma @ Oct 5 2011, 11:23) *
То есть мне надо переключиться в capture mode перед тем как я плюсую к CCR0, а после этого переключиться в compare mode. Как это реализовать?
Вопрос какой-то бессмысленный потому, что в приведенном вами коде с регистрами CCRх (в процессе счета таймера) никаких манипуляций не производится.
Цитата(Zyoma @ Oct 5 2011, 11:23) *
И как вывести частоту ACLK на P1.0?
Дык нужно настроить пин P1.0 на альтернативную функцию.
Код
P1SEL |= 1U<<0;
P1DIR |= 1U<<0;

Правда у вас там видимо светодиод находится?
Zyoma
Да, там светодиод.
rezident
Ну и пускай светодиод, ему от 32кГц не поплохеет. Просто проконтролируйте осциллом, что действительно частота 32768Гц, а кварц нормально генерит ее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.