Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



DS3231

Сообщений 1 страница 21 из 21

1

Микросхема запустилась, включение по типовой схеме.
Но после ночи батарейка сдохла...
Поставил вторую, когда микросхема запитывается от источника питания, потребления от батарейки вообще нет.
Когда питание отключено, китайский мультиметр показывает потребление порядка 0,5 мА.
Утечки по плате исключены, хорошо отмыто спиртом.
SQW переведена в режим 1 Гц, а сам вывод батарейки дополнительно посажен на ножку микроконтроллера для оперативного измерения на ней напряжения.
Вообщем то в чём вопрос - может ли каким то образом контроллер подпитываться через батарейку?
Или может быть нужно какие то регистры установить в самих часах для уменьшения потребления?
Разорвать проводник от часов к контроллеру не могу, чтобы исключить первое подозрение, так как заводская плата.

0

2

Всё таки подозрение на паразитное питание...
Придётся в разрыв резистор ставить порядка 510 кОм.

Продолжение темы - кто работал с датчиком температуры, вшитым в микруху?
Я получаю данные из регистров 11Н и 12Н.
Но они в двоично-десятичном формате, в первом знак температуры и целое, во втором - дробное.

'в регистре 0х11 хранится целая часть температуры и знак
'8 байт - знак температуры, остальные семь целая часть температуры
'в регистре 0х12 в 7 и 8 байте хранится дробная часть температуры с разрешением 0.25.

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

0

3

Вот тут народ что-то мучил
Ссылка

0

4

Так работет.
Если нужно минусовая температура или десятые, немного подточить код.
Может кому нибудь пригодится.

Код:
'========== Считывание температуры с микросхемы DS3231 ==========
'***************************************************************************************
GetTemper:
'в регистре 0х11 хранится целая часть температуры и знак
'8 байт знак температуры, остальные семь целая часть температуры
'в регистре 0х12 в 7 и 8 байте хранится дробная часть температуры с разрешением 0.25.

'к примеру:

'0х11 = 0b00011001
'0x12 = 0b0100000

'в итоге имеем знак температуры 0, т.е. +
'температура  0b 0011001 01  (0b0011001=25)(0b01=1; 1*0,25=0,25)
'в итоге температура +25.25 градусов
I2cstart                                   ' даем режим готовности часам
I2cwbyte Ds3231w                           ' адрес микросхемы
I2cwbyte &H11                              ' адрес откуда начинаем читать данные
I2cstart                                   ' даем сигнал старт на прочтение данных
I2cwbyte Ds3231r                           ' даем понять что готовы принимать данные
I2crbyte Temper_z , Ack                    ' целая часть температуры со знаком
I2crbyte Temper_d , Nack                  ' дробная часть
I2cstop                                    ' закончили


'Так как планируется часы держать только в помещении, игнорируем знак, он всегда будет плюс
'переводим данные из двоично-десятичного в десятичный формат
Temper3231 = Makedec(Temper_z)

if   Temper_d > 127 then 'Округляем в большую сторону
 incr Temper3231
End if

+1

5

radan написал(а):

Всё таки подозрение на паразитное питание... Придётся в разрыв резистор ставить порядка 510 кОм.

Чем история закончилась? Что было причиной такого большого потребления энергии?
И сколько эта DS3231 должна потреблять от батарейки?

0

6

Я в схеме часов организовал проверку напряжения на батарейке, для оперативного информирования о необходимости её замены.
Сама микросхема часов потребляет строго по даташиту.
Батарейка разряжалась через контроллер...
Поставил резистор в разрыв цепи батарейка - вход АЦП контроллера на 510 кОм, батарейка уже работает несколько месяцев.

+1

7

В ходе "допиливания" этого проекта И снова часики споткнулся об интересное поведение модуля часов.
На данном этапе он заменен на DS3231 Mini (изначально был DS1307).

При записи коррекции времени часы останавливаются и пропадают секундные импульсы на SQW/OUT...
Вернуть ход можно, если сразу же имитировать коррекцию даты (даже ничего не меняя).

При записи коррекции даты - с часами то же самое, но ход можно восстановить "ложной" коррекцией времени...

Если при коррекции выполнять запись всего "пакета" (время + дата), то запуск часов возможен только ручным ресетом...

Во всех случаях после записи новых значений производится запись в регистр управления:
I2cstart
I2cwbyte ds3231w
I2cwbyte &H0E
I2cwbyte &B00000000
I2cstop

В чем тут затыка ?

0

8

Это рабочий код. Проблем, подобных вашей, ни разу не наблюдал.

Код:
'==========Отправляем текущую дату в часы==========
'***************************************************************************************
Setdate:
   Dat = Makebcd(dat)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 4
   I2cwbyte Dat
   I2cstop

   Month = Makebcd(month)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 5
   I2cwbyte Month
   I2cstop

   Year = Makebcd(year)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 6
   I2cwbyte Year
   I2cstop
Return

'==========Отправляем текущие время в часы==========
'***************************************************************************************
Settime:
   Hour = Makebcd(hour)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 2
   I2cwbyte Hour
   I2cstop

   Mine = Makebcd(mine)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 1
   I2cwbyte Mine
   I2cstop

   Seco = Makebcd(seco)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 0
   I2cwbyte Seco
   I2cstop
Return

'==========Обнуляем секунды==========
'***************************************************************************************
Sec_zero:
   Seco = Makebcd(0)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 0
   I2cwbyte Seco
   I2cstop
Return

'==========Инкремент минут==========
'***************************************************************************************
Min_plus:
   Mine = Mine + 1
   If Mine = 60 Then Mine = 0
   Mine = Makebcd(mine)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 1
   I2cwbyte Mine
   I2cstop
Return

'==========Инкремент часов==========
'***************************************************************************************
Hour_plus:
   Hour = Hour + 1
   If Hour = 24 Then Hour = 0
   Hour = Makebcd(hour)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 2
   I2cwbyte Hour
   I2cstop
Return

'==========Инкремент секунд==========
'***************************************************************************************
Seco_plus:
   Seco = Seco + 1
   If Seco = 60 Then Seco = 0
   Hour = Makebcd(seco)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 0
   I2cwbyte Seco
   I2cstop
Return

'==========Декремент минут==========
'***************************************************************************************
Min_minus:
   Mine = Mine - 1
   If Mine > 59 Then Mine = 59
   Mine = Makebcd(mine)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 1
   I2cwbyte Mine
   I2cstop
Return
'==========Декремент часов==========
'***************************************************************************************
Hour_minus:
   Hour = Hour - 1
   If Hour > 23 Then Hour = 23
   Hour = Makebcd(hour)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 2
   I2cwbyte Hour
   I2cstop
Return
'==========Декремент секунд==========
'***************************************************************************************
Seco_minus:
   Seco = Seco - 1
   If Seco > 59 Then Seco = 59
   Hour = Makebcd(seco)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 0
   I2cwbyte Seco
   I2cstop
Return

'==========Установить день недели==========
'***************************************************************************************
Week_day:
   Seco = Makebcd(0)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 3
   I2cwbyte Weekday
   I2cstop
Return

'==========Инкремент числа==========
'***************************************************************************************
Data_plus:
   Dat = Dat + 1
   If Dat > 31 Then Dat = 1
   Dat = Makebcd(dat)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 4
   I2cwbyte Dat
   I2cstop
Return

'==========Инкремент месяца==========
'***************************************************************************************
Mounth_plus:
   Month = Month + 1
   If Month > 12 Then Month = 1
   Month = Makebcd(month)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 5
   I2cwbyte Month
   I2cstop
Return

'==========Инкремент года==========
'***************************************************************************************
Year_plus:
   Year = Year + 1
   If Year > 99 Then Year = 13
   Year = Makebcd(year)
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte 6
   I2cwbyte Year
   I2cstop
Return


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

Код:
'==========Коррекция частоты DS3231==========
'***************************************************************************************
Corr_ds3231:
'каждый шаг регулировки изменяет тактовую частоту на работу примерно 0,1 промилле (что выражается в примерно между 0,002 до 0,003 Гц)
   If Correct_ds3231 < 0 Then
      C_ds3231 = Correct_ds3231 + 256
   Else
      C_ds3231 = Correct_ds3231
   End If
   Tmp_copy_byte = C_ds3231

   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte Const_aging_offset
   I2cwbyte Tmp_copy_byte
   I2cstop


   'Так как обычно ТСХО корректируется каждые 64 секунд, для того, чтобы изменения вступили в силу немедленно, нам нужно,
   'чтобы установить CONV бит (бит 5) в высокий уровень в регистре управления (0x0E):
   I2cstart
   I2cwbyte Ds3231w
   I2cwbyte &H0E
   I2cwbyte &B00111100
   I2cstop

Return

0

9

С модулями на 1307 такого не наблюдалось, но возвращаться к ним уже не буду однозначно.

Так самое интересное, что делаю то же самое, как и в вашем коде, только "пакетом"...
Разумеется, со всеми значениями Makebcd(ххх)...
Да и подавляющее большинство так работает. ;)

Отправка даты:

Код:
I2cstart
I2cwbyte Ds3231w
I2cwbyte &H03
I2cwbyte Day
I2cwbyte Dat
I2cwbyte Month
I2cwbyte Year
I2cstop

Отправка времени, причем секунды - сразу в "0" (выделено), они мне малоинтересны ;) :

Код:
I2cstart
I2cwbyte Ds3231w
I2cwbyte 0
I2cwbyte 0     - секунды
I2cwbyte Mine
I2cwbyte Hour
I2cstop

После любой из записей - сразу запись в регистр управления (см. выше)...

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

250мс - минимум, при котором уловка срабатывает.
При меньше 110мс - вообще часы пургу гнать начинают, типа 26:84 или 31 февраля... ;)

0

10

Nord написал(а):

При записи коррекции времени часы останавливаются и пропадают секундные импульсы на SQW/OUT...


Чего тут странного, китайские ds3231 ещё и не такое вытворяют.

0

11

sasha_1973 написал(а):

Чего тут странного, китайские ds3231 ещё и не такое вытворяют.

Страну происхождения установить трудно, т.к. модуль брался у продаванов в РФ... ;)
Откуда он у них - "Кто ж на Плюке правду думает ?" (с) "Кин-Дза-Дза" ;)

0

12

Nord написал(а):

Страну происхождения установить трудно, т.к. модуль брался у продаванов в РФ..


Фотка модуля ?

Цена модуля ?

Зайдите на сайт производителя и посмотрите цену ds3231 !

0

13

sasha_1973 написал(а):

Фотка модуля ?

http://s3.uploads.ru/t/izBmX.jpg

sasha_1973 написал(а):

Цена модуля ?
Зайдите на сайт производителя и посмотрите цену ds3231 !

За модуль - 140р.
Вполне нормально даже для "фирменной" микрухи (90...110р на разных сайтах).

Да и теперь уже так не важно, кто ее слепил - выход, вроде пока найден, время покажет. ;)

0

14

Nord написал(а):

За модуль - 140р.
Вполне нормально даже для "фирменной" микрухи (90...110р на разных сайтах).


Вы же взрослый человек, какая "фирма", за 2 $    !?

Цена у производителя

http://s5.uploads.ru/t/YdGAa.jpg

Цены распространённого продавца в Украине, обратите внимание на цены готовых модулей и голых чипов

http://s9.uploads.ru/t/D7UsA.jpg

Цена оригинальной ds3231sn# = 305 грн. = 305 / 27 = 11.296 $

И это только чип, а батарейка, разъём, плата, обвязка - и это всё за 140 руб = ~ 2 $

0

15

sasha_1973 написал(а):

Вы же взрослый человек, какая "фирма", за 2 $    !?

Достаточно уважаемая контора, например... ;)
http://www.platan.ru/cgi-bin/qwery.pl/id=204589838

Что мы друг другу доказываем-то ? ;)
Ну, китай мне, возможно, попался - что это уже изменит ?

0

16

Nord написал(а):

Ну, китай мне, возможно, попался


Не возможно, а 200 % Китай ! Под производителем, я подразумеваю изготовителя микросхем.

Да ничего не доказываем, просто мы по своему нищебродству, хотим дёшево и качественно, а чудеса если и бывают, то только в сказках !

Как вариант проверки оригинальности:
ds3231sn - измеряет t°C раз в минуту (питание без vcc, от bat), можно увидеть по потреблению, идёт бросок тока до 1 mA
ds3231mz - измеряет t°C раз в 10 сек (питание без vcc, от bat), можно увидеть по потреблению, идёт бросок тока до 1 mA
Вывод 32kHz = 32768 ±0.5 Hz

Не оригинальные меряют реже, или вообще не меряют

+1

17

sasha_1973 написал(а):

Да ничего не доказываем, просто мы по своему нищебродству, хотим дёшево и качественно, а чудеса если и бывают, то только в сказках !

Проверю, конечно, "на оригинальность", но чисто "для проформы"... ;)
Откатываться на 1307 буду только, если не устроят результаты прогона.
Кстати, модули с 1307 - однозначно оттуда же, даже "Made In..." присутствует... ;)

Пока у меня это первый случай, когда "китай" дал повод задуматься.

0

18

Nord написал(а):

Пока у меня это первый случай, когда "китай" дал повод задуматься.


Значит редко используете, я в ответственные конструкции комплектацию заказываю здесь , пока не подводили.

+1

19

sasha_1973 написал(а):

Значит редко используете

Ну, где-то раз месяц что-то заказывается...
МК поголовно беру у них.
Остальной ассортимент используемого невелик, тоже брал у них.
Мелочевку или что-то срочное беру в РФ и инетпродаванов.

0

20

Nord написал(а):

Откатываться на 1307 буду только, если не устроят результаты прогона.

Лучше сразу на mk41t56

0

21

Оно, может и лучше, но есть большая вероятность, что эти часики - первые и последние... ;)
Надо было задействовать дисплей - вот и сварганил... ;)

Вечером будет уже двое суток прогона, время от времени "мучаю" сборку, коррекциями даты или времени.
Маневр с кратковременным отключением питания модуля, походу, удался - все тикает нормально.
Погоняю еще пару суток, хотя и так уже понятно... ;)

0