Help Help Pulse Counting

:slight_smile:
Good morning
i am trying to understand why i am not able to count all pulses in the input pin with arduino.
this is my program but it loose many pulses. Which is the max frequency possible with arduino without prescaler ?
/*
*
*

  • Digital Pin layout ARDUINO
  • =============================
  • 2 IRQ 0 - alla turbina
  • versione 2.0 con aggiunti l'input degli impulsi
    */
    long rpk = 0; // raw pulse KWH counter (private)
    int numimpulsi = 0; // impulsi da fare dall'input 20618 hex 508a 20 gradi avg
    int valor=0; // stato del pin di blocco valvola
    int kflag = 0; // flag routine interrupt
    int flagin = 1; // salto abilita routine di input
    int incomingByte; // byte letto dalla routine di input
    char Data[8]; // array per la routine di input
    int i;
    unsigned long Tempo;

// The interrupt routine
void Kirq()
{
rpk++; // just increment raw pulse counter.
if (rpk > numimpulsi) { // e' arrivato il fine conteggio?

// inserisci le azioni di fine conteggio
digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso e spengo la valvola

kflag = 1 ;
}
}

//
// SETUP
//
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT); //Imposto il PIN 13 in modalità OUTPUT
digitalWrite(13, HIGH); //Scrivo sul PIN 13 il valore Alto
pinMode(8, OUTPUT); //Imposto il PIN 8 in modalità OUTPUT per la valvola
digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso spengo la valvola gas

// KWH interrupt attached to IRQ 0 = pin2
attachInterrupt(0, Kirq, FALLING); // sul fronte di discesa

Serial.println("inserire numero impulsi per abilitare apertura gas ");

}

//
// MAIN LOOP
//
void loop()
{
// routine di input flagin e' abilitato se devo fare input
if (flagin==1) {

do {
if (Serial.available()) { // controllo se ci sono dati
Data = Serial.read(); // li leggo e li metto in array

  • i++; // incremento puntatore array*
  • } *
  • if(i<1)Tempo = millis(); // se i = 0 salvo l'ora*
  • } while (i<5&&(millis()-Tempo) < 500); // il do si esegue fino a che non ho*
  • // 5 caratteri e non e' passato mezzo*
  • // secondo *
    _ Data = 0; // metto a 0 il byte array successivo per chiudere il valore_
    * incomingByte = atoi(Data); // trasformo i dati da ascii a intero*
    * i=0; // azzero ocntatore per prossimo loop*
    * Serial.print("numero impulsi da fare ");*
    * numimpulsi=incomingByte; // ora ho gli impulsi da fare*
    * Serial.println(numimpulsi);*
    * flagin=0 ; // al prossimo loop non faccio input*
    * Serial.println("inizio conteggio "); *
    * digitalWrite(8, HIGH); //Scrivo sul PIN 8 il valore alto e apro il gas *
    * kflag=0; // azzero kflag per abilitare conteggio sull'interrupt*
    * rpk=0; // azzero il contatore dell'interrupt*
    * } // fine routine di input *

* if (numimpulsi>0&& numimpulsi<22000) // il valore inserito e' giusto allora conto altrimenti spengo*
* { valor = digitalRead(8); // leggo come sta ilpint della valvola*

* if (kflag==1) {//se keyflag =1 finito il conteggio;*
* Serial.print("numero impulsi fatti "); *
* Serial.println(rpk);*
* Serial.print(" stato del pin uscita ");*
* Serial.println(valor);*
* Serial.print(" kflag ");*
* Serial.println(kflag);*
* kflag=0; // azzero kflag per abilitare conteggio (inutile)*
* rpk=0; // azzero il contatore dell'interrupt (inutile)*
* flagin=1; // abilito la routine di input*
* }*
* }else {*
* Serial.print(" ERRORE DI RANGE ");// se non e' tra i valori definiti e' sbagliato*
* digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso e spengo la valvola*
* }*

}
//
// END OF PROGRAM
//

please modify your post, select the code and press the # button. Then it will look so much better! (more readable for your audience :wink:

Furthermore please use CTRL-T before posting code - that is auto format in the IDE which takes care of proper indenting, also improvingthe readability.

I see you do some KWH monitoring, maybe this is interesting to read...

and use the keyword volatile for vars that are used in the IRQ routines.