|
вопрос по ds1307 |
|
|
|
Sep 15 2006, 09:32
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Sep 18 2006, 13:12
|
Участник

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

|
Тогда уж не три, а четыре if(hours<0x00){hours = 0x23}
плюс восемь на минуты и т.д. тоже геморно, так тоже пробовал
Сообщение отредактировал MMP - Sep 18 2006, 13:14
|
|
|
|
|
Sep 19 2006, 15:29
|
Местный
  
Группа: Свой
Сообщений: 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??? С учетом перехода через час и через сутки!
Был вариант пересчитать время в число секунд с начала суток и потом сравнивать. Может есть еще варианты?
|
|
|
|
|
Sep 19 2006, 16:30
|

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

|
А зачем выдерживать минимальную разницу 10 сек? У меня такая же задача, обновляю DS1307 всегда, когда хост время шлет. Если все-таки нужно вычислять разницу времени, вот откопал исходник на asm51, когда-то вычитал часы и минуты  Код ;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
--------------------
|
|
|
|
|
Sep 20 2006, 10:11
|
Местный
  
Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545

|
Цитата А зачем выдерживать минимальную разницу 10 сек? Не обязательно 10 секунд, можно и 2 сек, это как бы время неопределенности. Т.е. время передачи данных от хоста может быть каждый раз разным (у меня медленный радиоканал). Если мы каждый раз будем сразу устанавливать время в контроллере, то время в контроллере будет идти неравномерно (из за разного времени передачи), а длительность минуты будет 60 сек +- разница времени передачи от хоста к контроллеру. Чтобы все же в контроллере минута была точно 60 секунд, мы корректируем время не всякий раз после приема данных, а только в том случае, если оно отличается от эталонного на 10 сек (тогда одна минута будет не 60 секунд, зато все остальные точно 60).
|
|
|
|
|
Sep 20 2006, 15:05
|
Местный
  
Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545

|
Цитата(Леонид Иванович @ Sep 20 2006, 17:03)  А зачем корректировать время каждый раз после приема данных? Автономные часы ведьтак быстро не убегают. Достаточно корректировать один раз в сутки, например. Ну предположим, мы решили корректировать внутренние часы один раз в сутки в 00 часов. Первый раз включаем прибор, там произвольное время. Принимаем от хоста точное время, но не устанавливаем его, т.к. ждем, когда будет 00 часов. Нелогично! Или на хосте изменили время (зимнее/летнее или просто подкорректировали) то же самое, синхронизация произойдет только в назначенное время.
|
|
|
|
|
Sep 20 2006, 15:27
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(afad @ Sep 20 2006, 19:05)  Цитата(Леонид Иванович @ Sep 20 2006, 17:03)  А зачем корректировать время каждый раз после приема данных? Автономные часы ведьтак быстро не убегают. Достаточно корректировать один раз в сутки, например.
Ну предположим, мы решили корректировать внутренние часы один раз в сутки в 00 часов. Первый раз включаем прибор, там произвольное время. Принимаем от хоста точное время, но не устанавливаем его, т.к. ждем, когда будет 00 часов. Нелогично! Или на хосте изменили время (зимнее/летнее или просто подкорректировали) то же самое, синхронизация произойдет только в назначенное время. Ну дык корректируйте его при включении, а далее 1 раз в сутки. Да, забыл сказать, дневную коррекцию делаем между 2 и 3 часами ночи (ну или когда у нас там официально переводят часы зима/лето)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|