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

 
 
 
Reply to this topicStart new topic
> Slaa290 RTC Calendar
tsbp
сообщение Nov 4 2010, 18:06
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-10
Пользователь №: 60 649



Привет всем!
Может кто-то использовал библиотеку от ТИ RTC_Calendar.h (slaa290). Неправильно устанавливается дата setDate( int year, char month, char day);
Непойму в чем грабли.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 4 2010, 18:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В чем выражается неправильность?
Go to the top of the page
 
+Quote Post
tsbp
сообщение Nov 4 2010, 18:43
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-10
Пользователь №: 60 649



Цитата(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"


Да, год устанавливается правильно. Дальше идет пересчет дня недели, весокосный год, там лажа.

Сообщение отредактировал tsbp - Nov 4 2010, 18:45
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 4 2010, 19:31
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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, а не на Си.
Go to the top of the page
 
+Quote Post
tsbp
сообщение Nov 4 2010, 19:59
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-10
Пользователь №: 60 649



Цитата(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 работает без вопросов, хочется календарь еще.
Спасибо.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 4 2010, 21:07
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Как я и предполагал проблема возникает при передаче параметров из СИ-шного модуля в 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
Go to the top of the page
 
+Quote Post
tsbp
сообщение Nov 5 2010, 06:54
Сообщение #7





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-10
Пользователь №: 60 649



Цитата(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

вроде стало нормально
Go to the top of the page
 
+Quote Post
kanzler
сообщение Apr 10 2011, 06:35
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(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)
Не совсем понял эту ошибку, ибо в исходнике нет даже упоминания на этот сегмент. Что же не понравилось компилятору?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Apr 10 2011, 06:58
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(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.
Go to the top of the page
 
+Quote Post
kanzler
сообщение Apr 10 2011, 11:45
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



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

При линковке. Но я уже разобрался с этим :-) Спасибо за вашу помощь. Так и есть, изменив модель памяти, всё стало линковаться.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 10:58
Рейтинг@Mail.ru


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