Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Slaa290 RTC Calendar
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
tsbp
Привет всем!
Может кто-то использовал библиотеку от ТИ RTC_Calendar.h (slaa290). Неправильно устанавливается дата setDate( int year, char month, char day);
Непойму в чем грабли.
rezident
В чем выражается неправильность?
tsbp
Цитата(rezident @ Nov 4 2010, 21:22) *
В чем выражается неправильность?

Вроде все просто setDate( int year, char month, char day);
Пишем например setDate( 0x2010, 0x10, 0x03);
В переменных TI_day, TI_dayOfWeek, TI_month, TI_year получаем значения не имеющие ничего общего с заявленными. после инкркмента дня переменные приобретают логический смыл.
Пробовал задавать поразному setDate( 2010, 10, 3); результат одинаковый. Проблема реально в коде RTC_Calendar.s43. Рылся в инете.
Нашел вот что
"I know this thread is kind of old, but I thought you should know that if you are using the RTC_Calendar.s43 module, you will need to modify the "setDate (y, m, d)" function. It is erroneous.

In particular, there is an instruction that modifies R10 ("add.w r10, r11"), but R10 is never pushed. To fix this, add a "Push R10" at the beginning and a "Pop R10" at the end.
"
Может это в старой версии библиотеки, проверил все врое есть "Push R10" "Pop R10"


Да, год устанавливается правильно. Дальше идет пересчет дня недели, весокосный год, там лажа.
rezident
Цитата(tsbp @ Nov 4 2010, 23:43) *
Пишем например setDate( 0x2010, 0x10, 0x03);
В переменных TI_day, TI_dayOfWeek, TI_month, TI_year получаем значения не имеющие ничего общего с заявленными. после инкркмента дня переменные приобретают логический смыл.

Смотрим прототип функции, читаем комментарий
Код
extern void setDate( int year, char month, char day);  //encoded as decimal numbers with Jan = 1 and 1st day = 1, 31st day = 31
и.... понимаем, что лажу в параметрах указали. laughing.gif
Цитата(tsbp @ Nov 4 2010, 23:43) *
Да, год устанавливается правильно. Дальше идет пересчет дня недели, весокосный год, там лажа.
Хотелось бы уточнить, какой именно пример и с какими именно компилятором вы используете? Проблема может быть в том, что в разных компиляторах используются разные способы (регистры, стековые переменные) передачи параметров в/из функции. Это особенно важно, когда функция написана на ASM, а не на Си.
tsbp
Цитата(rezident @ Nov 4 2010, 22:31) *
Смотрим прототип функции, читаем комментарий
Код
extern void setDate( int year, char month, char day);  //encoded as decimal numbers with Jan = 1 and 1st day = 1, 31st day = 31
и.... понимаем, что лажу в параметрах указали. laughing.gif

месяц задавал 0х10, 10 или 1, в TI_dayOfWeek получал 0х50
Код
хотя "char TI_dayOfWeek;   // 0 - 6 .. Sunday = 0"

но дело не в том

Цитата(rezident @ Nov 4 2010, 22:31) *
Хотелось бы уточнить, какой именно пример и с какими именно компилятором вы используете? Проблема может быть в том, что в разных компиляторах используются разные способы (регистры, стековые переменные) передачи параметров в/из функции. Это особенно важно, когда функция написана на ASM, а не на Си.

Хотел применить в простеньком приборе. Но с примером из архива ТИ такая же фигня. Пользуюсь IAR C/C++ Compiler for MSP430 4.21.2 [Evaluation] (4.21.2.20066)
Код
//******************************************************************************
//  MSP-RTC Demo - Using Timer_A for 1 second interrupt
//
//  Description; This example shows the correct setup and usage of the RTC
//  Library without automatic ISR generation.  LED is toggled on each second
//
//           MSP430F149
//         ---------------
//     /|\|            XIN|-
//      | |               | 32kHz
//      --|RST        XOUT|-
//        |               |
//        |           P1.0|-->LED
//
//  L. Westlund
//  Texas Instruments, Inc
//  January 2005
//  Updated for IAR Embedded Workbench Version: 2.21B
//******************************************************************************

#include  <msp430x16x.h>
#include  "RTC_Calendar.h"


void main ( void )
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  setTime( 0x12, 0, 0, 0);              // initialize time to 12:00:00 AM
  
  setDate(2010, 1,1); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
  P1DIR |= 0x01;                        // Set P1.0 to output direction
  CCR0 = 32768-1;
  TACTL = TASSEL_1+MC_1;                // ACLK, upmode
  CCTL0 |= CCIE;                        // enable CCRO interrupt
  _EINT();

  while( 1 )
  {
    LPM3;                               // enter LPM3, clock will be updated
    P1OUT ^= 0x01;                      // do any other needed items in loop
    _NOP();                             // set breakpoint here to see 1 second interrupt
  }
}


// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  incrementSeconds();
  LPM3_EXIT;
}

что-то типа этого на работе пробовал, убирал оптимизацию.
с программой все просто скопировал, подключил .s43 скомпилировалось без проблем, setTime работает без вопросов, хочется календарь еще.
Спасибо.
rezident
Как я и предполагал проблема возникает при передаче параметров из СИ-шного модуля в ASM-функцию. У меня IAR EW430 5.10.6. В нем передача параметров в функцию setDate происходит через регистры R14, R13, R12.
Код
//   31   setDate(2010, 1, 1); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        MOV.B   #0x1, R14
        MOV.B   #0x1, R13
        MOV.W   #0x7da, R12
        CALL    #setDate

А в самой функции извлечение аргументов идет из R15, R14, R12
Код
            mov.b   r15,     r6    ; day into r6
            mov.b   r14,     r7    ; month into r7
            mov.w   r12,     r8    ; year into r8

Отсюда и вылезают неправильные вычисления. После верного указания регистров в функции, инициализация заработала корректно
Код
            mov.b   r14,     r6    ; day into r6
            mov.b   r13,     r7    ; month into r7
            mov.w   r12,     r8    ; year into r8

Правда в окне просмотра значений переменных C-CPY наблюдается некоторая неувязочка. Большинство переменных календаря отображаются как int, хотя описание всех их (кроме TI_year) идет как char. Опять какой-то глюк. Видимо от того, что переменные определены только в ASM. cranky.gif
tsbp
Цитата(rezident @ Nov 5 2010, 00:07) *
Правда в окне просмотра значений переменных C-CPY наблюдается некоторая неувязочка. Большинство переменных календаря отображаются как int, хотя описание всех их (кроме TI_year) идет как char. Опять какой-то глюк

та же фигня.

Но все получилось. Задача была решаема. Но я бы потратил намного больше времени на ее решение. Спасибо за быстрое решение и за совет по передаче параметров в asm функции.

Еще прикол неправильно устанавливается день недели
земенил
Код
mov.b   r10,     TI_mNumbers(r7)

на
Код
mov.b   TI_mNumbers(r7),   r10

вроде стало нормально
kanzler
Цитата(tsbp @ Nov 4 2010, 23:06) *
Может кто-то использовал библиотеку от ТИ RTC_Calendar.h (slaa290).


Сейчас её использую. Чип CC430F6137, компилятор IAR 5.20.
При компиляции выводит сообщение - Fatal Error[e72]: Segment DATA20_I must be defined in a segment definition option (-Z, -b or -P)
Не совсем понял эту ошибку, ибо в исходнике нет даже упоминания на этот сегмент. Что же не понравилось компилятору?
jorikdima
Цитата(kanzler @ Apr 10 2011, 10:35) *
Сейчас её использую. Чип CC430F6137, компилятор IAR 5.20.
При компиляции выводит сообщение - Fatal Error[e72]: Segment DATA20_I must be defined in a segment definition option (-Z, -b or -P)
Не совсем понял эту ошибку, ибо в исходнике нет даже упоминания на этот сегмент. Что же не понравилось компилятору?

При компиляции или линковке? Если компиляции, то какого модуля?
Вообще это ошибка появляется когда вы используете данные выше 64к или инструкции ядра MSP430X а в настройках проекта указали модель памяти small.
kanzler
Цитата(jorikdima @ Apr 10 2011, 11:58) *
При компиляции или линковке? Если компиляции, то какого модуля?
Вообще это ошибка появляется когда вы используете данные выше 64к или инструкции ядра MSP430X а в настройках проекта указали модель памяти small.

При линковке. Но я уже разобрался с этим :-) Спасибо за вашу помощь. Так и есть, изменив модель памяти, всё стало линковаться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.