Значит нужно включить осциллятор другим способом, если в этой библиотеке такого нет. В любом случае, у Вас остановился осциллятор и его надо включить.
как? я малость разбираюсь, но моих мыслей не хватило. почитал, что народ пишет, кроме как убрать с платы резистор зарядки, больше ни чего …
но осцилятор же работает? часы то идут.
вставка запуска осцилятора, но скетч матерится на 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. И эта единица служит сигналом для юзера, что питание терялось, и, значит, нужно переустановить время (иначе юзер бы и не нал, что там время левое).
Таким образом, при включении устройства у Вас должна быть такая логика:
- Проверить состояние бита
EOSC
. - Если там 0 - не париться
- Если же там 1, то подёргать человека, чтобы он установил правильное время и сбросить этот бит в 0.
Это надо проделывать каждый раз при включении питания. Если Ваша библиотека не позволяет делать такие операции, значит она просто не подходит для этих часов. В этом случае надо либо взять другую, либо дописать эту, но без этих операций с таким часами работать никак.
Не так давно, я для кого здесь дописывал эту операцию в его библиотеку. Поищите.
P.S.
Посмотрел библиотеку. Там есть возможность сбросить этот бит в ноль не глядя. Это можно сделать при помощи метода DS3231::setBattery
. А вот проверить что там и, соответственно, инициировать установку времени там возможности нет. Но если Вы в файле DS3231.h перенесёте строки №№163-164 повыше (выше строки №141), то тогда сможете читать и писать управляющий регистр и сможете всё сделать.
Мда, библиотека - просто образец документированности ))
Зы: с телефона разбираться сложно, если только завтра
хорошо, подожду.
А чего ждать? Я посмотрел библиотеку и написал (в сообщении №29) что Вам делать вплоть до номеров строк. Делайте.
Готового решения с кодом, наверное
чисто вставить “DS3231::setBattery” не получается, скетч матерится, мож что то еще надо дописать?
я час назад написал, что малость разбираюсь, я только начинаю, хотя в году так 1986 написал программку скачки для РАДИО 86РК. на бейсике, псевдографикой. но это было очень давно.
А чего бы ему не материться, если там нужно два параметра указать. Вы, если немного в разбираетесь, так загляните в исходники библиотеки и посмотрите, чего там требуется
Значит неправильно “чисто вставляете”.
Вы уже не первый раз используете выражение:
Вы сами-то как думаете, оно информативно? Вам можно как-то с этим помочь?
Если Вам нужно чисто потрындеть, то не вопрос, а вот если Вам нужна помощь и совет как поправить, то будьте любезны чётко объяснять какой именно скетч и как именно матерится. Т.е. вставьте полный скетч (только правильно, а не как Вы это сделали выше) и вставьте полное сообщение компилятора. Тогда Вам смогут подсказать как исправить ситуацию.
Да, я вот думаю пересмотреть своё решение не участвовать в работе раздела “Ищу исполнителя”. Познакомился с ребятами из вот этой конторы, вроде не жулики. В принципе, могу попробовать начать брать какие-то заказы с оплатой на их формы. Почему бы не начать с задачи инициализации часов? А там видно будет.
@Vlad_b это Вас касается, хотите получить не советы, а готовое решение - можно перейти на коммерческую основу.
Кинут. Проверить факт оплаты Вы же не сможете…
Ну, 100% не проверю, но попрошу переслать мне письмо от фонда (каждый жертвователь получает), если человек ни разу не жертвовал, он не знает как оно выглядит и не сможет прислать.
Ну, и, Вы, возможно, посчитаете меня наивным, но я верю в совесть людей и не думаю, что человек станет так марать свою карму из-за десятка баксов. А если кто-то и станет, то это редкое исключение. Большинство людей не станут.
Кстати, ни разу не шутка
Я действительно считаю переодетого соседа настоящим Дедом Морозом. Т.е. я знаю, что это переодетый сосед, может я сам помогал ему прицепить бороду, но считаю его настоящим. Это действительно так, без шуток и стёба. Понимайте как хотите.