RTC с msp430 - PullRequest
       49

RTC с msp430

0 голосов
/ 29 июня 2011

Я уже задавал этот вопрос раньше, но думаю, что на этот раз я могу задать с большей ясностью.

Ниже приведен мой код теста RTC. Я использую msp430f5418 с IAR EW 5.

Моя проблема в том, что через некоторое время (мы проверили 15 минут и более), минутное прерывание наступает раньше, чем ожидалось.

т. Е. В первый раз, ровно через 60 секунд и через 15 минут, минутное прерывание наступает через 45 секунд.

Почему это так? Мы используем библиотеку, предоставленную TI для манипулирования регистром RTC.

Может кто-нибудь сказать мне, почему это так?

Это проблема с кодом, неправильным использованием библиотеки или самого оборудования ??

Заранее спасибо ...

#include <msp430.h>
#define RTC_VALID_READ_MAX_WAIT  500U
int main()
{
    WDTCTL = WDTPW + WDTHOLD;
    RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;
    RTCCTL01 |= RTCHOLD;
    /* Calling the routines in the workaround assembly module supplied by TI */
    SetRTCYEAR (2011U);
    SetRTCMON (6U);
    SetRTCDOW (3U);
    SetRTCDAY (4U);
    SetRTCHOUR (23U);
    SetRTCMIN (0U);
    SetRTCSEC (0U);
    RTCCTL01 &= ~RTCHOLD;
    __enable_interrupt();
    while(1)
    {
    }
}

#pragma vector=RTC_VECTOR
__interrupt void handle_rtc_interrupt(void)
{
    switch(RTCIV)
    {
        case 2U:  /* RTC one second Ready Event for valid read */
        {
            int wait_counter = 0U;
            while (!(RTCCTL01&RTCRDY)) /* Wait for RTCRDY to go high, so read will be valid. */
            {
                wait_counter++;
                if (wait_counter > RTC_VALID_READ_MAX_WAIT)
                {
                    break;
                }
            }
            if (wait_counter<=RTC_VALID_READ_MAX_WAIT)
            {
                volatile int min = RTCMIN;
                volatile int sec = RTCSEC;
            }
            RTCCTL01 |= RTCHOLD;
            RTCCTL01 &= ~RTCRDYIE;
            RTCCTL01 &= ~RTCHOLD;
            break;
        }
        case 4U:        /* RTC Minute Interval Event */
        {
            RTCCTL01 |= RTCHOLD;
            RTCCTL01 |= RTCRDYIE;  /* Enable Ready Flag Interrupt */
            RTCCTL01 &= ~RTCHOLD;
            break;
        }
        default:
        {
            break;
        }
    }
}

Hari

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

Я боюсь, что не могу помочь вам с отладкой кода, но я отказался от RTC в 5418, поскольку у меня были постоянные сбои в оборудовании. Это было еще в 2008 году, когда у меня был прототип и первый серийный кремний. Я не думаю, что ошибки RTC были полностью исправлены даже сейчас в стандартных (не А) комплектующих. Поскольку я должен был работать на любом производственном кремнии 5418 (любой уровень оборотов / ошибок маски) и переходить с процессора F2418 и F149, у меня уже был мягкий RTC и я просто вернулся к этому. Затраты на обработку и энергопотребление были минимальными.

1 голос
/ 27 февраля 2013

Постройте интервал между прерываниями по времени.Дайте остыть, перезапустите, но запустите фен и повторите сюжет.Если это изменится, вы получите температурный эффект на свой генератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...