Сигнал секунды на DS3231

AntonM
Offline
Зарегистрирован: 22.10.2015

Всем Привет!

Сейчас работаю с DS3231, прошу совета бывалых.

С помощью прерывания и данного RTC я создаю регистр ЧЧ:ММ:СС,ссс, тоесть добавляю миллисекунды.

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

 

Заранее спасибо за ответы!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вопрос не до конца понятен. Я понял его так: Вам нужно иметь какое-то прерывание или ещё что, короче чтобы какая-то Ваша функция вызывалась при переходе секунды. Правильно? Если неправильно, то дальнейшее можно не читать

С DS3231 это не проблема.

У неё можно настроить подачу сигнала на ногу SQW либо каждую минуту (при переходе минуты) либо каждую секунду (опять же при переходе секунды).  Как это настраивается написано в разделе Alarms даташите - там есть таблица "Alarm Mask Bits" и там есть комбинации битов для "Alarm once per second" и "Alarm once per minute (00 seconds of every minute)".

Всё необходимое для настройка (запись в регистры) есть в библиотеках для этой RTC.

На практике на пине SQW постонно держется высокий уровень, а при переходе на новую минуту/секунду уровень становится низким. Точно не помню, кажется его надо вручную обратно восстановить (если надо я найду свои старые коды, там всё есть).

Т.е. я просто заводил SQW на одну из ног Ардуино, понимающих внешние прерывания и настраивал прерывание по falling - и всё срабатывало, моё прерывание дёргалось как раз при переходе минуты (мне нужно было именно минуты, но можно и секунды).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

AntonM
Offline
Зарегистрирован: 22.10.2015

Ну сейчас времени поболее, напишу пожалуй подробнее =)

 

Делаю систему хронометража, и необходимо иметь четкое значение времени вплоть до миллисекунд. По началу решил сделать на базе таймерного прерывания, используя библиотеку TimerOne. Но к сожалению. у нескольких модулей он работал по-разному, и таймеры ушли на 4 секунды за 2 часа.

Поэтому были приобретены DS3231, чтобы получить правильные часы. Но вот незадача - у них есть только секундный регистр.

Идея такова - с помощью TimerOne делаем миллисекунду, а по сигналу смены секунды от DS3231 обнуляем значение таймера (с 0). Отсюда получаем требуемую точность =)

 

Если не трудно, пожалуйста поищите. Просто уже идеи кончились...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM, можно обнулять саму функцию  миллис, если оно не занята другими делами. У меня даже пример почти подходящий был, вот под вашу задачу подкорректировал:

#include "Wire.h"
#include "wiring.c"
void setup() {
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x0E); // Control Register
Wire.write(B01000000); // 1 Hz Out
Wire.endTransmission();
Serial.begin(9600);
attachInterrupt(0, herz, FALLING);
}

void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x68,3);
if(Wire.available()) {
  byte secund = Wire.read(); //00h
  byte minut = Wire.read();  //01h
  byte chasov = Wire.read();  //02h
    Serial.print((chasov & B00110000)>>4);
  Serial.print(chasov & B00001111);
  Serial.write(':');
  Serial.print((minut & B11110000)>>4);
  Serial.print(minut & B00001111);
  Serial.write(':');
  Serial.print((secund & B11110000)>>4);
  Serial.print(secund & B00001111);
  Serial.print("  ");
  }
Serial.println (millis() );
}



void herz() {timer0_millis=0; }


 

AntonM
Offline
Зарегистрирован: 22.10.2015

Для датчиков то подойдет, а вот на светофоре как раз через millis сделано.... Но всё равно спасибо! Подожду вариант с пином SQW

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM, не понял, чего вы подождёте?? :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM, не понял, чего вы подождёте?? :)

На всякий случай -мой вариант именно с дёрганьем ногой SQW. От неё на прерывание ( 2 пин)  ардуины.

AntonM
Offline
Зарегистрирован: 22.10.2015

dimax пишет:

AntonM, не понял, чего вы подождёте?? :)

На всякий случай -мой вариант именно с дёрганьем ногой SQW. От неё на прерывание ( 2 пин)  ардуины.

Решение интересное. Но немного не понятное. Вы импортируете и выдергиваете значение времени из регистра, так? Но где у вас настройка выхода SQW?

И получается будет 2 прерывание у меня....

P.S.: просто не люблю тупо скопировать и вставить, хочу разобраться

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM, настройка выхода в часах -6 и 7 строка.

AntonM
Offline
Зарегистрирован: 22.10.2015

Спасибо!

Только вот интересная штука - ничего не настраивал, только подключил ds3231 - а там уже сидит 1 гц... Интересно...

AntonM
Offline
Зарегистрирован: 22.10.2015
--\\--
AntonM
Offline
Зарегистрирован: 22.10.2015

Отбой, перебился провод с SQW до 3его пина =) Спасибо большое за код!