#define senal_PPS 22
#define senal_digital 21
double tiempoI;
double duracion;
volatile bool senal_digital_activada = false;
void IRAM_ATTR medida() {
if (digitalRead(senal_digital) == LOW) {
tiempoI = millis(); //va calculando el tiempo
senal_digital_activada = true;
}
else if (digitalRead(senal_digital) == HIGH && senal_digital_activada) { //cuando se activa la señal digital
duracion = millis() - tiempoI; //calcula la diferencia en milisegundos y sale el tiempo que ha pasado desde que se enciende
senal_digital_activada = false;
}
}
void setup() {
Serial.begin(115200);
pinMode(senal_PPS, INPUT);
pinMode(senal_digital, INPUT);
attachInterrupt(digitalPinToInterrupt(senal_digital), medida, RISING);
}
void loop() {
if (!senal_digital_activada && duracion > 0) {
Serial.print("Segundos transcurridos: ");
Serial.println(duracion / 1000); // ms/1000 = s
Serial.print("Milisegundos transcurridos: ");
Serial.println(duracion); //ms
// Resetear la duración para evitar doble conteo
duracion = 0;
}
}
Se desea medir el tiempo exacto que transcurre desde que se enciende el microcontrolador hasta que se activa la señal digital GPIO21. Para esto, el microcontrolador está conectado, a través de la entrada GPIO22, a la señal PPS (Pulse per Second) de un dispositivo GPS que proporciona una señal cada segundo con una precisión inferior a 1ns. Lo que se pide es calcular el tiempo en segundos y milisegundos que ha transcurrido de la manera más exacta posible, teniendo en cuenta la señal PPS para medir los segundos, y empleando la función millis() para obtener los milisegundos que transcurrieron desde que se recibió la señal PPS y se activó GPIO21.
Enviar esta información por el puerto serie cada vez que se active la señal GPIO21.