Подойдёт. Я делал так: брал резистор, один конец подпаял к 3 ножке микросхемы, аккуратно укладывал до контакта NC модуля мини, окусил. К нему же один конец ( ранее обрезанный) резистора, а второй к + модуля часов. Всё, теперь подтяжка есть, контакта NC получился SQW, его ведем к D2 ардуино@psyx86, аааа, вон как и получается в разрыв провода резистор к 5 вольтам например со входа?
Нашел только 5.6 кОм, пойдет же?
Последние версии у меня так же писал. А скетч как я понял нужен для работы с программой для корректировки. Проверьте все папки на гитхабе, я там брал. Либо в личку ящик напишите, вечером как буду за компом вышлю
Попробуйте отключить фичу Status Control . Заходите в настройки программы: Tools->Port Settings и снимаете галочку с чекбокса [] Status Controlпопробовал версию 1.1.5 - соединяется, но делать ничего не дает, сразу дисконнект и время ожидания истекло, инфо о модуле тоже не дает
// while ( millis() - tickCounter > 998 );
t.milliSecs = (millis() - tickCounter) % 1000;
// Выставить регистр коррекции!!!
#define R_CORR 0
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0x10);
Wire.write(R_CORR);
Wire.endTransmission();
не нужно приписывать мне свои мысли. Я это не утверждал.@SergejEU, мне кажется, что Вы не понимаете принцип работы программы. Никакие "осцилляторы" мы таким образом не синхронизируем...
вот это да! Вы понимаете, что пишите? В первом случае мы получаем сигнал по прерыванию (т.е. автоматически), а во втором - по запросу (т.е. зависит от времени, когда был послан по I2C запрос) и время считывается с регистров с точностью до секунды. В первом случае еще есть возможность дергать millis и получить нужные доли секунды, а во втором точность до +- секунды, вовсе не пригодна для расчетов.Исходя из вышеописанного, с точки зрения точности расчёта ухода RTC нет никакой разницы в том, каким образом получать текущее время и сравнивать с эталонным, на относительно длительных отрезках времени: с помощью прерывания от SQW или прямым получением времени по I2C интерфейсу.
Покажите каким образомВывод: автокоррекция может осуществляться и без привлечения прерывания.
Я это не утверждал.
(выделено мной)Мы имеем два осциллятора. Один в ардуино, другой в модуле DS3231. Как иначе заставить их синхронно работать?
Вы невнимательно прочитали введение к моим выводам. Нам не нужны доли секунды на длительных промежутках времени. И в программе, насколько я помню, нет ориентации на millis, иначе точность измерений будет зависеть от точности хода часов в Ардуино, а они, увы, значительно менее точные, чем в DS3231. Программа просто подсчитывает количество секундных (или полусекундных) импульсов в заданное компьютером время и получает "разбег", который компенсирует простым расчётным способом. Это раз.В первом случае мы получаем сигнал по прерыванию (т.е. автоматически), а во втором - по запросу (т.е. зависит от времени, когда был послан по I2C запрос) и время считывается с регистров с точностью до секунды. В первом случае еще есть возможность дергать millis и получить нужные доли секунды, а во втором точность до +- секунды, вовсе не пригодна для расчетов.
посмотрите как следует сам код программы. Он находится в открытом доступе, тогда все ваши предположения отпадут сами собой.(выделено мной)
Вы невнимательно прочитали введение к моим выводам. Нам не нужны доли секунды на длительных промежутках времени. И в программе, насколько я помню, нет ориентации на millis, иначе точность измерений будет зависеть от точности хода часов в Ардуино, а они, увы, значительно менее точные, чем в DS3231. Программа просто подсчитывает количество секундных (или полусекундных) импульсов в заданное компьютером время и получает "разбег", который компенсирует простым расчётным способом. Это раз.
Но даже если бы они и были нужны, то их легко получить и без прерывания. С учётом скорости передачи данных по I2C (400кГц) и количества передаваемых в запросе бит (установка указателя на нужный регистр + чтение регистра) 20+20=40, длительность запроса равна 100мкс. Пусть ещё столько же оставим на работу самого процессора Ардуино, это я от широты души, так сказать, чтоб не было обвинений в предвзятости, (итого = 200мкс). Т.е., за одну миллисекунду мы можем как минимум 5 раз опросить DS3231 и получить точность = половине этого периода, т.е. 100мкс. В 10 раз точнее millis, не находите? Это два.
Ну, я не стал надеяться на свою память и потратил-таки время, чтобы освежить, что же там всё-таки написано в "программе"... Нет там никакой совместной работы "двух осцилляторов". Эталонное время в UNIX-формате получается через serial из компьютера, записывается в структуру ref (замечу, в описании проекта напрямую указано, что необходимая точность зависит от правильности настройки NTP, и здесь - моё второе несогласие, на этот раз с точностью работы этого протокола, так получилось, что много лет работал с глобальными компьютерными сетями и знаю множество измерительных систем, основанных на NTP; про "вытесняющую мультизадачность операционных систем" вообще умолчу, дабы не расстраивать). Время из RTC с точностью до секунд записывается в t.utc, а фракция миллисекунд (внимание!) измеряются с помощью millis в прерывании! Можно, конечно, millis связать с "осциллятором Ардуино", но я бы не стал (по сравнению с длительностью эталонного интервала - это вообще "копейки"). Фактически, можно убрать прерывание и поставить в цикл while опрос RTC до смены секунды, сохранив значение millis во временной переменной (например, mSec). t.milliSecs тогда будет рассчитываться как millis()-mSec. Всё!посмотрите как следует сам код программы. Он находится в открытом доступе, тогда все ваши предположения отпадут сами собой.
Мое утверждение, подразумевает совместную работу двух осцилляторов - RTC и ардуино над формированием миллисекунд с точностью +-1мс, более ничего. Надеюсь это ясно.
volatile uint16_t _millis = 0;
volatile boolean state = 0;
uint16_t msInSec = 0;
#define INT_START state = 0; EIMSK = 0b00000001 //вызывается один раз для начала замера
#define MLS_START state = 1; _millis = 0; TCNT0 = 0; TIMSK0 = 0b00000001 //начать замер мс
#define ALL_STOP TIMSK0 = 0b00000000; EIMSK = 0b00000000 //завершить замер мс
int main(void)
{
TCCR0A = 0b00000000; //отключаем OC0A/OC0B
TCCR0B = 0b00000011; //пределитель 64
TIMSK0 = 0b00000000; //отключаем прерывания Таймера0
EICRA = 0b00000010; //настраиваем внешнее прерывание по спаду импульса на INT0
for (;;) {
//INT_START; //первый запуск замера мс(вызывается один раз для начала замера)
if (!EIMSK) msInSec = _millis; //если замер завершён, можно забрать результат в мс
}
return 0;
}
ISR(INT0_vect, ISR_NOBLOCK) //внешнее прерывание на пине INT0
{
switch (state) {
case 0: MLS_START; break;
case 1: ALL_STOP; break;
}
}
ISR(TIMER0_OVF_vect) //счет мс
{
_millis++;
}
msInSec = (float)_millis * 1.024;
А что пишет программа калибровки?