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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Меню для RTC, Толкните уже куда нибудь
ILYAUL
сообщение Jan 13 2011, 15:57
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Всем добрый вечер! И с наступающим OLD NEW YEAR!!

"Ледяной" дождь и отключение электричества выявило одну проблемку в проекте , где часы синхронизировались от компа.
Решено было , дописать "МЕНЮ" внеся в него установку часов в MANUAL MODE.
Часы - DS1337 - код сжатый BCD
Вот никак не выберу решение из двух возможных ( по моему мнению)

1. Распоковать BCD на десятки и единицы и установить каждый отдельно. Но "вылезают" проблемы с часами и датой ( день месяца) и месяцем - не может быть 24 часа и выше и конечно 32 и выше дня.
Т.е. приходится отслеживать десятки , что бы задать диапазон изменения единиц - что "утяжеляет" программу
2. Перевести BCD to HEX ( элементарно). НО - если из 00:00 надо выставить 12:30 - 42 нажатия кнопок . Да забыл , кнопок is used всего 4 (+) (-) (MENU) (SET) Таймер 16 - свободен , можно конечно устроить "залипание" кнопки......
Вообщем за неделю так и не пришёл к окончательному пути. Help.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jan 13 2011, 16:21
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(ILYAUL @ Jan 13 2011, 21:57) *
Таймер 16 - свободен , можно конечно устроить "залипание" кнопки......
Вообщем за неделю так и не пришёл к окончательному пути. Help.

Делать так, как в наручных электронных часах (бывает по-разному, в данном случае вполне можно сделать с реверсом, т.е. больше/меньше). Крутить все поле целиком, с залипанием и, вполне возможно, с ускорением при длительном удержании. Если проскочит - всегда можно вернуться. По цифрам удобно, когда есть цифровая клавиатура, иначе удобство сомнительное.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 13 2011, 16:40
Сообщение #3


Гуру
******

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



Унутре микроконтроллера обычно используют время в UNIX/POSIX-формате - 32-х разрядное число секунд, прошедшее от 1 января 1970 года. Или чтобы избежать проблемы 2038 года, то 64-х разрядное число. Число это преобразуется в привычный для человека вид (ЧЧ:ММ:СС и ДД-ММ-ГГГГ) только при визуализации его во время отображения или при редактировании. Ну а вашем случае еще и при сохранении его в регистры м/с RTC. Для перевода даты/времени туда и обратно существуют уже готовые функции.
По поводу кнопок управления. При их ограниченном количестве используют функцию автоповтора, когда при удержании кнопки в нажатом состоянии некоторое время генерируется повторяющийся код этой кнопки. Иногда для дополнительного удобства при длительном удержании увеличивают скорость генерации повтора вдвое и вчетверо. Но опять же для вашего случая автоповтор следует сделать только для кнопок (+) и (-). Либо функцию автоповтора сделать отключаемой, включая ее в зависимости от текущего состояния меню.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 13 2011, 17:07
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(rezident @ Jan 13 2011, 22:40) *
Унутре микроконтроллера обычно используют время в UNIX/POSIX-формате - 32-х разрядное число секунд, прошедшее от 1 января 1970 года. Или чтобы избежать проблемы 2038 года, то 64-х разрядное число. Число это преобразуется в привычный для человека вид (ЧЧ:ММ:СС и ДД-ММ-ГГГГ) только при визуализации его во время отображения или при редактировании. Ну а вашем случае еще и при сохранении его в регистры м/с RTC. Для перевода даты/времени туда и обратно существуют уже готовые функции.
По поводу кнопок управления. При их ограниченном количестве используют функцию автоповтора, когда при удержании кнопки в нажатом состоянии некоторое время генерируется повторяющийся код этой кнопки. Иногда для дополнительного удобства при длительном удержании увеличивают скорость генерации повтора вдвое и вчетверо. Но опять же для вашего случая автоповтор следует сделать только для кнопок (+) и (-). Либо функцию автоповтора сделать отключаемой, включая ее в зависимости от текущего состояния меню.

Мне всегда нравились Ваши пояснения. biggrin.gif Но в данном проекте секунд , как таковых нет . Я всегда не понимал тех , кто выводя на экран минуты и часы , "дергал" проц каждую секунду. Поэтому и в данном проекте проц практически целую минуту просто спит. Через минуту просыпается ~ на 500 mc и снова спит. Я пишу на ASM , единственный мой проект на СИ(удачно) - кнопка и моргание светодиодов и то за последние 10 дней НГ- изучаю. На asm ,как я понял Вашу фразу (Для перевода даты/времени туда и обратно существуют уже готовые функции) т.е BCD- HEX и обратно , я даже не рассматриваю - это настолько элементарно , что и говорить не о чем.
Как я Вас понял ,Вы склоняетесь ко второму варианту .


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2011, 17:16
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(rezident @ Jan 14 2011, 00:40) *
Или чтобы избежать проблемы 2038 года, то 64-х разрядное число.

На самом деле достаточно 32-х разрядного, но беззнакового.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 13 2011, 17:38
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(rezident @ Jan 13 2011, 22:40) *
Или чтобы избежать проблемы 2038 года, то 64-х разрядное число.

Кстати , дожить бы . Апокалипсис обещают уже 2012 в декабре, слабо верится , но ...... Конечно хорошо , если наши творения нас переживут , но кому они будут нужны ... Sorry bb-offtopic.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 13 2011, 18:13
Сообщение #7


Гуру
******

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



Цитата(ILYAUL @ Jan 14 2011, 01:07) *
На asm ,как я понял Вашу фразу (Для перевода даты/времени туда и обратно существуют уже готовые функции)
Нет, я имел в виду готовые функции на Си. Они используются, например, в Linux.
Цитата(ILYAUL @ Jan 14 2011, 01:07) *
Как я Вас понял ,Вы склоняетесь ко второму варианту .
Я не знаю полностью всей задачи, которую выполняет ваш МК. Если это просто часы, то нет ничего проще, чем считать текущее значение регистра из м/с RTC и в зависимости от типа поля (день, минута или месяц) гонять его по кольцу в заданном для данного типа поля диапазоне (секунды/минуты от 0 до 59, часы от 0 до 23, день от 1 до максимального в данном месяце и т.д.), инкрементируя или декрементируя значение на единицу при каждом нажатии клавиши. Чтобы не приходилось давить кнопку много раз, то лучше приделать к клавишам (+) и (-) функцию автоповтора.
Цитата(AHTOXA @ Jan 14 2011, 01:16) *
На самом деле достаточно 32-х разрядного, но беззнакового.
Это уже не будет UNIX/POSIX-формат. В UNIX используется 32-х битное знаковое число. Хотя лично мне тоже непонятно, зачем было для переменной времени использовать знаковое число? Ведь время назад не течет laughing.gif
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 14 2011, 09:27
Сообщение #8


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ILYAUL @ Jan 13 2011, 21:57) *
1....приходится отслеживать десятки...


установка поразрядно. причём левые разряды сбрасывают правые. правые ограничиваются левыми. выставляют обычно с лева на право.

удачи вам
(круглый)
ЗЫ
Обожаю азм.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 14 2011, 12:09
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(ILYAUL @ Jan 13 2011, 21:57) *
1. Распоковать BCD на десятки и единицы и установить каждый отдельно. Но "вылезают" проблемы с часами и датой ( день месяца) и месяцем - не может быть 24 часа и выше и конечно 32 и выше дня.
Т.е. приходится отслеживать десятки , что бы задать диапазон изменения единиц - что "утяжеляет" программу
2. Перевести BCD to HEX ( элементарно). НО - если из 00:00 надо выставить 12:30 - 42 нажатия кнопок . Да забыл , кнопок is used всего 4 (+) (-) (MENU) (SET) Таймер 16 - свободен , можно конечно устроить "залипание" кнопки......
Вообщем за неделю так и не пришёл к окончательному пути. Help.


Только вчера закончил подменю настройки даты/времени в одном устройстве. 4 кнопки +, -, ENTER, BACK.
ENTER выбирает что настраиваем - день, месяц, год, час, минута, секунда - под соотв позицию подводится нижнее подчёркивание на LCD-индикаторе, +/- - инкремент/декремент параметра (для месяца учитывается кол-во дней (для февраля ещё и учёт високосного года)), по нажатию на BACK время сохраняется если было фактическое изменение. По нажатию и удержанию кнопки автоповтор инкремента/декремента соотв позиции. Получилось довольно удобно и оперативно настраивать время. По поводу кода - написал процедуры инкремента/декремента параметра с органичением:

Код
//----------------------------------
unsigned int incParam(unsigned int val, unsigned int low,unsigned int high)
{
  unsigned int result = val;
  
  if(result >= high) result = low;
  else result++;
  return result;
}
//----------------------------------

//----------------------------------
unsigned int decParam(unsigned int val, unsigned int low,unsigned int high)
{
  unsigned int result = val;
  
  if(result <= low) result = high;
  else result--;
  return result;
}
//----------------------------------


Применяется при настройке абсолютно всех параметров часов, занимает минимум кода.

Пример инкремента по нажатию кнопки +

Код
              if(KEYBOARD.key_status & MENU_UP_KEY)
              {
                common_val = 1; //изменение параметра
                
                if(common_index == 0)
                {
                  //day
                  if( (LocalTime.RTC_Mon == 2) && ((LocalTime.RTC_Year % 4) == 0) )
                  {
                    //високосный год
                    LocalTime.RTC_Mday = incParam(LocalTime.RTC_Mday, 1, MONTH_LIMIT_DAY[LocalTime.RTC_Mon]+1);
                  }
                  else
                  {
                    LocalTime.RTC_Mday = incParam(LocalTime.RTC_Mday, 1, MONTH_LIMIT_DAY[LocalTime.RTC_Mon]);
                  }
                  
                }
                else if(common_index == 1)
                {
                  LocalTime.RTC_Mon = incParam(LocalTime.RTC_Mon, 1, 12);
                }
                else if(common_index == 2)
                {
                  LocalTime.RTC_Year = incParam(LocalTime.RTC_Year, 2011, 2099);
                }
                else if(common_index == 3)
                {
                  LocalTime.RTC_Hour = incParam(LocalTime.RTC_Hour, 0, 23);
                }
                else if(common_index == 4)
                {
                  LocalTime.RTC_Min = incParam(LocalTime.RTC_Min, 0, 59);
                }
                else if(common_index == 5)
                {
                  LocalTime.RTC_Sec = incParam(LocalTime.RTC_Sec, 0, 59);
                }
                
                RTC_Display_Time(&LocalTime);
                
                //задержка отображения
                setServiceTimeoutStatus(MENU_KEY_SHIFT_TIMEOUT, 35);
                  
                return;
              }
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 15 2011, 14:13
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(kolobok0 @ Jan 14 2011, 15:27) *
...причём левые разряды сбрасывают правые. правые ограничиваются левыми. выставляют обычно с лева на право.

Левые - это десятки ? Правые - единицы ?

Цитата
mempfis_ Только вчера закончил подменю настройки даты/времени в одном устройстве. 4 кнопки +, -, ENTER, BACK.
Спасибо! И поздравляю!
В общих чертах я понял подход.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 15 2011, 14:22
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(mempfis_ @ Jan 14 2011, 20:09) *
по нажатию на BACK время сохраняется если было фактическое изменение.

А как отменить ввод? Никак? Это неправильно, должна быть отмена. Имхо, конечно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 15 2011, 15:26
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(AHTOXA @ Jan 15 2011, 20:22) *
А как отменить ввод? Никак? Это неправильно, должна быть отмена. Имхо, конечно.


Была мысль сделать по нажатию BACK запрос сохранять или нет, но отказался от этого - меню и так довольно разветвлённоеsm.gif
У нас не винда чтобы требовать подтверждение на каждое действие sm.gif
Если заказчик захочет подтверждение - введу, а пока что пусть будет так как есть.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 15 2011, 17:00
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(mempfis_ @ Jan 15 2011, 23:26) *
У нас не винда чтобы требовать подтверждение на каждое действие sm.gif

При чём тут винда? У пользователя должен быть путь отступления!
У меня так - кнопка ENTER передвигает на следующую позицию, а на последней позиции сохраняет изменения. А кнопка BACK - возвращает на предыдущую позицию, а на первой позиции - отменяет весь ввод.
Железобетонно, никаких подтверждений, и у пользователя есть куда убежать, если он заблудился sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 15 2011, 19:09
Сообщение #14


Гуру
******

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



Обработка событий клавиатуры в меню:
Код
        case evUp:
            if (rtc_adjustment)
            {    if (!(rtc_adjustment&1))
                    Change(    1);
                else
                    Change( 10);
            }
        break;

        case evDn:
            if (rtc_adjustment)
            {    if (!(rtc_adjustment&1))
                    Change(-1);
            else
                    Change(-10);
            }
        break;


Собственно изменение:
Код
const char max[13]    = {0,31,31,11,11,134,134,23,23,59,59,59,59};
const char min[13]    = {0,1 , 1, 0, 0, 109,109, 0, 0, 0, 0, 0, 0};

void Change(sint dif )
{    int    my_max=max[rtc_adjustment];
    int    my_min=min[rtc_adjustment];
     *rtc_ptr+=dif;
    if (dif>0)
        {    if (*rtc_ptr>my_max) *rtc_ptr=my_max;}
    else
        {    if (*rtc_ptr<my_min) *rtc_ptr=my_min; }
}



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 16 2011, 07:40
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
Dog Pawlowa Собственно изменение:


Код
const char max[13]    = {0,31,31,11,11,134,134,23,23,59,59,59,59};
const char min[13]    = {0,1 , 1, 0, 0, 109,109, 0, 0, 0, 0, 0, 0}


Зачем две таблицы? Это же высчитывание двух разных адресов для Z . Данные по мин и мах кратны 2 - их можно расположить друг за другом

Цитата
AHTOXA При чём тут винда? У пользователя должен быть путь отступления!
...а на первой позиции - отменяет весь ввод

Но и мозги тоже . См. что вводишь , не то вернись на эту позицию . А отменять весь предыдущий ввод , зачем ? Ну ошибся я в дне недели - вернусь поправлю.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


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


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