Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Часы реального времени.

  1. #1
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Часы реального времени.

    Поскольку в следующей версии "эмулятора ДВК" появится устройство HC, реализующее концепцию "блочных часов реального времени" - есть смысл обсудить некоторые подробности.

    Главная особенность предлагаемой концепции в том, что часы реального времени реализуются как контроллер одноблочного диска, позволяющий читать или писать "блок времени" переменной длины. В эмуляторе ДВК - HC будет работать через интерфейс HD по командам "прочитать таймблок" и "записать таймблок". HD t1, t2 и t3 будут читать/писать блок времени через прямой доступ к ОЗУ, а HD t4 и t5 - получать/отдавать таймблок через регистр данных.

    Поскольку таймблок может иметь произвольную длину - первым словом блока должна идти его длина в байтах. Это слово должно не только находиться в начале программного буфера при его отдаче контроллеру через ДМА, но и передаваться первым словом пакета в случае записи блока времени в контроллер через регистр данных.

    Внутри "блока времени" после слова размера должна находиться информация о дате, потом информация о времени, а затем - служебная информация. Максимальный размер блока, поддерживаемый конкретной реализацией контроллера - зависит от объёма реализуемых функций. Минимальный контроллер позволяет только читать ( или читать и писать ) дату, а максимальный - читать и писать максимальный набор информации, предусмотренный текущей спецификацией таймблока.

    Если программа рассчитана на более продвинутую версию таймблока и пытается записать в контроллер слишком большой для него блок - контроллер считывает поддерживаемые им поля и выставляет бит ошибки в CSR с кодом ошибки "превышен размер блока" в регистре данных. Узнать поддерживаемую контроллером версию таймблока можно выполнив чтение - контроллер всегда отдаёт полный таймблок максимального поддерживаемого размера, который ( размер ) однозначно соответствует реализованной спецификации таймблока. Программа, наоборот - может писать в контроллер блоки любого размера, меньшего или равного размеру блока контроллера.


    Относительно конкретного формата таймблока однозначного понимания пока нет - возможный вариант выглядит так:

    Скрытый текст


    000000 Размер блока в байтах.

    000002 Номер года - int16, содержащий число лет в дате новой эры или отрицательное число лет в дате до новой эры ( номер 0 - недопустим, поэтому при записи означает запись блока времени без даты, а при чтении - отсутствие даты в контроллере ).

    000004 Номер месяца в диапазоне 1..12 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000006 Номер дня в диапазоне 1..31 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000010 Read Only Номер дня в неделе в диапазоне 1..7 ( 1 = понедельник, 7 = воскресенье ), 0 - если дата не установлена или -1, если контроллер не поддерживает день недели.

    000012 Номер часа в диапазоне 0..23 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000014 Номер минуты в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000016 Номер секунды в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000020 Номер миллисекунды в секунде в диапазоне 0..999 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи блока.

    000022 000024 Int32 - Номер миллисекунды после полуночи в диапазоне 0..86399999 или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 4-х предыдущих полей не содержит -1.

    000026 000030 Int32 - Время в тиках от 0 до TickMax ( зависит от поля частоты тиков ) или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 5 предыдущих полей не содержит -1.

    000032 Частота тиков ( Гц ) в диапазоне 1..10000 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи. При изменении этого поля - значение предыдущего поля пересчитывается для новой частоты.

    000034 Вектор циклического прерывания: 0 - прерывания запрещены, 0100..0464 - прерывания разрешены, -1 - контроллер не поддерживает генерацию этого прерывания или поле не должно измениться при записи.

    000036 Приоритет циклического прерывания в диапазоне 4..7 или -1, если контроллер не поддерживает приоритет циклического прерывания или поле не должно измениться при записи.

    000040 Коррекция 60 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 секунд с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000042 Коррекция 3600 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 минут с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000044 Коррекция 216000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000046 Коррекция 12960000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 3600 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000050 000052 Read Only Int32 - База 3600 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 3600", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000054 000056 Read Only Int32 - База 216000 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 216000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000060 000062 Read Only Int32 - База 12960000 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 12960000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.
    [свернуть]


    Текущую спецификацию HC см. ЗДЕСЬ
    Последний раз редактировалось Patron; 02.11.2017 в 19:27.

  2. Этот пользователь поблагодарил Patron за это полезное сообщение:

    hobot (22.03.2020)

  3. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  4. #2
    Master
    Регистрация
    27.11.2013
    Адрес
    г. Санкт-Петербург
    Сообщений
    826
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    128
    Поблагодарили
    108 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    обычно в "начале" ставят "версия/тип". По этому идентификатору всегда можно однозначно сопоставить и длину и формат данных.
    пс: если указывать только длину , то если потребуется поменять формат(при неизменной длине данных) - потребуется "присваивать" фиктивную длину.

  5. #3
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AlexG Посмотреть сообщение
    если указывать только длину, то если потребуется поменять формат(при неизменной длине данных) - потребуется "присваивать" фиктивную длину.
    Сложно представить часы без информации о годе. Если информация о годе в новом формате данных есть - все неиспользуемые поля контроллер нового формата может заполнять предусмотренными форматом "заглушками", добавляя свои поля в конце. Это позволяет даже самым старым программам читать из нового контроллера правильную дату.

    Однако, сложно представить, что может заставить настолько изменить формат данных часов реального времени, чтобы в нём не осталось информации о дате и времени. Идеи вроде "хочу номер месяца не от 1 до 12, а от 0 до 11" - вряд ли требуют полной смены формата при неизменном размере блока, скорее надо просто научиться вычитать единицу из содержимого стандартного поля стандартного блока.

  6. #4
    Guru Аватар для MiX
    Регистрация
    13.12.2013
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,065
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    74
    Поблагодарили
    62 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    Поскольку в следующей версии "эмулятора ДВК" появится устройство HC, реализующее концепцию "блочных часов реального времени" - есть смысл обсудить некоторые подробности.
    Реализация TOY в PDP11/93 на адресе 177526 (17 777 526).
    Всё остальное можно почитать - здесь.
    Страница 1-49

    - - - Добавлено - - -

    Цитата Сообщение от Patron Посмотреть сообщение
    В эмуляторе ДВК - HC будет работать через интерфейс HD
    В эмуляторе лучше сделать отдельное устройство TOY со своим адресом.

  7. #5
    Guru Аватар для form
    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,823
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    281
    Поблагодарили
    227 сообщений
    Mentioned
    29 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от MiX Посмотреть сообщение
    Реализация TOY в PDP11/93 на адресе 177526
    Делать для эмулятора побитовое чтение информации ради нерабочей совместимости (RSX, RSTS такой TOY не найдут только от того, что его повесят на тот же адрес ASR) - не лучшая идея. Вот если со временем будет эмулироваться KDJ11-E - там оно в самый раз, причем регистр будет более функциональным чем на 1 бит

    - - - Добавлено - - -

    Касаемо же прочего, считаю, что всякие коррекции абсолютно бесполезны (равно как и ведение независимых часов с возможностью установки) - это бы имело смысл если бы эмулировался TOY, совместимый с чем-то существующим. В данном же случае вполне достаточно возможности прочитать время из системы в которой эмулятор работает для синхронизации.
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  8. #6
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    Касаемо же прочего, считаю, что всякие коррекции абсолютно бесполезны (равно как и ведение независимых часов с возможностью установки) - это бы имело смысл если бы эмулировался TOY, совместимый с чем-то существующим. В данном же случае вполне достаточно возможности прочитать время из системы в которой эмулятор работает для синхронизации.
    А вот при аппаратной реализации контроллера типа HD есть потребность в интерфейсе для комплектных батареечных часов реального времени. Чтобы добиться от батареечных часов реального времени приемлемого дрейфа показаний - коэффициенты коррекции могут быть довольно полезны. Если установлена (например) ежечасовая коррекция и контроллер включается спустя 100 часов после выключения, то в случае запоминания времени выключения - контроллер при включении может сам определить интервал бездействия и применить к батареечным часам необходимую коррекцию. Мне при помощи коэффициентов коррекции удавалось добиваться от батареечных часов реального времени довольно неплохой точности.

  9. #7
    Guru Аватар для form
    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,823
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    281
    Поблагодарили
    227 сообщений
    Mentioned
    29 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    А вот при аппаратной реализации
    Для аппаратной реализации согласен - может пригодиться. Но будет ли она?
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  10. #8
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    Для аппаратной реализации согласен - может пригодиться. Но будет ли она?
    Это не принципиально. Главное - разработать универсальную спецификацию.

    ...

    При реализации часов реального времени в составе дискового контроллера - полезно иметь интерфейс таких часов максимально "дискообразным", поэтому (возможно) есть смысл отказаться от специальных команд работы с таймблоком и вместо этого - работать с "приводом времени" как с обычным диском, выбираемым специальным номером привода за пределами разрешённых номеров приводов 0..255 ( например - восьмеричный номер привода 0444 = 292 ).

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

    В таком случае вместо одного общего таймблока - выгоднее предусмотреть несколько таймблоков с различным содержимым, например:

    Блок 0 - Дата и время.

    000000 - Size 0 - Размер блока в байтах.

    000002 - Year - Int16 - Номер года, содержащий число лет в дате новой эры или отрицательное число лет для даты до новой эры ( номер 0 - недопустим, поэтому при записи означает запись блока времени без даты, а при чтении - отсутствие даты в контроллере ).

    000004 - Month - Номер месяца в диапазоне 1..12 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000006 - Day - Номер дня в диапазоне 1..31 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000010 - WDay - Read Only - Номер дня в неделе в диапазоне 1..7 ( 1 = понедельник, 7 = воскресенье ), 0 - если дата не установлена или -1, если контроллер не поддерживает день недели.

    000012 - Hour - Номер часа в диапазоне 0..23 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000014 - Min - Номер минуты в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000016 - Sec - Номер секунды в диапазоне 0..59 или 60, если это високосная секунда, или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000020 - mSec - Номер миллисекунды в секунде в диапазоне 0..999 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи блока.

    000022 000024 - mTime - Int32 - Номер миллисекунды после полуночи в диапазоне 0..86399999 или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 4-х предыдущих полей не содержит -1.

    000026 000030 - Time - Int32 - Время в тиках ( номер тика после полуночи ) от 0 до TickMax ( зависит от поля частоты тиков ) или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 5 предыдущих полей не содержит -1.

    000032 - FTime - Частота тиков ( Гц ) в диапазоне 1..10000 ( допустимые значения: 1, 10, 50, 60, 100, 200, 500, 1000, 2000, 5000, 10000 ) или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи. При изменении этого поля - значение предыдущего поля пересчитывается для новой частоты тиков. При разрешении циклического прерывания - определяет его частоту.

    000034 000036 - ED - Int32 - Номер дня от начала эры ( -1 == 31.12.-1 | 1 == 01.01.01 ) в диапазоне: -106751992 .. +106751992 или 0, если контроллер не поддерживает это поле или оно не должно измениться при записи. При записи игнорируется, если хотя бы одно из предыдущих полей даты ( год, месяц, день ) было записано.

    000040 000042 000044 000046 - E0 - Int64 - Число секунд с момента начала эры ( -1 == 31.12.-1 23:59:59 | 0 == 01.01.01 00:00:00 | 1 == 01.01.01 00:00:01 ) в диапазоне: -9223372036854 .. +9223372036854 или 0x8000000000000000 ( 0x0000 0x0000 0x0000 0x8000 ), если контроллер не поддерживает это поле или оно не должно измениться при записи. При записи игнорируется, если хотя бы одно из предыдущих полей даты или времени ( кроме поля номера миллисекунды в текущей секунде ) было записано.

    000050 - LS - Величина високосной коррекции секунд в значении полей E0 и E6. Если контроллер или программа рассчитывает значения E0 и E6 без учёта високосных секунд UTC - это поле должно быть нулевым. Если при записи блока значение коррекции секунд, использованное программой, не соответствует правильному значению - контроллер исправляет разницу.

    000052 000054 000056 000060 - E6 - Int64 - Число микросекунд с момента начала эры в диапазоне: -0x7FFFFFFFFFFF .. +0x7FFFFFFFFFFF или 0x8000000000000000 ( 0x0000 0x0000 0x0000 0x8000 ), если контроллер не поддерживает это поле или оно не должно измениться при записи. При записи игнорируется, если хотя бы одно из предыдущих полей даты или времени было записано.


    Блок 1 - Управление циклическим прерыванием

    000000 - Size 1 - Размер блока в байтах.

    000002 - Vector - Вектор циклического прерывания: 0 - прерывания запрещены, 0100..0464 - прерывания разрешены, -1 - контроллер не поддерживает генерацию циклического прерывания или поле не должно измениться при записи.

    000004 - Prio - Приоритет циклического прерывания в диапазоне 4..7 или -1, если контроллер не поддерживает приоритет циклического прерывания или поле не должно измениться при записи.

    Если контроллер не поддерживает управление циклическим прерыванием - задание номера блока 1 ( как и попытка чтения или записи блока 1 ) возвращает ошибку с кодом IE_NUM ( 0356 = параметр вне диапазона ), если контроллер поддерживает блок 2, или с кодом IE_BLK ( 0354 = выход за пределы устройства ), если контроллер обслуживает только запросы к блоку 0.


    Блок 2 - Управление коррекцией

    000000 - Size 2 - Размер блока в байтах.

    000002 - Corr_60 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 секунд с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000004 - Corr_3600 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 минут с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000006 - Corr_216000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000010 - Corr_12960000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 3600 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000012 000014 - Range_3600 - Read Only Int32 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 3600", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000016 000020 - Range_216000 - Read Only Int32 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 216000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000022 000024 - Range_12960000 - Read Only Int32 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 12960000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    Если контроллер не поддерживает коэффициенты коррекции - задание номера блока 2 ( как и попытка чтения или записи блока 2 ) должно завершаться ошибкой с кодом "выход за пределы устройства".

    Запрос размера устройства должен возвращать: 1 - если поддерживается только блок 0; 2 - если поддерживаются блоки 0 и 1; 3 - если поддерживается блок 2.

    - - - Добавлено - - -

    Если контроллер не поддерживает изменение выбранного блока - выполнение записи должно завершаться ошибкой с кодом "попытка записи на защищённое устройство".
    В случае записи таймблока с ошибочным параметром в любом из полей - контроллер должен игнорировать переданный блок и возвращать ошибку записи с кодом IE_NUM = "параметр вне диапазона" ( 0356 ).
    Если в команде задания счётчика слов передаётся значение, превышающее размер блока контроллера - переданное значение должно запоминаться без изменений, но с возвращением ошибки IE_BLK "выход за пределы устройства".
    Если поле размера таймблока или заданное значение счётчика слов превышает размер выбранного блока контроллера - контроллер должен обработать поддерживаемые поля и завершить чтение/запись без ошибки.
    Если при записи размер таймблока (в первом слове блока) превышает счётчик слов, заданный дисковой командой "установить счётчик слов" или превышает размер выбранного блока контроллера - в качестве счётчика обрабатываемых слов контроллер должен использовать меньшее из трёх значений: 1) размер блока контроллера; 2) размер блока программы; 3) значение счётчика слов.
    При чтении - контроллер должен всегда выдавать в первом поле свой полный размер выбранного блока, но передавать программе количество слов блока, не превышающее текущее значение счётчика слов.


    Если контроллер не использует високосную коррекцию секунд, а программа при изменении даты и времени её передаёт - контроллер уменьшает переданное значение E0 на величину LS, а E6 - на величину LS*1000000.
    Если контроллер использует високосную коррекцию секунд, а программа нет - контроллер увеличивает переданное программой значение E0 на правильную величину LS, а E6 - на величину LS*1000000.
    Если контроллер и программа используют коррекцию секунд, но одно из значений превышает другое - правильным принимается большее значение на текущую дату.
    Если программа задаёт новую коррекцию секунд для даты, превышающей дату и величину последней коррекции секунд, используемой контроллером - контроллер должен запомнить дату введения новой коррекции и её величину.
    Если программа передаёт блок с единственным активным полем LS - контроллер при отсутствии запомненной даты дополнительной коррекции - запоминает текущую дату и переданную коррекцию, а при наличии запомненной даты дополнительной коррекции - изменяет значение коррекции для этой даты на переданное. Если контроллер не поддерживает високосную коррекцию секунд - запись блока с единственным активным полем LS игнорируется.
    Последний раз редактировалось Patron; 12.11.2017 в 19:33.

  11. #9
    Guru
    Регистрация
    02.03.2015
    Адрес
    г. Караганда, Казахстан
    Сообщений
    2,321
    Спасибо Благодарностей отдано 
    35
    Спасибо Благодарностей получено 
    225
    Поблагодарили
    177 сообщений
    Mentioned
    17 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С миллисекундами имеется некоторая напряженка - у STM32 RTC сделан по-простому. Есть два счетчика, один считает такты 32768, второй, в UNIX-стиле, считает секунды в 32-разрядном счетчике. Еще есть сигнал его переполнения, остальные разряды, сверх 32, рекомендуют считать программно. Рулёжке поддаётся только делитель для 32768. То есть, конечно, рассчитать все это программно - не вопрос, только точность будет не очень, лучше как-то учесть эти 32768...
    Последний раз редактировалось AFZ; 13.10.2017 в 17:08.
    Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)

  12. #10
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я делал так - при подаче питания на контроллер ( в моём случае это был запуск программы сервера точного времени ) - контроллер считывает значение счётчика секунд RTC и на его основе вычисляет базу счётчика миллисекунд после полуночи, как [ значение секунд RTC после полуночи +1 ]*1000, потом запускает собственный счётчик тысячных долей текущей секунды от делителя своей тактовой частоты и затем непрерывно опрашивает счётчик секунд RTC, а при его изменении - детектирует "срез секунды" и обнуляет свой счётчик тысячных долей секунды, также обнуляя дополнительный счётчик - секунд с момента последней синхронизации.

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

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

    Задача контроллера - максимально точно предсказывать момент смены секунды в RTC, чтобы дрейф его собственного кварца не влиял на вычисление пользователем коэффициентов коррекции для показаний RTC.

    Когда пользователь вводит коэффициенты коррекции - контроллер просто их запоминает, также запоминая базу значения счётчика секунд RTC в момент ввода коррекции. После этого при каждом запросе времени - вычисляется количество прошедших интервалов коррекции, умножается на коэффициент коррекции и прибавляется к счётчику миллисекунд после полуночи перед началом вычисления откорректированного значения даты и времени.

    Корректировать значение счётчика секунд RTC в таком случае не требуется - надо только вводить коррекции в момент вычисления даты и времени.

    - - - Добавлено - - -

    В принципе - такой алгоритм несложно адаптировать для использования счётчика тактов 32768 в качестве счётчика долей секунды. Тогда не будет мороки с синхронизацией счёта контроллера и счёта RTC, но для вычисления номера миллисекунды текущей секунды - потребуются вычисления на основе текущего значения счётчика тактов 32768.

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 190
    Последнее: 10.05.2018, 18:52
  2. PseudoTR-DOS для NEMO IDE без реального TR-DOS %)
    от fan в разделе Внешние накопители
    Ответов: 14
    Последнее: 15.01.2010, 16:01
  3. Ответов: 74
    Последнее: 09.07.2009, 12:39
  4. Spectrum как система реального времени
    от King of a S†ellar War в разделе ZX Концепции
    Ответов: 55
    Последнее: 21.12.2008, 19:57

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •