Я хочу использовать DS3231 RTC (ZS-042) для точного измерения времени на моем arduino uno.Мне нужно измерить миллисекунды, чтобы обычные функции времени различных RTC-библиотек не были достаточны.
После поиска и поиска я обнаружил, что мне нужно использовать выход 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
Что не так / отсутствует в моем коде?