Ciao, sto cercando di districarmi con un RTC della Maxim, si tratta del modello DS3231.
In sostanza riesco a leggerlo e scriverlo senza problemi, ma siccome la sua precisione è di 1 secondo, mentre a me serve di 1mS, sto pianificando di usare un contatore esterno da collegare al suo output da 32.768 Hz, e da resettare una volta al secondo tramitela sua uscita INT, settata opportunamente a un interrupt al secondo.
Per il momento, fintanto che il contatore è in viaggio, sto sperimentando con arduino per fare delle prove.
Ho messo due interrupt, uno gestisce l’ingresso a 32Khz e l’altro quello a 1Hz.
Funziona tutto, ma i timing non mi tornano; ho fatto cosi:
#include <Wire.h>
#include <DS3231.h>
#define MAX 30
DS3231 Clock;
unsigned long counter, valori[MAX];
byte i;
void setup()
{
Serial.begin(115200);
Clock.enable32kHz(true);
// Turn on oscillator pin, frequency j
Clock.enableOscillator(true, false, 0);
attachInterrupt(digitalPinToInterrupt(2), stampa, RISING);
attachInterrupt(digitalPinToInterrupt(3), increment, RISING);
}
void loop()
{
if(i == MAX - 1)
{
detachInterrupt(digitalPinToInterrupt(3));
detachInterrupt(digitalPinToInterrupt(2));
for (i = 1; i < MAX - 1; i++)
{
Serial.println(valori[i] - valori[i - 1]);
}
}
}
void stampa()
{
valori[i] = counter;
i++;
}
void increment()
{
counter++;
}
Io credo (e spero) che i risultati non tornino perchè ci sono delle operazioni di mezzo, come la copia dei registri del LONG e l’incremento del BYTE che fa da indice.
I valori mi vengono tutti da 32.648Hz, cioè 120 parti in meno rispetto ai famosi 32.768Hz.
In realtà non vengono nemmeno sempre uguali, ma a volte viene 32.649.
secondo voi dove stà il problema ?