Я хочу использовать DS3231 RTC (ZS-042) для точного измерения времени на моем Arduino Uno. Мне нужно измерять миллисекунды, обычных функций времени различных RTC libs недостаточно.
После поиска в Google и расспросов я обнаружил, что мне нужно использовать вывод SQW DS3231 и подключить его к прерыванию или таймеру. При использовании соответствующей скорости я мог бы выполнять измерения времени.
Поэтому я попытался подключить SQW к контакту 5 на моем Arduino Uno (который является входом T1) и настроить T1 для использования внешнего источника. Я использовал некоторую библиотеку RTC, чтобы включить вывод SQW и установить его на 1024 Гц. Затем я подключил ISR для подсчета тиков и переполнений.
Все это, кажется, в основном работает, однако сигнал SQW, кажется, зависает на частоте 1 Гц, независимо от того, что я делаю.
Вот мой код:
#include <Wire.h> //I2C library
#include <RtcDS3231.h> //RTC library
RtcDS3231 <TwoWire> rtcObject(Wire);
static volatile unsigned long overflows = 0;
void setup() {
Serial.begin(9600);
rtcObject.Begin(); //Starts I2C
rtcObject.SetSquareWavePin(DS3231SquareWavePin_ModeClock); //Sets pin mode
rtcObject.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1kHz); //Sets frequency
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 32000;
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS11); // external source / no prescaler
TCCR1B |= (1 << CS12); // external source / no prescaler
// TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
}
ISR(TIMER1_OVF_vect)
{
TCNT1 = 0;
overflows++;
}
void loop() {
delay(1024);
Serial.println("loop");
Serial.println(TCNT1);
}
который напечатает что-то вроде:
loop
1
loop
2
loop
3
Что не так/отсутствует в моем коде?