Ciao a tutti!
Avrei bisogno di realizzare un sensore di RPM e ho bisogo di sapere quanto tempo trascorre tra un interrupt ed un altro.
Il problema è che non riesco a pensare al codice per riuscirci. Ipotizzo che basti qualcosa di simile
void funzione_interrupt()
{
tempo=millis()-tempoPrec;
tempoPrec=millis();
}
Ma non sono sicuro che funzioni. Voi cosa fareste?
Da "non-programmatore", mi viene in mente di assegnare il valore di millis ad una variabile nella prima ISR, e poi controllare la differenza fra millis e la stessa variabile nella seconda ...
Sicuramente la funzioni millis() non viene incrementata all'interno di una ISR.
Il suo valore viene "congelato" all'attimo prima che scatena l'interrupt.
Nel tuo caso, la cosa potrebbe andare bene, ma ricorda di dichiarare "volatile" le variabili tempo e tempoPrec.
Quindi dovrei fare qualcosa di simile?
void setup()
{
attachInterrupt(0,funzione_interrupt, RISING);
}
void loop()
{
attachInterrupt(0,funzione_interrupt, RISING);
delay(100);
detachInterrupt(0);
}
void funzione_interrupt()
{
tempo=millis()-tempoPrec;
tempoPrec=millis();
}
Meglio usare la sintassi consigliata:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
Così?
void setup()
{
attachInterrupt(0,ISR, RISING);
}
void loop()
{
attachInterrupt(0,ISR, RISING);
delay(100);
detachInterrupt(0);
}
void ISR()
{
tempo=millis()-tempoPrec;
tempoPrec=millis();
}
attachInterrupt(digitalPinToInterrupt(2), , RISING); // per la UNO pin 2 o 3
Ma non è lo stesso di scrivere 0 o 1? Alla fine si riferisce a quei due pin
È più leggibile e portabile se cambi scheda.
Ok grazie. Lo proverò appena possibile