Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Вопросы начинающих (http://www.microchip.su/forumdisplay.php?f=14)
-   -   Cложение времени и формах хранения в EEPROM (http://www.microchip.su/showthread.php?t=18229)

Theyler 25.11.2017 16:47

Cложение времени и формах хранения в EEPROM
 
Устройство нарабатывает моточасы.
При включении индицируется общий счётчик наработки: DDDDD:HH:MM:SS
Дней там аж на два байта - 65536. Больше не нужно (столько не живут). (=
С часами-минутами-секундами тут понятно: макс. - 23:59:59 при переполнении добавляется 1 день.

Когда включается нагрузка, идёт время работы в этом включении.
Затем нагрузка отключается.
На дисплее время останавливается и должно суммироваться с накопительным счётчиком моточасов, а затем происходит запись этих данных в EEPROM.
Потом по некоторым событиям опять включается нагрузка, идёт время, потом по выключении опять добавляется к общему счётчику и пишется в EEPROM. И т.д.

Вопрос: какой формат лучше реализовать для записи и чтения в/из EEPROM?
Что удобнее и правильнее -
Просто взять пять байт подряд типа DH DL HH MM SS и писать туда значения типа 01 47 15 25 07, что соответствует 147дней 15ч 25мин 7сек наработки,
или лучше записывать, как многоразрядное общее число количества секунд, каждый раз преобразовывая (делением на 24, затем остаток на 60, ещё раз на 60, а остаток - секунды) его в ДДДД ЧЧ ММ СС при необходимости?


Камень PIC16F628A.

Vovka 25.11.2017 16:57

Re: Cложение времени и формах хранения в EEPROM
 
Туда-сюда преобразовывать... для кого?
Лично я бы писал в формате DDDDD:HH:MM:SS и не заморачивался!

Theyler 25.11.2017 17:02

Re: Cложение времени и формах хранения в EEPROM
 
Преобразовывать для простоты суммирования.
В EEPROM они пишутся в HEX, а выводятся в DEC, да ещё и в формате часов. То есть, по 59 на разряд секунд и минут, и по 23 на час.
Это требует постоянного обратного преобразования в HEX, причём не по переносу STATUS, а проверять на больше или равно 60 или 24.
Каша, не охота возиться.
наверняка есть изящнее метод.

Vovka 25.11.2017 17:34

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Theyler (Сообщение 235626)
В EEPROM они пишутся в HEX, а выводятся в DEC, да ещё и в формате часов.

а хранить в формате часов что мешает?

Theyler 25.11.2017 19:10

Re: Cложение времени и формах хранения в EEPROM
 
Да вот каша в коде получается.

Для записи наработанных за крайнее включение дней:часов:минут:секунд, нужно:
1. Взять значение каждого прочитанного при включении устройства временного параметра из EEPROM и поместить его в некую переменную:
Код:

        movfw        EE_1_S
        movwf        Acc_S
        movfw        EE_1_M
        movwf        Acc_M
        movfw        EE_1_H
        movwf        Acc_H
        movfw        EE_1_D_Lo
        movwf        Acc_DL
        movfw        EE_1_D_Hi
        movwf        Acc_DH

Тут понятно.

2. Просуммировать текущие временные значения наработанного за крайний период, причём, крайнее допустимое значение байта не 255, а 59 (для минут и секунд) или 23 (для часов). Поэтому флаги переноса Z и C тут не помогут. Всё делать вручную, типа:
Код:

        movfw        Sec
        addwf        Acc_S
        movlw        .60
        subwf        Acc_S,w
        bnz        _Min
        incf        Acc_M,f
_Min

Примерно так. И для каждого параметра..

В итоге, каши становится всё больше, код раздувается..

А хотелось бы взять текущее значение дней:часов:минут:секунд и махом перевести в общее значение секунд и тупо добавить к тому, что в EEPROM.
Без деления на составляющие, без вычисления каждый раз переполнения 60-ти секунд и т.д.
Получилось бы, скажем, такое число: 12345678 секунд, что соответствует:
12345678 / 86400 (сек. в 1 сутках) = 142 целых суток
остаток 76878 делим на 3600 (сек. в 1 часе) = 21 час
остаток 1278 делим на 60 (сек. в 1 минуте) = 21 минута
остаток = 18 секунд.

Таким образом, всего три деления:
На 86400
На 3600
На 60

И можно выводить на экран.

А суммирование общего количества наработанных секунд - это одна простая процедура сложения трёхбайтового числа.

Наверное, сумбурно, но суть, надеюсь, понятна.

DmitrijVDN 25.11.2017 19:30

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Theyler (Сообщение 235629)
Таким образом, всего три деления:

и сколько это займет в попугаях (командах) ?
Цитата:

Поэтому флаги переноса Z и C тут не помогут
это почему?

siargy 25.11.2017 19:36

Re: Cложение времени и формах хранения в EEPROM
 
я бы щитал 2 значения паралельно- общий и текущий. это гораздо проще преобразований на этом мк, и никакой кашы.

но меня бы больше беспокоило как не потерять время наработки и не исчерпать ресурс ячеек перезаписью.
да еще - в спидометре дублируется значение пробега с контрольной суммой.

Theyler 25.11.2017 19:59

Re: Cложение времени и формах хранения в EEPROM
 
В начале работы нужно при включении лишь отобразить общее время наработки в формате DDDDD : HH : MM : SS

А в процессе работы просто идёт отдельный обнулённый счётчик HH:MM:SS этой сессии.
Когда происходит остановка двигателя и нагревателя, время останавливается. В этот момент происходит запись этих значений в EEPROM.
Точнее, добавление их к тем, что были при включении и запись получившегося нового значения:

1. Включение, прочитал из EEPROM в переменные:
Код:

GetEEtime        ;Получение общего времени наработки из EEprom
        BANK1
        movlw        0x08                ;WORKTIME_ADDR
        movwf        EEADR                ;Address to read
        call        GetEEbyte
        movwf        EE_1_D_Hi
        call        GetEEbyte
        movwf        EE_1_D_Lo
        call        GetEEbyte
        movwf        EE_1_H
        call        GetEEbyte
        movwf        EE_1_M
        call        GetEEbyte
        movwf        EE_1_S
        return

Вот тут мне и интересно: хранить раздельно все значения или лучше просто три байта общего количества секунд типа EE_HH, EE_HL и EE_LL?

2. Нажали ПУСК. Агрегат поработал, скажем, 5 минут. Набежал счётчик типа 00:05:15 и выключился на паузу (в ожидание включения).
3. Я или превратил это время в 315 секунд и добавил к общему количеству, или мне колбаситься - добавлять одни секунды к другим, потом смотреть, больше ли 59-ти получилось, если да, то увеличивать минуты, которые тоже суммировать и опять проверять, не перевалили ли они в сумме за 59, затем так же проверять часы на превышение 23-х, увеличивая на 1 день..

Или же просто сложить те все секунды со всеми этими, записать в EEprom длинное число и забыть, как страшный сон?

4. Агрегат включился, опять проработал, ну, ещё 4 минуты 7 секунд. Получилось 00:09:22
5. Я просто взял перевёл это в 562 секунды и добавил к EE_HH, EE_HL и EE_LL и записал в ЕЕпром.
Или опять мне нужно добавлять эти 22 секунды к тем, проверять, что не больше 59, а если больше, то увеличивать минуты, добавляя опять эти и те к тому же..


Я понимаю, что раз пишу на asm, то я раб этой лампы и код априори не может быть компантным в тексте.
Но не настолько же не любить поговорку "всё гениальное - просто"..

besogon 25.11.2017 20:14

Re: Cложение времени и формах хранения в EEPROM
 
Theyler
не знаю. люблю неточное время в секундах. с ним удобно работать.

минуты, часы, дни (бредовые шумерские замашки) это конечно полный аут но там где нужны часы, минуты и дни без этого не обойтись.

Vovka 25.11.2017 20:15

Re: Cложение времени и формах хранения в EEPROM
 
А зачем отдельный счетчик? Счет продолжать со значения в EEPROM
Не морочьте себе голову и работайте только с DDDDD:HH:MM:SS

siargy 25.11.2017 20:23

Re: Cложение времени и формах хранения в EEPROM
 
4.2 агрегат включился, отработал 23.59.59 а дальшэ что?
4.3 агрегат проработал 3.12.35 а потом выбило автомат, время потерялось?

Theyler 25.11.2017 20:23

Re: Cложение времени и формах хранения в EEPROM
 
Вложений: 2
А там общее время наработку - чисто информативное, при включении.
На каждую сессию (с момента подачи питания) на дисплее идёт с нуля.
И вот оно-то и суммируется с тем, что в EEPROM.
http://www.microchip.su/attachment.p...1&d=1511630598
http://www.microchip.su/attachment.p...1&d=1511630598

DmitrijVDN 25.11.2017 20:25

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Theyler (Сообщение 235632)
В начале работы нужно при включении лишь отобразить общее время наработки в формате DDDDD : HH : MM : SS

А в процессе работы просто идёт отдельный обнулённый счётчик HH:MM:SS этой сессии.
Когда происходит остановка двигателя и нагревателя, время останавливается. В этот момент происходит запись этих значений в EEPROM.
Точнее, добавление их к тем, что были при включении и запись получившегося нового значения:

да без разницы в чем хранить данные в еепром , вопрос только в том в чем отображаются текущие показания, если они в формате ЧЧ:ММ:СС , то смысл считать в секундах и каждый раз делать пересчет в DEC, не проще одновременно инклюдить текущий и полный счетчик в формате DEC , ИМХО так правильней

Theyler 25.11.2017 20:26

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от siargy (Сообщение 235635)
4.2 агрегат включился, отработал 23.59.59 а дальшэ что?
4.3 агрегат проработал 3.12.35 а потом выбило автомат, время потерялось?

4.2 А дальше 00001:00:00:00
4.3 Да. Потерялось. Не могу писать каждую секунду - убью EEProm по циклам записи. Но можно поставить ёмкость и контроль напряжения. Как пропало сетевое - запись.

Vovka 25.11.2017 20:27

Re: Cложение времени и формах хранения в EEPROM
 
А если не суммировать, а оба счетчика увеличивать? И тогда не нужно будет ничего суммировать - тупо сохранить в EEPROM

Theyler 25.11.2017 20:30

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от DmitrijVDN (Сообщение 235637)
да без разницы в чем хранить данные в еепром , вопрос только в том в чем отображаются текущие показания, если они в формате ЧЧ:ММ:СС , то смысл считать в секундах и каждый раз делать пересчет в DEC, не проще одновременно инклюдить текущий и полный счетчик в формате DEC , ИМХО так правильней

Вот именно за советом я и пришёл (=

Мне не совсем понятно, будет ли проще складывать секунды те с этими, контролируя переполнение 59-ти секунд, затем минуты, часы..
Я и спросил: может, лучше сразу хранить в общем количестве секунд?

Как народ обычно пишет-то?

Theyler 25.11.2017 20:31

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Vovka (Сообщение 235639)
А если не суммировать, а оба счетчика увеличивать? И тогда не нужно будет ничего суммировать - тупо сохранить в EEPROM

супер. Не подумал сходу. Просто завести второй счётчик и параллеольно добавлять каждую секунду к нему вместе с часами на дисплее.
Хороший выход.
Наверное, так и поступлю.

siargy 25.11.2017 21:00

Re: Cложение времени и формах хранения в EEPROM
 
тожэ самое я советовал в сообщении #7. чукча не читатель :-)

Vovka 25.11.2017 21:06

Re: Cложение времени и формах хранения в EEPROM
 
так не всегда ж с первого раза мысль доходит :D
шутка...

Theyler 25.11.2017 21:29

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от siargy (Сообщение 235642)
чукча не читатель

Чукча уже не соображатель. (=

Как не потерять набежавшее за последнюю сессию - тут не критично, если оно часа три-пять поработало. А вот если сутки и потом "свет пропал" - тат да - неприятно. Только навешивать ёмкость побольше и контролить напряжение. Как пропало - сразу писать.

Что касается количества циклов записи, у меня среднее выключение - раз в три-пять минут. Может и реже. Зависит от настроек давления. Если выставят большое, то не скоро наберёт. Иногда может полсуток молотить, особенно если за бортом -15.
Поэтому, если раз в пять минут писать в течение рабочего дня (8 часов) - это ~100 раз в день, то 100.000 циклов наберёт за 1000 суток. А это три года.
Ну, там столько не выживет прибор. Быстрее ему сделаем апгрейд.

Vovka 25.11.2017 21:43

Re: Cложение времени и формах хранения в EEPROM
 
если EEPROM больше ничем не забита, то можно, к примеру, писать в разные места, выбирая позицию в зависимости от числа моточасов и соответственно сделать какой-то флаг где искать последние показания

siargy 25.11.2017 21:44

Re: Cложение времени и формах хранения в EEPROM
 
ионистор ставь, не ошибешся :-)

DmitrijVDN 25.11.2017 21:44

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Theyler (Сообщение 235640)
Вот именно за советом я и пришёл (=

Мне не совсем понятно, будет ли проще складывать секунды те с этими, контролируя переполнение 59-ти секунд, затем минуты, часы..
Я и спросил: может, лучше сразу хранить в общем количестве секунд?

Как народ обычно пишет-то?

для 8ми битника это одназначно будет проще 24битного деления с сохранением остатка

Theyler 25.11.2017 21:45

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Vovka (Сообщение 235645)
писать в разные места

О, как..
То есть, там не сам факт обращения на запись ко всей ЕЕПРОМ, а лишь физический износ одного байтоместа конкретно по его адресу?

sdn_sdn 25.11.2017 23:36

Re: Cложение времени и формах хранения в EEPROM
 
Цитата:

Сообщение от Theyler (Сообщение 235648)
О, как..
То есть, там не сам факт обращения на запись ко всей ЕЕПРОМ, а лишь физический износ одного байтоместа конкретно по его адресу?

Для вашей задачи прекрасно подойдет EERAM(гибрид RAM c EEPROM): http://www.microchip.com/design-cent...y/serial-eeram
(миллион циклов перезаписи собственной EEPROM + аппаратное сохранение в собственную EEPROM (после потери питания) и аппаратная загрузка обратно в собственную RAM после возобновления питания.)


Часовой пояс GMT +3, время: 08:28.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot