Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Ср янв 07, 2015 23:50:24

Число 23 хранится в микросхеме в двоично-десятичном формате. Т.е 2 = 0b0010 и 3 = 0b0011, т.е. реально в регистре микросхемы лежит число 0b00100011 = 0x23 = 35.

Для чисел меньше 10 всё совпадает, потом начинается разница:

Код:
 0 = 0b00000000 = 0x00 = 0
 1 = 0b00000001 = 0x01 = 1
..
 9 = 0b00001001 = 0x09 = 9
10 = 0b00010000 = 0x10 = 16
11 = 0b00010001 = 0x11 = 17
и т.д.
На каждую десятку нарастает лишняя шестёрка.

Раньше Вы писали совсем неправильно, например
Код:
 else if (week == 00011) lcd_string("TUE",3);

Тут нужно было писать не 00011, а 0b00011. В языке C числовая константа, начинающаяся с 0 интерпретируется как восьмеричная (равно как 0b - двоичная, 0x - шестнадцатеричная). Поэтому, 11 в восьмеричной системе - это девятка. Естественно, такого дня недели нет. Такая неправильная запись срабатывала бы только для воскресенья, которое = 1 во всех системах счисления. Остальные дни давали бы числа большие или равные 8 (010 = 8, 011 = 11, 0100 = 64 и т.д).

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 08, 2015 00:24:36

А в DS1307 можно записывать данные чтоли в двоичной системе, шестнадцатеричной и десятичной...?
Так а как же тогда записать, например, ту же дату 23.02.2015, чтобы потом ее прочитать, вывести на экран и увидеть именно 23.02.2015?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 08, 2015 06:13:25

Чтобы записать туда 23.02.2015, нужно:
- в ячейку даты записать 0x23 = 35,
- в ячейку месяца записать 0x02 = 2,
- в ячейку года записать 0x15 = 21.
При чтении
- прочитав из даты 35, преобразовать 32 = 0x23 в число 23,
- прочитав из месяца 2, преобразовать 2 = 0x02 в число 2,
- прочитав из года 21, преобразовать 21 = 0x15 в число 15.
Прямое и обратное преобразование можно сделать теми же макросами
Код:
#define D2BD(x)  (((x / 10) << 4) + (x % 10))
#define BD2D(x)  ((x >> 4) * 10 + (x & 0x0F))

Например для даты получатся вычисления
Код:
D2BD(23) = (((23 / 10) << 4) + (23 % 10)) = ((2 << 4) + 3) = 32 + 3 = 35
BD2D(35) = ((35 >> 4) * 10 + (35 & 0x0F)) = 2 * 10 + 3 = 23
Последний раз редактировалось WiseLord Чт янв 08, 2015 10:02:52, всего редактировалось 1 раз.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 08, 2015 09:56:44

WiseLord писал(а):0x23 = 32

Это в какой арифметике ? По-моему, 0x23 = 35

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 08, 2015 10:02:24

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

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 08, 2015 12:17:10

tantrum писал(а):А в DS1307 можно записывать данные чтоли в двоичной системе, шестнадцатеричной и десятичной...?
Так а как же тогда записать, например, ту же дату 23.02.2015, чтобы потом ее прочитать, вывести на экран и увидеть именно 23.02.2015?


А даташит хош почитать?
ds1307map.pdf
(16.1 KiB) Скачиваний: 249

неуж-то окончательно на укрруине молодеж...
:cry:

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 08, 2015 12:34:08

Писать-то и читать можно хоть в какой системе. Другое дело, что сами часы считают время и дату в двоично-десятичной.
То есть, после 0x09 в часах наступает не 0x0A, а 0x10.
То есть, если читать оттуда без преобразований в десятичной системе (записав в ней же), то после 9-й секунды сразу наступает 16-я и т.д.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт янв 09, 2015 10:37:35

В то же время там в каждой ячейке свой модуль счета и служебные добавки - в любом случае первичное выделение информации с последующим преобразованием. То же касается и обратного процесса - записи в ячейки часов/календаря - предварительная обработка данных, добавление сохраненных служебных флажков и уж после того - запись в ОЗУ.
Так что простой подход к "чистой" системе счисления тут может и не дать результата...
8)

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт янв 09, 2015 15:02:58

Понял) Спасибо за объяснение.
Однако дата не переключается по окончании суток...

BOB51

В 56 лет уже пора бы головой думать, прежде чем писать всякое.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт янв 09, 2015 15:29:56

А всё написано правильно.

Скажем, 7-й бит секунд - остановка часов. Если писать туда 0b1xxxxxxx - часы остановятся. Если просто писать туда секунды - мы будет всегда затирать этот бит, поэтому по большому счёту корректнее учитывать его состояние, а не просто затирать.

Аналогично - 6 бит часов, отвечающий за 12/24 режим. Если просто писать туда время - мы затрём этот бит и выйдем в 24-часовой режим. Хотя кому-то может понадобиться 12-часовой с PM/AM - и тут уже без учёта бита не обойтись.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт янв 09, 2015 16:22:55

WiseLord, операции с маской неведомы ?
Так же неведома работа со строками ASСII , что в случае с bcd прямо таки и напрашивается вместо магически-навороченных манипуляций .
ЗЫ. дедушку BOB51 не трожьте , он навечно погряз в асме 51го ...

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт янв 09, 2015 17:08:46

И чего ж я неверного написал? 8)

dosikus - это верно "погряз в асме", но разве ж только 51-й? :))

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт янв 09, 2015 17:21:50

WiseLord писал(а):А всё написано правильно.

Скажем, 7-й бит секунд - остановка часов. Если писать туда 0b1xxxxxxx - часы остановятся. Если просто писать туда секунды - мы будет всегда затирать этот бит, поэтому по большому счёту корректнее учитывать его состояние, а не просто затирать.

Аналогично - 6 бит часов, отвечающий за 12/24 режим. Если просто писать туда время - мы затрём этот бит и выйдем в 24-часовой режим. Хотя кому-то может понадобиться 12-часовой с PM/AM - и тут уже без учёта бита не обойтись.

А к чему вы это написали?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт фев 27, 2015 10:51:45

Здравствуйте. Хочу вот приобрести часики
http://www.chipdip.ru/product/ds1307z/
, а названии указано " DS1307Z+T&R, Часы реального времени, будильник, ОЗУ 56-бит, последовательный интерфейс, 3В, 500нА"
А как там реализована функция будильника? Неужели туда можно ввести текущее время, целевое время, и, по достижении первым второго часы что то сделают (они же не могут в роли Master выступать?)

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт фев 27, 2015 11:33:11

4elovek37 писал(а):А как там реализована функция будильника? Неужели туда можно ввести текущее время, целевое время, и, по достижении первым второго часы что то сделают (они же не могут в роли Master выступать?)
У 1307 вроде нет будильника. У 1337 есть, там отдельная нога прерывания.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт фев 27, 2015 12:37:35

Gudd-Head, спасибо, понял. А к ds1307 можно 32768 кварц напрямую цеплять, или придется добавочно ставить 2 конденсатора?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт фев 27, 2015 12:47:55

Напрямую, там же даже в ДШ нарисовано. И лучше кварц с нагрузочной ёмкостью 12,5 пФ.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт мар 05, 2015 10:54:34

Спасибо за советы. Запрограммировал SMBus, вроде бы даже работает :) По крайней мере записать - прочитать записанное из регистра часов получается.
Пишу интерфейс для их настройки, по задумке пользователь вводит Минуты-Часы-Дата-Месяц-Год-ОК, дальше часы стартуют стартуют с 0 секунды.
Возникла непонятка с днем недели (который 1-7) - если я его инициализирую нулями, а все остальное выставлю корректно - часы будут нормально идти? Он случайно сам не сможет настроиться (про календарь в ДШ ничего не видел, но мало ли) - что бы мне потом из него можно было день недели прочитать? Или все таки для этого придется заставлять юзера вводить и этот параметр?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт мар 05, 2015 11:12:27

Чо-й то мне кажется, что это обычный счётчик от 1 до 7 и на остальной календарь ему пох, он просто тикает каждую полночь. И если вы его нулём шарахните, он будет считать так: 0-1-2-...-7-1-...
пользователь вводит Минуты-Часы-Дата-Месяц-Год-ОК
Это жестоко. Обычно время отдельно, дата отдельно.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт мар 05, 2015 12:01:54

Это жестоко. Обычно время отдельно, дата отдельно.

Я заставлю пользователя страдать (тут должен звучать смех доктора зло) :)))
А если серьезно, то данную операцию ему придется проделать всего один раз, при первом запуске устройства. Дальше при любом включении устройство будет забирать дату время из часов. Думаю в ОЗУ у них флаг разместить, его и будем спрашивать.
Ответить