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

 
 
> Проблема с sscanf_P, или StringToInt
alux
сообщение Dec 21 2007, 07:38
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Для преобразования строки в целое число попробовал сделать так:
Код
sscanf_P(lcd_buf, "%d", &mn);
printf_P("\n\rMONTH %d", mn);
...................
sscanf_P(lcd_buf, "%d", &dt);
printf_P("\n\rDATE %d", dt);
....................
sscanf_P(lcd_buf, "%d", &yr);
printf_P("\n\rYEAR %d", yr);
rtc_set_time(0,min,hr,dy,dt,mn,yr-2000);

Терминал честно выводит переменную yr= 2007. Точно так же делаю с другими переменными времени. Проблема в том, что эти переменные не пишутся в RTC. Вернее пишут, но 0. Точнее записалось только значение года ("2007").Хотя если явно инициализировать эти переменные какими-то значениеми или преобразовать с помощью ф-ции StrToInt(), то эти "какие-то"значения или результат ф-ции StrToInt() запишутся без проблем в RTC. В ф-ции rtc_set_time() каждое значение делается dec2bcd. В чем дело?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dog Pawlowa
сообщение Dec 21 2007, 12:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(alux @ Dec 21 2007, 11:38) *
Проблема в том, что эти переменные не пишутся в RTC. Вернее пишут, но 0. Точнее записалось только значение года ("7").Хотя если явно инициализировать эти переменные какими-то значениеми или преобразовать с помощью ф-ции StrToInt(), то эти "какие-то"значения или результат ф-ции StrToInt() запишутся без проблем в RTC. В ф-ции rtc_set_time() каждое значение делается dec2bcd. В чем дело?

А почему Вы решили, что RTC способен принять это значение года одной переменной?
Какой RTC вы используете? Как кодируется год в нем?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
alux
сообщение Dec 21 2007, 13:21
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(Dog Pawlowa @ Dec 21 2007, 16:17) *
А почему Вы решили, что RTC способен принять это значение года одной переменной?

Потому что, у DS1338 год пишется переменной в диапазоне 0...99.
Код
void rtc_set_time(unsigned char second, unsigned char minute, unsigned char hour,
                  unsigned char day, unsigned char date, unsigned char month, unsigned int year)
{
    i2c_start(RTC_ADDR|W);          // write slave address + write
    i2c_write(0x00);                  // write register address, 1st clock register
    
    //Установить системное время :
    i2c_write(dec2bcd(second));
    i2c_write(dec2bcd(minute));
    i2c_write(dec2bcd(hour));  

    // Установить системную дату :
    i2c_write(dec2bcd(day));  
    i2c_write(dec2bcd(date));  
    i2c_write(dec2bcd(month));
    i2c_write(dec2bcd(year));  
    
    // Настроить выход на генерацию 32768Гц :
    i2c_write(0x13);                  // enable sqwe, 32768Hz output, clear OSF bit
    i2c_stop();    
}

Весь код показывать не буду. Слишком большой. Суть проблемы в следующем: в результате действия программы загрузил в lcd_buf строку"2007". Сделал sscanf_P в переменную YR. Вывел на терминал значение YR. Показывает 2007. Дальше загрузил в lcd_buf строку"12". Сделал sscanf_P в переменную MN. Вывел на терминал значение MN. Показывает 12. И т.д. со следующими переменными. Когда инициализировал таким образом последнюю переменную MIN, вызываю ф-цию rtc_set_time(). В результате - в часах - одни "0" . Кроме года. Если перед вызовом rtc_set_time() присвоить этим переменным значения непосредственно вот так: yr=2007, mn=12, dt=23, dy=6, ..., то эти значения запишутся в RTC.

Добавлено

Только что проверил значения переменных непосредственно перед вызовом ф-ции rtc_set_time(). Значения переменных, кроме года равны 0 ! Где-то херятся переменные. Провел простой эксперимент: Редактирую переменные в такой последовательности: YR,MN,DT,DY,HR,MIN ; на терминал вывожу значение переменной + предыдущее значение отредактированной переменной. Выяснилось, что при редактировании DT обнуляется MN и т.д. И в этом вся проблема. Но тогда вопрос в следующем. Почему простая замена функций sscanf_P на StrToInt сохраняет значения переменных? Виновата sscanf_P?

Прикладываю файл. Если кто-нибудь в нем разберется smile.gif Функция выводит статические надписи в разные строки и значения переменных с координаты х=49. Редактирование значения текущего символа, который выделен мигающим курсором , осуществляется с клавиатуры 4х4. UP, DOWN смещение курсора в пределах строки. Число с цифровой клавиатуры заменяет текущее знакоместо и переносит курсор на следующее. ENTER - сохранение отредактированной переменной. При чем когда сохраняем последнюю отредактированную переменную, то вызывается ф-ция rtc_set_time. Хочется услышать ваше мнение. Громоздко получилось или это нормально?
Прикрепленные файлы
Прикрепленный файл  TimeEdit.rar ( 1.25 килобайт ) Кол-во скачиваний: 55
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 21 2007, 15:05
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alux @ Dec 21 2007, 15:21) *
Виновата sscanf_P?
Скорее всего виновата нехватка стека. sscanf использует довольно много стека, а ваша StrToInt гораздо меньше. Когда работает scanf, она своими данными залезает на ваши и затирает их.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alux
сообщение Dec 21 2007, 15:13
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(Сергей Борщ @ Dec 21 2007, 19:05) *
Скорее всего виновата нехватка стека. sscanf использует довольно много стека, а ваша StrToInt гораздо меньше. Когда работает scanf, она своими данными залезает на ваши и затирает их.

Похоже на правду. Не проверял, но думаю, что так оно и есть.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 18:32
Рейтинг@Mail.ru


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