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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> вопрос по ds1307
MMP
сообщение Sep 15 2006, 09:32
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 43
Регистрация: 7-07-05
Из: г.Магнитогорск
Пользователь №: 6 618



Может кто посоветует как выполнить перевод часов.
Скажем регист часов содержит 0x22, что равно 22 часам.
hours = 0х22;
hours++;
но фишка в том, что в ds записывается и 0x25 и 0х29.
Приходится выполнять двойное преобразование:
BCD_DEC(hours); 0x22 -- 0x16
hours = DEC; //DEC возвращается BCD_DEC
hours++;
DEC_BCD_COR(Add_hr,hours); // обратное преобразование с записью в ds

к тому же писать функцию сравнения времени

Может возможно как-нить непосредстренно с ds, не прибегая к куче преобразований.

Сообщение отредактировал MMP - Sep 15 2006, 09:38
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 16 2006, 00:07
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



В 48м была специальная команда десятичной коррекции. Вот ее алгоритм:

Команда DA A

По команде DA А результат двоичного сложения упакованных двоично-десятичных чисел в аккумуляторе А преобразуется в упакованное двоично-десятичное число следующим образом. Если число в младших четырех разрядах аккумулятора больше девяти или триггер признака вспомогательного переноса АС установлен в состояние "1", то к содержимому аккумулятора прибавляется число 6;

если после этого число в старших четырех разрядах аккумулятора больше девяти или триггер признака переноса С установлен в состояние "1", то к содержимому аккумулятора прибавляют число 60Н.

При переносе из 7-го разряда АЛУ триггер признака переноса С устанавливается в состояние "1", в противном случае — в "0".
Go to the top of the page
 
+Quote Post
afad
сообщение Sep 18 2006, 10:33
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



Можно и без преобразования, просто нужно сделать 3 проверки:

hours++;
if(hours>0x23){hours=0;}
if(hours==0x1A){hours=0x20;}
if(hours==0x0A){hours=0x10;}
Go to the top of the page
 
+Quote Post
MMP
сообщение Sep 18 2006, 13:12
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 43
Регистрация: 7-07-05
Из: г.Магнитогорск
Пользователь №: 6 618



Тогда уж не три, а четыре
if(hours<0x00){hours = 0x23}

плюс восемь на минуты и т.д.
тоже геморно, так тоже пробовал

Сообщение отредактировал MMP - Sep 18 2006, 13:14
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 19 2006, 08:05
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



Увеличение часов:

hours++;
if(hours == 0x24) { hours = 0; }
if((hours & 0x0F) == 0x0A) {hours += 0x06; }

Увеличение минут:

minutes++;
if(minutes == 0x5A) { minutes = 0; }
if((minutes & 0x0F) == 0x0A) { minutes += 0x06; }

Уменьшение часов:

hours--;
if(hours == 0xFF) { hours = 0x23; }
if((hours & 0x0F) == 0x0F) {hours -= 0x06; }

Уменьшение минут:

minutes--;
if(minutes == 0xFF) { minutes = 0x59; }
if((minutes & 0x0F) == 0x0F) { minutes -= 0x06; }

Это если время можно менять только с помощью кнопок "плюс" и "минус". Если возможен прямой ввод, то нужн писать функцию Validate_Time, которая будет исправлять все возможные ситуации. Потребуется много проверок, с этим ничего не поделать.


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 19 2006, 08:42
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Вот за что я не люблю часы с "человеческим" интерфейсом.
Годятся только для отображения, а МК с ними работать весьма проблематично.
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 19 2006, 11:12
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



Очень многие человеческие единицы измерения неудобны для машин. Не говоря уже о 60-и минутах и 24-х часах, неудобно и то, что "кило" это не 1024, а всего 1000 и т.д. smile.gif Вот с дюймами раньше всё правильнее было - дюйм делили на 2, 4, 8 и т.д. Да и речь человеческая очень сильно отличается от всех языков программирования. Видно, не в том направлении техника развивается...


--------------------
Go to the top of the page
 
+Quote Post
afad
сообщение Sep 19 2006, 15:29
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



А вот еще задача, кажущаяся простой, но пока не нашел преемлимого решения.

Есть контроллер с часами DS1307.

Некое внешнее устройство время от времени передает в контроллер "эталонное" время. Необходимо установить часы DS1307, но только в том случае, если время на часах DS1307 отличается от принятого "эталонного" более чем на N секунд (например, N=10).

Читаем из часов: hour, min, sec.
Принимаем: Ehour, Emin, Esec.

Какам то образом сравниваем hour, min, sec и Ehour, Emin, Esec. Если разница между ними меньше N секунд, то hour=Ehour, sek=Esek, min=Emin и записываем все это в DS1307.

Но как сравнить hour, min, sec и Ehour, Emin, Esec??? С учетом перехода через час и через сутки!

Был вариант пересчитать время в число секунд с начала суток и потом сравнивать. Может есть еще варианты?
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 19 2006, 16:30
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



А зачем выдерживать минимальную разницу 10 сек? У меня такая же задача, обновляю DS1307 всегда, когда хост время шлет.

Если все-таки нужно вычислять разницу времени, вот откопал исходник на asm51, когда-то вычитал часы и минуты smile.gif

Код
;Input: R6,R5 = TM_H,TM_M
;Input: R4,R3 = Tn_H,Tn_M
;Out:   R4,R3 = TM_H,TM_M - Tn_H,Tn_M

SUB_T: CLR C
    MOV A,#5AH
    SUBB A,R3
    ADD A,R5
    DA A
    JC SU1
    CJNE A,#60H,$+3H
    CPL C
    JNC SU2
SU1:    ADD A,#40H
    DA A
    SETB C
SU2:      MOV R3,A
    PUSH PSW
    CLR C
    MOV A,#23H
    SUBB A,R4
    JNB AC,SU3
    SUBB A,#06H
SU3:    POP PSW
    ADDC A,R6
    DA A
    CJNE A,#24H,$+3H
    JC SU4
    ADD A,#76H
    DA A
SU4:    MOV R4,A
    RET


--------------------
Go to the top of the page
 
+Quote Post
afad
сообщение Sep 20 2006, 10:11
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



Цитата
А зачем выдерживать минимальную разницу 10 сек?
Не обязательно 10 секунд, можно и 2 сек, это как бы время неопределенности. Т.е. время передачи данных от хоста может быть каждый раз разным (у меня медленный радиоканал). Если мы каждый раз будем сразу устанавливать время в контроллере, то время в контроллере будет идти неравномерно (из за разного времени передачи), а длительность минуты будет 60 сек +- разница времени передачи от хоста к контроллеру. Чтобы все же в контроллере минута была точно 60 секунд, мы корректируем время не всякий раз после приема данных, а только в том случае, если оно отличается от эталонного на 10 сек (тогда одна минута будет не 60 секунд, зато все остальные точно 60).
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 20 2006, 13:03
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



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


--------------------
Go to the top of the page
 
+Quote Post
afad
сообщение Sep 20 2006, 15:05
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



Цитата(Леонид Иванович @ Sep 20 2006, 17:03) *
А зачем корректировать время каждый раз после приема данных? Автономные часы ведьтак быстро не убегают. Достаточно корректировать один раз в сутки, например.
Ну предположим, мы решили корректировать внутренние часы один раз в сутки в 00 часов. Первый раз включаем прибор, там произвольное время. Принимаем от хоста точное время, но не устанавливаем его, т.к. ждем, когда будет 00 часов. Нелогично! Или на хосте изменили время (зимнее/летнее или просто подкорректировали) то же самое, синхронизация произойдет только в назначенное время.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 20 2006, 15:27
Сообщение #13


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(afad @ Sep 20 2006, 19:05) *
Цитата(Леонид Иванович @ Sep 20 2006, 17:03) *

А зачем корректировать время каждый раз после приема данных? Автономные часы ведьтак быстро не убегают. Достаточно корректировать один раз в сутки, например.
Ну предположим, мы решили корректировать внутренние часы один раз в сутки в 00 часов. Первый раз включаем прибор, там произвольное время. Принимаем от хоста точное время, но не устанавливаем его, т.к. ждем, когда будет 00 часов. Нелогично! Или на хосте изменили время (зимнее/летнее или просто подкорректировали) то же самое, синхронизация произойдет только в назначенное время.

Ну дык корректируйте его при включении, а далее 1 раз в сутки.

Да, забыл сказать, дневную коррекцию делаем между 2 и 3 часами ночи
(ну или когда у нас там официально переводят часы зима/лето)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 21 2006, 06:20
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(singlskv @ Sep 20 2006, 18:27) *
(ну или когда у нас там официально переводят часы зима/лето)

В ноль часов по Гринвичу в ночь с последней субботы на последнее воскресенье марта или октября.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 21 2006, 06:51
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorKossak @ Sep 21 2006, 09:20) *
В ноль часов по Гринвичу в ночь с последней субботы на последнее воскресенье марта или октября.

С такими обобщениями - осторожнее, если собираетесь эксплуатировать прибор за пределами
Украины. По Европейским часовывым поясам час перехода завязан на GMT+2, что лишь случайно для Украины совпадает с GMT 0, Для многих других стран расположенных дальше от Британии - привязан к 0 по локальному времени +2..3 часа. Даты перехода тоже разные для разных регионов в "нормальных" регионах разбегаются месяца Апрель/Март и Первая/Последняя неделя месяца. Для "ненормальных" регионов с "мусульманским" летоисчислением - вообще полный мрак встречается :-(.


--------------------
Feci, quod potui, faciant meliora potentes
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 - 20:53
Рейтинг@Mail.ru


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