Frequenzimetro

Grazie, sto facendo le ulteriori prove, avevo dimenticato :~ che oggi sono di compleanno e mi sono preso mezza giornata libera, speriamo bene!

ricordati che col sistema del timer0 contatore perdi la millis! al massimo puoi usare la micros() (da verificare)

è il tuo compleanno? cento di questi arduini :slight_smile:

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:

stai toglieno -4 siqa dal tempo di partenza che quello di fine, uindi allas fine i - si compensano. insomma non devi tenerne conto :slight_smile:

vero :slight_smile: che pir..
del resto che ne dici?
ti piace la lettura rapida della porta al posto del digital read?
digital read era un elefante nell'interrupt :smiley:

BrainBooster:

if ( ((PINC>>PINC2) & 1) ) { Flag = true; } else { Flag = false; }

può essere scritto come:

Flag = ((PINC>>PINC2)&1) ? true : false; //operatore ternario

EDIT:
Ripensandoci... perché non elimini la sotto funzione e la variabile Flag?

void quicfunc() {
  char pincState = 0;
  pincState = PINC2;
  if ((PINC>>PINC2) & 1)
  {
    startTimeH=micros();
    stopTimeL=micros();
    ;
   }
   else
  {
    stopTimeH=micros();
    startTimeL=micros();
    ;
   }
}

...ottima osservazione

supporto PaoloP, che senso ha usare i registri se poi rallenti tutto con funzioni & if a muzzo :slight_smile:

ma la if resta comunque, scompare solo la variabile Flag, oppure ho capito male?

sì nella seconda correzzione, ma nella prima c'era un if nella funzione e uno per la variabile ritornata dalla funzione :wink:

e io a quella mi riferivo :slight_smile:
adesso mi applico un altro pò e vedo di riuscire a strippare il codice al minimo, purtroppo uno dei miei gatti mi ha distrutto l'oscillatorino che mi ero motato su bredboard e adesso sono senza generatore di segnali di prova...
devo costruirmene un altro (gli altri arduini sono tutti impegnati in altro) , credo di avere qualche cd40106 da qualche parte, dite che và bene mettere sù un oscillatore con un condensatore ed una resistenza?
è stabile?

BrainBooster:
...ottima osservazione

Dipende...

Ma siete veramente sicuri che le due forme una volta compilate siano diverse?

Premetto che preferisco la seconda forma perchè si legge meglio, non sono sicuro che ci siano vantaggi effettivi tra le due.

bisognerebbe disassemblare il codice generato e vedere cosa ne esce per capirlo

niki77:
Ma siete veramente sicuri che le due forme una volta compilate siano diverse?

nell'incertezza meglio abbondare (in questo caso di ottimizzazione)magari questa verione non ottimizza ma la prossima sì, chissà.. tanto vale ottimizzare a mano, così ci si fa anche l'occhio per scrivere il codice senza troppi rigiri

Come ho già detto preferisco la seconda forma, però sono anche a favore delle certezze rispetto alle stregonerie!!!

Non vi sono differenze tra i due modi compilati.

build_test.zip (1.04 KB)

quindi alla fine è uguale, cambia solo in leggibilità
P.S.
@Menniti con i due not liberi...

una porta per tasto :wink:

BrainBooster:
@Menniti con i due not liberi...

Non ne ha bisogno, il debounce lo gestisce totalmente da software.

@astrobeed non sapevo che avesse scelto la via sw.

BrainBooster:
@astrobeed non sapevo che avesse scelto la via sw.

Per questo tipo di utilizzo è inutile complicarsi la vita per gestire i pulsanti, il debounce software basta e avanza.

BrainBooster:
@astrobeed non sapevo che avesse scelto la via sw.

BB, sul numero in Edicola ho scritto un bel po' di roba sul debounce hardware, e la tecnica che indichi l'ho inserita nel progetto (stesso articolo) del Capacimetro Digitale fatto tutto in TTL: resistenza ne basta una, le porte sono due per avere in uscita la stessa condizione in entrata, con una sola porta lo status è invertito, ora non è questa la sede per approfondire la cosa.
Come ha detto Astro, e se leggi i miei interventi precedenti, ho spiegato che io faccio tutto via software visto che non ho alcun problema ad aspettare una o due letture per avere la frequenza esatta; poiché non capisco mai bene gli interventi di lesto quando parla di software (colpa mia ovviamente) mi era venuto un dubbio ma Astro ha confermato la mia idea e quindi discorso chiuso.