Приобрёл ds3231, а она не работает

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Такая вот "картина маслом".

Никак не могу ни считать время, ни установить - выдаёт какую то ерунду.
Пытался просто считать температуру из неё, как у кого то здесь видел - выдаёт 255.75
Подскажите, что я делаю не так?
Адрес 3231 сканер показал 0х57, дисплей 0х27.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

void setup() {
  Wire.begin();
  lcd.begin(20,4);
  lcd.init();   // Сброс экрана
  lcd.backlight();   // Включение подсветки
  lcd.clear();    // Очистка экрана
}

void loop() {

Что посмотреть, куда копать?
Wire.beginTransmission(0x57);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(0x57, 2);
float temp= (Wire.read()<<2 | Wire.read()>>6)*0.25;

lcd.setCursor(13, 0);
lcd.print(temp);
}
ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Какая то фигня попала при написании сообщения в 16 строку...
В тексте её нет.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

А если взять какой-нибудь пример от DS3231?

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Пробовал примером читать и выводить дату-время - полный бред, что то типа 255:255:255:450 

Просто для примера, число могло быть другим... 

Без модуля показывает -0,25

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Да нет, берете пример от библиотеки DS3231, ничего не меняете, заливаете и смотрите - работает или нет. Вывод там обычно в сериал

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Вот такое выдаёт ds3231_test^

9:00:01.270 -> 21165 85 165 165 25 165 165 PM T=-0.25 O- A1! A2!
19:00:01.338 -> Alarm 1: 15 DoW 25 85 85 27936enabled
19:00:01.372 -> Alarm 2: 15 DoW 25 85 28781enabled148801111111
19:00:01.440 -> 
 
Такую же ерунду он выдаёт и при адресе 0х68:
19:07:47.567 -> 21165 85 165 165 25 165 165 PM T=-9999.00 O- A1! A2!
19:07:47.635 -> Alarm 1: 15 DoW 25 85 85 27936enabled
19:07:47.669 -> Alarm 2: 15 DoW 25 85 28781enabled148801111111
19:07:47.737 -> 

 

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Да, напряжение 3,09В
Вопросик, а у неё вывод 32К всегда работает? Щуп осцилографа потянет?

Дело в том, что осцилограф на этом выводе ничего не показывает...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Ну вроде бы вполне осмысленно время выдает - часы:минуты:секунды.милисекунды. В чем проблема-то?

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

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

А как тогда расшифровать это:

 21165 85 165 165 25 165 165 PM 

П.С. Теоретически ds3231_set время настроил...

apg_777
Offline
Зарегистрирован: 22.09.2020

Адрес 68.

Установить время. После сброса питания может выдавать чушь, не всегда по нулям сбрасывается. Не далее как вчера модуль так же себя вёл, установил время — всё нормализовалось.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ArturKu пишет:

А как тогда расшифровать это:

 21165 85 165 165 25 165 165 PM 

П.С. Теоретически ds3231_set время настроил...

Не знаю. В скетче написано, что там выдается. У меня этого скетча нету ))

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

apg_777

IIC сканер говорит, что 57? Все перемычки разомкнуты (изначально)

Просто забил и попробовал с 68 адресом?

19:24:36.497 -> 21165 85 165 165 25 165 165 PM T=-9999.00 O- A1! A2!
19:24:36.531 -> Alarm 1: 15 DoW 25 85 85 27936enabled
19:24:36.565 -> Alarm 2: 15 DoW 25 85 28781enabled148801111111
 
Цифры в ответе не меняются - они всегда такие...
v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

А теперь кроме времени установите дату и день недели. И будильники у вас на 15-й день недели настроены. У микросхемы нет контроля валидности даты - что в нее записалось, то и будет выдавать, хоть 48 февраля ))

apg_777
Offline
Зарегистрирован: 22.09.2020

3231 не видел ни одного с адресом не 68.

Резисторы подтяжки стоят? Без них в чистом виде не работает.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Так я ж не голую 3231 использую, а в виде модуля. Там всё стоит. Единственное отогнул диод.
Устанавливаю дату/время стандартным скетчем из примеров:

/*
DS3231_set.pde
Eric Ayars
4/11

Test of set-time routines for a DS3231 RTC

*/

#include <DS3231.h>
#include <Wire.h>

DS3231 Clock;

byte Year;
byte Month;
byte Date;
byte DoW;
byte Hour;
byte Minute;
byte Second;

void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, 
		byte& Hour, byte& Minute, byte& Second) {
	// Call this if you notice something coming in on 
	// the serial port. The stuff coming in should be in 
	// the order YYMMDDwHHMMSS, with an 'x' at the end.
	boolean GotString = false;
	char InChar;
	byte Temp1, Temp2;
	char InString[20];

	byte j=0;
	while (!GotString) {
		if (Serial.available()) {
			InChar = Serial.read();
			InString[j] = InChar;
			j += 1;
			if (InChar == 'x') {
				GotString = true;
			}
		}
	}
	Serial.println(InString);
	// Read Year first
	Temp1 = (byte)InString[0] -48;
	Temp2 = (byte)InString[1] -48;
	Year = Temp1*10 + Temp2;
	// now month
	Temp1 = (byte)InString[2] -48;
	Temp2 = (byte)InString[3] -48;
	Month = Temp1*10 + Temp2;
	// now date
	Temp1 = (byte)InString[4] -48;
	Temp2 = (byte)InString[5] -48;
	Day = Temp1*10 + Temp2;
	// now Day of Week
	DoW = (byte)InString[6] - 48;		
	// now Hour
	Temp1 = (byte)InString[7] -48;
	Temp2 = (byte)InString[8] -48;
	Hour = Temp1*10 + Temp2;
	// now Minute
	Temp1 = (byte)InString[9] -48;
	Temp2 = (byte)InString[10] -48;
	Minute = Temp1*10 + Temp2;
	// now Second
	Temp1 = (byte)InString[11] -48;
	Temp2 = (byte)InString[12] -48;
	Second = Temp1*10 + Temp2;
}

void setup() {
	// Start the serial port
	Serial.begin(9600);

	// Start the I2C interface
	Wire.begin();
}

void loop() {

	// If something is coming in on the serial line, it's
	// a time correction so set the clock accordingly.
	if (Serial.available()) {
		GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);

		Clock.setClockMode(false);	// set to 24h
		//setClockMode(true);	// set to 12h

		Clock.setYear(Year);
		Clock.setMonth(Month);
		Clock.setDate(Date);
		Clock.setDoW(DoW);
		Clock.setHour(Hour);
		Clock.setMinute(Minute);
		Clock.setSecond(Second);

		// Test of alarm functions
		// set A1 to one minute past the time we just set the clock
		// on current day of week.
		Clock.setA1Time(DoW, Hour, Minute+1, Second, 0x0, true, 
			false, false);
		// set A2 to two minutes past, on current day of month.
		Clock.setA2Time(Date, Hour, Minute+2, 0x0, false, false, 
			false);
		// Turn on both alarms, with external interrupt
		Clock.turnOnAlarm(1);
		Clock.turnOnAlarm(2);

	}
	delay(1000);
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

del

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Насколько я понял - её надо отправить в ком порт: 2010180193700x

Или я туплю?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Нет, это я затупил ))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

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

21165 85 165 165 25 165 165 PM T=-9999.00 O- A1! A2!

означает - год, месяц, число месяца, день недели, часы, минуты, секунды, флаг AM/PM, температура, проверка флага кварца, первый и второй будильники (включены или нет)

если флаг кварца O-, значит время показывается неверно, в библиотеке описано так:

Checks the status of the OSF (Oscillator Stop Flag);.
If this returns false, then the clock is probably not
giving you the correct time.
The OSF is cleared by function setSecond();.

 

Feofan
Offline
Зарегистрирован: 28.05.2017

ArturKu. Если модуль, то I2C сканер должен определить два адреса. К примеру: 0x57 адрес EEPROM, 0x68 адрес ds3231. И посмотрите тут, мне помогло "стартануть", но в итоге пришлось-таки читать и datasheet.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Feofan пишет:

ArturKu. Если модуль, то I2C сканер должен определить два адреса. К примеру: 0x57 адрес EEPROM, 0x68 адрес ds3231. И посмотрите тут, мне помогло "стартануть", но в итоге пришлось-таки читать и datasheet.

Тогда понятно - у меня только один адрес видит.
Я как раз, пока жене блок питания делал, хотел спросить про кол-во адресов...

Получается, что сама микруха битая... Надо попробовать отпаять и припаять снова.

Перепаял. Ничего не изменилось... Жаль.

Feofan
Offline
Зарегистрирован: 28.05.2017

Прозвоните выводы DS3231 (SCL и SDA) до подтягивающих резисторов и пинов, к которым подключаетесь.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Feofan

Первым делом. Всё доходит, всё подтягивается. 3231 даже на выход что-то выдаёт...
Но адрес часов, УВЫ...

Feofan
Offline
Зарегистрирован: 28.05.2017

Ну тады ой...

sadman41
Offline
Зарегистрирован: 19.10.2016

Я тут как-то I2C модули, расчитанные на 5V, подключал к Sonoff TH16. А из него питание 3.3V лезет. Вот там тоже чудеса происходят - сканер правильно работает, а дальше - то модуль перестает отвечать, то просто Wire подвисает.

Feofan
Offline
Зарегистрирован: 28.05.2017

И куда лезет?

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, куда... На LDO модуля. И на нём, как я понимаю, неприлично падает, вызывая спецэффекты. Те сенсоры, которым 1.8V хватает для работы, SGP-30 например, - тащат, а вот тот же BMP280 в 5V версии - нет.

Feofan
Offline
Зарегистрирован: 28.05.2017

Вроде понял.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Кстати, по поводу "лишнего" диода. Если модуль питать от 3.3В, то его можно не убирать.

Green
Offline
Зарегистрирован: 01.10.2015

Обычно сначала проверяют в "штатном" включении, а затем уже что то выпаивают...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Обычно сначала проверяют в "штатном" включении, а затем уже что то выпаивают...

мы русские так не можем...

PS вспоминаю свою работу по ремонту станков, открываю блок, там понахерачено...сначала день потребовался восстановить по оригиналу, потом час поиск неисправности, потом день, пока снабженцы комплектующие нашли, то, что надо, а ни лишь бы начальные цифры совпадали, перед эти станок ломался каждые два дня, сделал, за 8 лет не поломался, а потом я ушёл в одну контору с WDRAKULA отчёты готовить )))
 

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Green

Так и было. Сперва не запустился. Потом полез искать советы - наткнулся на идею с диодом - проверил ДА, выпаял.
Когда уже ковырялся и окончательно пришел к выводу о "трупике", от скуки стал измерять и пришёл к указанному выводу.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Ура! Пришли 3231, перепаял и теперь вижу 2 адреса 0х58 и 0х57!!!

Ух же-ж я её!

Интересно, на Выход 32768 она выдаёт частоту только после настройки хоть какого то времени? 

Green
Offline
Зарегистрирован: 01.10.2015

А если плюнуть вверх, что будет? Интересно.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Green, не поверишь, но с большой долей вероятности упадёт обратно. ;-)
Законы Ньютона, мать их! Ну никак не нарушить...

nik182
Offline
Зарегистрирован: 04.05.2015

А мануал что пишет?

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

nik182, а он, гад, посылает с вопросами к Господу Богу. А остальное чуток выше озвучено...

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

ArturKu пишет:

nik182, а он, гад, посылает с вопросами к Господу Богу. А остальное чуток выше озвучено...

 

Так в даташите вроде все написано
Status Register (0Fh)

Bit 3: Enable 32kHz Output (EN32kHz). This bit controls the status of the 32kHz pin. When set to logic 1, the 32kHz pin is enabled and outputs a 32.768kHz squarewave signal. When set to logic 0, the 32kHz pin goes to a high-impedance state. The initial power-up state of this bit is logic 1, and a 32.768kHz square-wave signal appears at the 32kHz pin after a power source is applied to the DS3231 (if the oscillator is running).

То бишь при подаче питания в бите 3 регистра 0Fh записана 1 и на вывод подается 32kHz , вы можете записать туда 0 тогда выход переведется в high-impedance state.

Но есть условие осцилятор должен работать, по умолчанию осцилятор работает всегда от внешнегго питания, и от батарейного питания, но вы можете поменять бит 7 регистра 0Eh и при батарейном питании отключить осцилятор.

 

Как резюме, если подали питание то на выводе 1 чипа (в корпусе с 16ю ногами) будет 32kHz, но что там ваша библиотека делает по умолчанию я не знаю.

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Andrey12, спасибо. А как можно без библиотек общаться с контроллером и, особенно, с памятью?  Она же не просто так стоит, наверное?
Хотелось бы именно без библиотек.

П.С. Я, пока - тормоз, на старости лет вспоминать... Да и мозг уже не так гибок. Комплексы, однако...

nik182
Offline
Зарегистрирован: 04.05.2015

И, если мне память не изменяет, там открытый коллектор. Без внешнего резистора сигнал не получить.
Без библиотек - писать и читать байты из памяти мс по i2c. В мануале расписано где что.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

ArturKu пишет:

Andrey12, спасибо. А как можно без библиотек общаться с контроллером и, особенно, с памятью?  Она же не просто так стоит, наверное?
Хотелось бы именно без библиотек.

П.С. Я, пока - тормоз, на старости лет вспоминать... Да и мозг уже не так гибок. Комплексы, однако...

Память никакого отношения к часам не имеет, можно вообще выпаять. DS3231 самодостаточная микросхема.
А как работать nik182 написал, но только не просто все это, работа с каждым I2C устройством у меня как с чистого листа начинается. 
Просто смотря что вам от модуля надо, я например не использую будильники, прерываение, 32кГц. Только установка и получение даты/времени. Мне хватает, но все через библиотеку, зачем усложнять код программы?

nik182 пишет:
И, если мне память не изменяет, там открытый коллектор. Без внешнего резистора сигнал не получить. Без библиотек - писать и читать байты из памяти мс по i2c. В мануале расписано где что.

Не измеряет память и про это написано в даташите. Но на модуле они обычно уже стоят. Хотя чтоб быть на 146% уверенным надо видеть модуль.

PIN NAME FUNCTION
1 32kHz 32kHz Output. This open-drain pin requires an external pullup resistor. When enabled, the output operates on
either power supply. It may be left open if not used.
Green
Offline
Зарегистрирован: 01.10.2015

Любителям точности: https://www.rlocman.ru/news/new.html?di=632969