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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Число 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 и т.д).
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

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

Сообщение tantrum »

А в DS1307 можно записывать данные чтоли в двоичной системе, шестнадцатеричной и десятичной...?
Так а как же тогда записать, например, ту же дату 23.02.2015, чтобы потом ее прочитать, вывести на экран и увидеть именно 23.02.2015?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Чтобы записать туда 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 раз.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

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

Это в какой арифметике ? По-моему, 0x23 = 35
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Да, извините, сверху опечатался, снизу в примере с кодом было верно. Сейчас поправлю.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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


А даташит хош почитать?
ds1307map.pdf
(16.1 КБ) 296 скачиваний

неуж-то окончательно на укрруине молодеж...
:cry:
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Писать-то и читать можно хоть в какой системе. Другое дело, что сами часы считают время и дату в двоично-десятичной.
То есть, после 0x09 в часах наступает не 0x0A, а 0x10.
То есть, если читать оттуда без преобразований в десятичной системе (записав в ней же), то после 9-й секунды сразу наступает 16-я и т.д.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

В то же время там в каждой ячейке свой модуль счета и служебные добавки - в любом случае первичное выделение информации с последующим преобразованием. То же касается и обратного процесса - записи в ячейки часов/календаря - предварительная обработка данных, добавление сохраненных служебных флажков и уж после того - запись в ОЗУ.
Так что простой подход к "чистой" системе счисления тут может и не дать результата...
8)
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

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

Сообщение tantrum »

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

BOB51

В 56 лет уже пора бы головой думать, прежде чем писать всякое.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

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

Аналогично - 6 бит часов, отвечающий за 12/24 режим. Если просто писать туда время - мы затрём этот бит и выйдем в 24-часовой режим. Хотя кому-то может понадобиться 12-часовой с PM/AM - и тут уже без учёта бита не обойтись.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

WiseLord, операции с маской неведомы ?
Так же неведома работа со строками ASСII , что в случае с bcd прямо таки и напрашивается вместо магически-навороченных манипуляций .
ЗЫ. дедушку BOB51 не трожьте , он навечно погряз в асме 51го ...
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

dosikus - это верно "погряз в асме", но разве ж только 51-й? :))
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

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

Сообщение tantrum »

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

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

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

А к чему вы это написали?
Аватара пользователя
4elovek37
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Вс дек 08, 2013 14:57:33
Откуда: Россия, Иваново

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

Сообщение 4elovek37 »

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

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

Сообщение Gudd-Head »

4elovek37 писал(а):А как там реализована функция будильника? Неужели туда можно ввести текущее время, целевое время, и, по достижении первым второго часы что то сделают (они же не могут в роли Master выступать?)
У 1307 вроде нет будильника. У 1337 есть, там отдельная нога прерывания.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
4elovek37
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Вс дек 08, 2013 14:57:33
Откуда: Россия, Иваново

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

Сообщение 4elovek37 »

Gudd-Head, спасибо, понял. А к ds1307 можно 32768 кварц напрямую цеплять, или придется добавочно ставить 2 конденсатора?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Напрямую, там же даже в ДШ нарисовано. И лучше кварц с нагрузочной ёмкостью 12,5 пФ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
4elovek37
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Вс дек 08, 2013 14:57:33
Откуда: Россия, Иваново

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

Сообщение 4elovek37 »

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

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

Сообщение Gudd-Head »

Чо-й то мне кажется, что это обычный счётчик от 1 до 7 и на остальной календарь ему пох, он просто тикает каждую полночь. И если вы его нулём шарахните, он будет считать так: 0-1-2-...-7-1-...
пользователь вводит Минуты-Часы-Дата-Месяц-Год-ОК
Это жестоко. Обычно время отдельно, дата отдельно.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
4elovek37
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Вс дек 08, 2013 14:57:33
Откуда: Россия, Иваново

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

Сообщение 4elovek37 »

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

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

Вернуться в «Периферия»