Странное поведение DS3231

Значит нужно включить осциллятор другим способом, если в этой библиотеке такого нет. В любом случае, у Вас остановился осциллятор и его надо включить.

как? я малость разбираюсь, но моих мыслей не хватило. почитал, что народ пишет, кроме как убрать с платы резистор зарядки, больше ни чего …

но осцилятор же работает? часы то идут.

вставка запуска осцилятора, но скетч матерится на clock.begin();

А в код если посмотреть рекомендуемой @v258 ?

void DS3231::enableOscillator(bool TF, bool battery, byte frequency) {
	// turns oscillator on or off. True is on, false is off.
	// if battery is true, turns on even for battery-only operation,
	// otherwise turns off if Vcc is off.
	// frequency must be 0, 1, 2, or 3.
	// 0 = 1 Hz
	// 1 = 1.024 kHz
	// 2 = 4.096 kHz
	// 3 = 8.192 kHz (Default if frequency byte is out of range)
	if (frequency > 3) frequency = 3;
	// read control byte in, but zero out current state of RS2 and RS1.
	byte temp_buffer = readControlByte(0) & 0b11100111;
	if (battery) {
		// turn on BBSQW flag
		temp_buffer = temp_buffer | 0b01000000;
	} else {
		// turn off BBSQW flag
		temp_buffer = temp_buffer & 0b10111111;
	}
	if (TF) {
		// set ~EOSC to 0 and INTCN to zero.
		temp_buffer = temp_buffer & 0b01111011;
	} else {
		// set ~EOSC to 1, leave INTCN as is.
		temp_buffer = temp_buffer | 0b10000000;
	}
	// shift frequency into bits 3 and 4 and set.
	frequency = frequency << 3;
	temp_buffer = temp_buffer | frequency;
	// And write the control bits
	writeControlByte(temp_buffer, 0);
}

Ну и сопутствующие функции:

byte DS3231::readControlByte(bool which) {
	// Read selected control byte
	// first byte (0) is 0x0e, second (1) is 0x0f
	_Wire.beginTransmission(CLOCK_ADDRESS);
	if (which) {
		// second control byte
		_Wire.write(0x0f);
	} else {
		// first control byte
		_Wire.write(0x0e);
	}
	_Wire.endTransmission();
	_Wire.requestFrom(CLOCK_ADDRESS, 1);
	return _Wire.read();
}
void DS3231::writeControlByte(byte control, bool which) {
	// Write the selected control byte.
	// which=false -> 0x0e, true->0x0f.
	_Wire.beginTransmission(CLOCK_ADDRESS);
	if (which) {
		_Wire.write(0x0f);
	} else {
		_Wire.write(0x0e);
	}
	_Wire.write(control);
	_Wire.endTransmission();
}

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

в начале скетча есть ссылка на библиотеку

Схема простейшая ардуино нано, лсд2004, DS3231, все по шине.

Через управляющие регистры. Нужно прописать 0 в бит EOSC в регистр 0x0E. Все подробности в даташите.

Если питание микросхемы DS3231 идёт от пина Vcc, то осциллятор работает всегда. А вот при питании от батареи, осциллятор работает только когда бит EOSC прописан нулём.

Общая логика там такая. При первом прямо с завода включении в этом бите 0. Далее, если в процессе работы микросхема теряет питание, там прописывается 1. И эта единица служит сигналом для юзера, что питание терялось, и, значит, нужно переустановить время (иначе юзер бы и не нал, что там время левое).

Таким образом, при включении устройства у Вас должна быть такая логика:

  1. Проверить состояние бита EOSC.
  2. Если там 0 - не париться
  3. Если же там 1, то подёргать человека, чтобы он установил правильное время и сбросить этот бит в 0.

Это надо проделывать каждый раз при включении питания. Если Ваша библиотека не позволяет делать такие операции, значит она просто не подходит для этих часов. В этом случае надо либо взять другую, либо дописать эту, но без этих операций с таким часами работать никак.

Не так давно, я для кого здесь дописывал эту операцию в его библиотеку. Поищите.

P.S.
Посмотрел библиотеку. Там есть возможность сбросить этот бит в ноль не глядя. Это можно сделать при помощи метода DS3231::setBattery. А вот проверить что там и, соответственно, инициировать установку времени там возможности нет. Но если Вы в файле DS3231.h перенесёте строки №№163-164 повыше (выше строки №141), то тогда сможете читать и писать управляющий регистр и сможете всё сделать.

4 лайка

Мда, библиотека - просто образец документированности ))

Зы: с телефона разбираться сложно, если только завтра

хорошо, подожду.

А чего ждать? Я посмотрел библиотеку и написал (в сообщении №29) что Вам делать вплоть до номеров строк. Делайте.

Готового решения с кодом, наверное

чисто вставить “DS3231::setBattery” не получается, скетч матерится, мож что то еще надо дописать?

я час назад написал, что малость разбираюсь, я только начинаю, хотя в году так 1986 написал программку скачки для РАДИО 86РК. на бейсике, псевдографикой. но это было очень давно.

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

Значит неправильно “чисто вставляете”.

Вы уже не первый раз используете выражение:

Вы сами-то как думаете, оно информативно? Вам можно как-то с этим помочь?

Если Вам нужно чисто потрындеть, то не вопрос, а вот если Вам нужна помощь и совет как поправить, то будьте любезны чётко объяснять какой именно скетч и как именно матерится. Т.е. вставьте полный скетч (только правильно, а не как Вы это сделали выше) и вставьте полное сообщение компилятора. Тогда Вам смогут подсказать как исправить ситуацию.

Да, я вот думаю пересмотреть своё решение не участвовать в работе раздела “Ищу исполнителя”. Познакомился с ребятами из вот этой конторы, вроде не жулики. В принципе, могу попробовать начать брать какие-то заказы с оплатой на их формы. Почему бы не начать с задачи инициализации часов? А там видно будет.

@Vlad_b это Вас касается, хотите получить не советы, а готовое решение - можно перейти на коммерческую основу.

Кинут. Проверить факт оплаты Вы же не сможете…

1 лайк

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

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

Кстати, ни разу не шутка

Я действительно считаю переодетого соседа настоящим Дедом Морозом. Т.е. я знаю, что это переодетый сосед, может я сам помогал ему прицепить бороду, но считаю его настоящим. Это действительно так, без шуток и стёба. Понимайте как хотите.