Problema con interrupción para contar pulsos

Hola Arduineros.
Estoy haciendo un dispensador para un producto y el seleccionador de monedas manda pulsos para identificar las monedas.
1 pulsos = 100 COP
2 pulsos = 200 COP
5 pulsos = 500 COP
La onda es cuadrada y está normalmente en alto, así que usé una interrupción para detectar flanco de bajada.
El problema viene cuando inserto las monedas suficientes para completar el coste del producto que es 1000 COP, me entrega el producto y a pesar de que reseteo las variables de conteo de monedas queda en la pantalla de bienvenida aunque le inserte más monedas, o sea solo hace el ciclo una vez a pesar de que reseteo las variables.

#include <Wire.h> //ARCHIVO DE INCLUSIÓN PARA EL DISPLAY 16x2 I2C
 #include <LCD.h> //ARCHIVO DE INCLUSIÓN PARA EL DISPLAY 16x2 I2C
 #include <LiquidCrystal_I2C.h> //ARCHIVO DE INCLUSIÓN PARA EL DISPLAY 16x2 I2C
 #define I2C_ADDR    0x3F //DEFINO LA DIRECCIÓN I2C DEL DISPLAY
 #define motor 7  //DEFINO EL PUERTO 7 COMO MOTOR PARA ENTREGAR EL PRODUCTO
 #define SIR 6   //DEFINO EL PUERTO DEL SENSOR IR PARA DETENER EL MOTOR
 volatile long pulseTime = 0;  // VARIABLE DE TIEMPO QUE CONTARÁ CUANDO NO HAYAN MÁS PULSOS
 volatile int pulse = 0;  //VARIABLE QUE CONTARÁ LOS PULSOS
 int coste = 1000;  //COSTE DEL PRODUCTO
 int ssir = 0;  //ESTADO DEL SENSOR
 int coin = 0;  //ULTIMA MONEDA INSERTADA
 int count = 0;  //LLEVARÁ LA CUENTA DE LAS MONEDAS INSERTADAS
 LiquidCrystal_I2C             lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);
void setup(){
  Serial.begin(9600);
  lcd.begin (16,2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  pinMode(SIR,INPUT);
  pinMode(motor,OUTPUT);
  attachInterrupt(0, funcionInterrupcion, FALLING); //INTERRUPCION CON FLANCO DE BAJADA
}
void loop() {
  ssir = digitalRead(SIR);
  digitalWrite(motor,LOW);
  if(pulse > 0 && millis()- pulseTime > 200){ 
      switch(pulse){
        case 1:
          coin = 100;
          pulse = 0;
          pulseTime=0;
        break;
        case 2:
          coin = 200;
          pulse = 0;
          pulseTime=0;
        break;
        case 5:
          coin = 500;
          pulse = 0;
          pulseTime=0;
        break;
      }
      count = count+coin;
  }
  /*--------------------------*/
  if(count==0 && coin==0){
  lcd.setCursor ( 0, 0 );
  lcd.print(">>Bienvenido<<");
  lcd.setCursor ( 0, 1 );
  lcd.print(" Inserte moneda");
  }
  if(count>0 && coin >0){
    lcd.setCursor ( 0, 0 );
    lcd.print("Insertaste: $");
    lcd.setCursor ( 13, 0 );
    lcd.print(coin);//COUNT o COIN
    lcd.setCursor ( 0, 1 );
    lcd.print("Te faltan: $");
    lcd.setCursor ( 12, 1 );
    lcd.print(coste-count);
  }
  if(count>=1000 && coin >0){
      lcd.setCursor ( 0, 0 );
      lcd.print("Esta saliendo su");
      lcd.setCursor ( 2, 1 );
      lcd.print("producto");
      while(ssir == 1){
      digitalWrite(motor,HIGH);
      ssir = digitalRead(SIR);
    }                         
    coin = 0;
    count = 0;                             
  }
  /*--------------------------*/
}
void funcionInterrupcion() {
    pulse++;
    pulseTime = millis();
  }

Aquí el código sin comentarios

 #include <Wire.h>
 #include <LCD.h>
 #include <LiquidCrystal_I2C.h>
 #define I2C_ADDR    0x3F
 #define motor 7
 #define SIR 6
 volatile long pulseTime = 0;
 volatile int pulse = 0;
 int coste = 1000;
 int ssir = 0;
 int coin = 0;
 int count = 0;
 LiquidCrystal_I2C             lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);
void setup(){
  Serial.begin(9600);
  lcd.begin (16,2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  pinMode(SIR,INPUT);
  pinMode(motor,OUTPUT);
  attachInterrupt(0, funcionInterrupcion, FALLING);
}
void loop() {
  ssir = digitalRead(SIR);
  digitalWrite(motor,LOW);
  if(pulse > 0 && millis()- pulseTime > 200){ 
      switch(pulse){
        case 1:
          coin = 100;
          pulse = 0;
          pulseTime=0;
        break;
        case 2:
          coin = 200;
          pulse = 0;
          pulseTime=0;
        break;
        case 5:
          coin = 500;
          pulse = 0;
          pulseTime=0;
        break;
      }
      count = count+coin;
  }
  /*--------------------------*/
  if(count==0 && coin==0){
  lcd.setCursor ( 0, 0 );
  lcd.print("Bienvenido");
  lcd.setCursor ( 0, 1 );
  lcd.print(" Inserte moneda");
  }
  if(count>0 && coin >0){
    lcd.setCursor ( 0, 0 );
    lcd.print("Insertaste: $");
    lcd.setCursor ( 13, 0 );
    lcd.print(coin);//COUNT o COIN
    lcd.setCursor ( 0, 1 );
    lcd.print("Te faltan: $");
    lcd.setCursor ( 12, 1 );
    lcd.print(coste-count);
  }
  if(count>=1000 && coin >0){
      lcd.setCursor ( 0, 0 );
      lcd.print("Esta saliendo su");
      lcd.setCursor ( 2, 1 );
      lcd.print("producto");
      while(ssir == 1){
      digitalWrite(motor,HIGH);
      ssir = digitalRead(SIR);
    }                         
    coin = 0;
    count = 0;                             
  }
  /*--------------------------*/
}
void funcionInterrupcion() {
    pulse++;
    pulseTime = millis();
  }

Les agradecería muchísimo su ayuda

Hola.

Aparentemente el código está correcto y deberia funcionar como esperas.

Hay, no obstante, un punto que plantea dudas porque el compilador puede confundirse en expresiones multiples, cuando no se usan los parentesis.

Te aconsejo hagas esta pequeña modificación por si fuera este el caso:

if((pulse > 0) && ((millis()- pulseTime) > 200))   // <<== Los parentesis

Saludos

Yo agregaría que sobran los “&& coin” en las comparaciones, pues con evaluar count valdría. Y por otro lado, encadenaría el segundo y tercer if con else:

if (count==0) //bienvenida
else (if count < 1000)/introduciendo monedas
else //crédito alcanzado

Pero tampoco alcanzo a ver el porqué del fallo que dices.