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

|
Привет всем! Может кто-то использовал библиотеку от ТИ RTC_Calendar.h (slaa290). Неправильно устанавливается дата setDate( int year, char month, char day); Непойму в чем грабли.
|
|
|
|
|
Nov 4 2010, 18:43
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Nov 4 2010, 19:31
|
Гуру
     
Группа: Свой
Сообщений: 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 и.... понимаем, что лажу в параметрах указали. Цитата(tsbp @ Nov 4 2010, 23:43)  Да, год устанавливается правильно. Дальше идет пересчет дня недели, весокосный год, там лажа. Хотелось бы уточнить, какой именно пример и с какими именно компилятором вы используете? Проблема может быть в том, что в разных компиляторах используются разные способы (регистры, стековые переменные) передачи параметров в/из функции. Это особенно важно, когда функция написана на ASM, а не на Си.
|
|
|
|
|
Nov 4 2010, 19:59
|
Группа: Новичок
Сообщений: 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 и.... понимаем, что лажу в параметрах указали.  месяц задавал 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 работает без вопросов, хочется календарь еще. Спасибо.
|
|
|
|
|
Nov 4 2010, 21:07
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Nov 5 2010, 06:54
|
Группа: Новичок
Сообщений: 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 вроде стало нормально
|
|
|
|
|
Apr 10 2011, 06:35
|

Местный
  
Группа: Свой
Сообщений: 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) Не совсем понял эту ошибку, ибо в исходнике нет даже упоминания на этот сегмент. Что же не понравилось компилятору?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|