Frequenzimetro

ho cambiato totalmente approccio al problema e ho riscritto tutto per funzionre con pcint e misurare il dutycycle

#include <PinChangeInt.h>
volatile unsigned long previousMillis = 0;  //variabile per controllo tempo di scan
long interval = 1000;  //intervallo invio letture
boolean Flag;
volatile unsigned long startTimeH;
volatile unsigned long stopTimeH;
volatile unsigned long tdurataHIGH;
volatile unsigned long startTimeL;
volatile unsigned long stopTimeL;
volatile unsigned long tdurataLOW;
volatile unsigned long periodo;
float frequenza;
float dutycycle;
void setup()
{ 
  PCintPort::attachInterrupt(A2, &quicfunc, CHANGE);
  Serial.begin(9600);
}

void loop()
{
  unsigned long currentMillis = millis(); //prendo il tempo
  if(currentMillis - previousMillis > interval) {  //se è trascorso l'intervallo impostato

    previousMillis = currentMillis;  //resetto il tempo



    Serial.println();

    Serial.print("Durata High (uS)=");
    if (stopTimeH > startTimeH){
      tdurataHIGH= stopTimeH - startTimeH;
    }
    else{
      tdurataHIGH= startTimeH - stopTimeH;
    }
    Serial.println(tdurataHIGH);
    Serial.print("Durata Low (uS)=");
    if (stopTimeL > startTimeL){
      tdurataLOW= stopTimeL - startTimeL;
    }
    else{
      tdurataLOW= startTimeL - stopTimeL;
    }
    Serial.println(tdurataLOW);

    Serial.print("Periodo1 (uS)= ");
    periodo= tdurataLOW + tdurataHIGH;

    Serial.println(periodo);
    Serial.print("Frequenza (Hz)= ");
    frequenza = (1.0/(periodo));

    Serial.println((frequenza*1000000),4);
    Serial.print("Duty Cycle (%)= ");
    dutycycle =( float(tdurataHIGH) / float( periodo ))*100.0;
    Serial.println(dutycycle,4);
    Serial.println();
  }
}


void quicfunc() {
  Leggi_Rapido_A2();
  if (Flag==1){
    startTimeH=micros()-4; //tolgo i 4 micros che si mangia la funzione
    stopTimeL=micros()-4;
    ;
  }
  else{
    stopTimeH=micros()-4;
    startTimeL=micros()-4;
    ;
  }
}

void Leggi_Rapido_A2()  //lettura ultrarapida dello stato del pin A2
{
  char pincState = 0;
  pincState = PINC2;
  if ( ((PINC>>PINC2) & 1) ) { Flag = true; } else { Flag = false; }
}

Provatelo se potete :wink: