[risolto] come utilizzare due interrupt

ciao
sto ultimando un progetto con arduino 1 r3, sto facendo dei test e da quello che vedo funziona solo un interrupt.
Uso due sensori fotoelettrici ir a 12v due fotoaccoppiatori per convertire il livello delle tensioni, sensori funzionano e i foto pure, però mi si accende e spegne solo un led, l’altro riamane sempre acceso sembra che funzioni solo un interrupt
vi sottopongo lo sketch per una verifica grazie per i suggerimenti

/*
per verificare il flusso di semi
04102013
 
 */
//#include <LiquidCrystal.h>  // include the library code
//LiquidCrystal lcd(9,8,7,6,5,4); // initialize the library with the numbers of the interface pins

int sensorPin=A0;    // select the input pin for the potentiometer
int sensorValue=0;  // variable to store the value coming from the sensor
int sensorValuesomma=0;  // variable to store the value coming from the sensor
int ritardo;

int statosensoreDX=HIGH;  //stato iniziale del sensore
int statosensoreSX=HIGH;  //stato iniziale del sensore

unsigned long tempoDX;
unsigned long tempoDX0;

unsigned long tempoSX;
unsigned long tempoSX0;

int deltatempoDX=0;
int deltatempoSX=0;

void setup() 
{
  // lcd.begin(16,4);  // set up the LCD's number of columns and rows:
tempoDX=0;
tempoDX0=0;

tempoSX=0;
tempoSX0=0;

  attachInterrupt(0,sensoreDX,FALLING); //sensore collegato al pin 2
  attachInterrupt(1,sensoreSX,FALLING); //sensore collegato al pin 3

  pinMode(2,INPUT);//sensore dx
   // digitalWrite(2,HIGH);
  pinMode(3,INPUT);//sensore sx 
    //digitalWrite(3,HIGH);
  
    pinMode(6,OUTPUT);//sensore dx
  digitalWrite(6,LOW);
    pinMode(5,OUTPUT);//sensore sx
  digitalWrite(5,LOW);

// Serial.begin(9600);
}

void loop()
{
   for(int i=0;i<=5;i++)
  {
    sensorValue=analogRead(sensorPin);
    sensorValuesomma+=sensorValue;
  }
    ritardo=20000.0/1024*sensorValuesomma/6;
    sensorValuesomma=0;
  
//Serial.println(ritardo);
  //------------------------sensore 1

  if (statosensoreDX==LOW)       
  {  
  digitalWrite(6,LOW);
  statosensoreDX=HIGH;
  }
  tempoDX0=millis();
  deltatempoDX=tempoDX0-tempoDX;
  
  if(deltatempoDX>ritardo);// stop the program for <sensorValue> milliseconds)
  {
    digitalWrite(6,HIGH); 
  }
  //------------------------sensore 2
  if (statosensoreSX==LOW)       
  {  
  digitalWrite(5,LOW);
  statosensoreSX=HIGH;
  }
  tempoSX0=millis();
  deltatempoSX=tempoSX0-tempoSX;
  
  if(deltatempoSX>ritardo)
  {
    digitalWrite(5,HIGH); 
  }
}

void sensoreDX() //pin 2 a cui attaccare il sensore IR 1
{
  statosensoreDX=LOW;
  tempoDX=millis();
}
void sensoreSX() //pin 3 a cui attaccare il sensore IR 2
{
  statosensoreSX=LOW;
  tempoSX=millis();
}

grazie
stefano

Inverti i collegamenti sui pin di interrupt. Se si inverte la cosa, il problema è in uno dei 2 dispositivi che azionano gli interrupt. Se invece il problema continua tale e quale potrebbe esserci un bug nel codice. Allora in questo caso eliminerei tutto tranne la gestione dei 2 led e farei un pò di test.

ciao ho invertito ma senza nessun risultato,senza inversione del risultato, ho anche cambiato scheda ma niente

stefano

ciao
questo è il nuovo codice ma ancora non funziona, ho verificato i segnali anche con l’oscilloscopio, ma è sono a posto, succede una cosa strana la parte di codice relativo al sensore DX se tolgo i SERIALPRINT il led non si accende se li lascio si accende ma senza entrare nell’IF, cioè si accende quando si attiva il sensore, la parte di codice che lavora correttamente è quella relativa al sensore di SX.

/*
per verificare il flusso di semi
09102013
 
 */
//#include <LiquidCrystal.h>  // include the library code
//LiquidCrystal lcd(9,8,7,6,5,4); // initialize the library with the numbers of the interface pins

int sensorPin=A0;    // select the input pin for the potentiometer
int sensorValue;  // variable to store the value coming from the sensor
int sensorValuesomma;  // variable to store the value coming from the sensor
int ritardo;

int statosensoreDX=LOW;  //stato iniziale del sensore
int statosensoreSX=LOW;  //stato iniziale del sensore

unsigned long tempoDX;
unsigned long tempoDX0;

unsigned long tempoSX;
unsigned long tempoSX0;

unsigned long deltatempoDX=0;
unsigned long deltatempoSX=0;

void setup() 
{
  // lcd.begin(16,4);  // set up the LCD's number of columns and rows:
//tempoDX=0;
tempoDX0=0;

//tempoSX=0;
tempoSX0=0;

deltatempoDX=0;
deltatempoSX=0;

sensorValue=0;  // variable to store the value coming from the sensor
sensorValuesomma=0;  // variable to store the value coming from the sensor

  attachInterrupt(0,sensoreDX,FALLING); //sensore SX collegato al pin 2
  attachInterrupt(1,sensoreSX,FALLING); //sensore DX collegato al pin 3

  //pinMode(2,INPUT);//sensore dx
   // digitalWrite(2,LOW);
 // pinMode(3,INPUT);//sensore sx 
  //  digitalWrite(3,LOW);
  
    pinMode(4,OUTPUT);//sensore dx
 //digitalWrite(4,LOW);
    pinMode(5,OUTPUT);//sensore sx
 // digitalWrite(5,HIGH);
 ritardo=2000;
 Serial.begin(9600);
}

void loop()
{
  /* for(int i=0;i<=5;i++)
  {
    sensorValue=analogRead(sensorPin);
    sensorValuesomma+=sensorValue;
  }
    ritardo=20000.0/1024*sensorValuesomma/6;
    sensorValuesomma=0;
 */ 
//Serial.println(ritardo);
  //------------------------sensore 1 DX
  if (statosensoreDX==HIGH)       
  {  
  digitalWrite(4,HIGH);
  statosensoreDX=LOW;
  }
  tempoDX=millis();
  deltatempoDX=tempoDX-tempoDX0;
  
/*   Serial.print("tempoDX "); 
Serial.println(tempoDX); 
    Serial.print("tempoDX0 "); 
Serial.println(tempoDX0); 
  Serial.print("deltatempoDX ");
 Serial.println(deltatempoDX);
*/  
  if(deltatempoDX>ritardo);
  {
    digitalWrite(4,LOW); 
  }
  //------------------------sensore 2 SX
  if (statosensoreSX==HIGH)       
  {  
  digitalWrite(5,HIGH);
  statosensoreSX=LOW;
  }
  tempoSX=millis();
  deltatempoSX=tempoSX-tempoSX0;
/*  
  Serial.print("tempoSX "); 
Serial.println(tempoSX);
    Serial.print("tempoSX0 "); 
Serial.println(tempoSX0);   
  Serial.print("deltatempoSX "); 
Serial.println(deltatempoSX); 
 */ 
  if(deltatempoSX>ritardo)
  {
    digitalWrite(5,LOW); 
  }  
}

void sensoreDX() //pin 2 a cui attaccare il sensore IR DX
{
  statosensoreDX=HIGH;
  tempoDX0=millis();
}
void sensoreSX() //pin 3 a cui attaccare il sensore IR SX
{
  statosensoreSX=HIGH;
  tempoSX0=millis();
}

Intanto prova a definire le variabili che usi nei 2 interrupt come "volatile". Poi prova mettendo l'evento LOW al posto di FALLING.

ciao ho fatto questo:

volatile int statosensoreDX=LOW;  //stato iniziale del sensore
volatile int statosensoreSX=LOW;  //stato iniziale del sensore

e questo:

 attachInterrupt(0,sensoreDX,LOW); //sensore DX collegato al pin 2
  attachInterrupt(1,sensoreSX,LOW); //sensore SX collegato al pin 3

nessun risultato, funziona solo la parte di codice per il sensore di SX pin 3, la parte di codice per il sensore di DX pin 2 non entra nell'IF

grazie stefano

Devi dichiarare volatile anche TempoDX0 e TempoSX0, comunque. A parte questo, se commenti l'attachInterrupt(0), l'altro ti fa?

ciao ho fatto questo:

volatile unsigned long tempoDX0;

e questo:

volatile unsigned long tempoDX0;

questa è la parte di codice incriminata:

  //------------------------sensore 1 DX
  if(statosensoreDX==HIGH)       
  {  
  digitalWrite(4,HIGH);
  statosensoreDX=LOW;

  }
  tempoDX=millis();
  deltatempoDX=tempoDX-tempoDX0;
  
   Serial.print("tempoDX "); 
Serial.println(tempoDX); 
    Serial.print("tempoDX0 "); 
Serial.println(tempoDX0); 
  Serial.print("deltatempoDX ");
 Serial.println(deltatempoDX);
  
  if(deltatempoDX > ritardo);
  {
    digitalWrite(4,LOW);
  }

e questo è l'output:

tempoDX 20153
tempoDX0 19354
deltatempoDX 799
tempoDX 20203
tempoDX0 19354
deltatempoDX 849
tempoDX 20254
tempoDX0 19354
deltatempoDX 900
tempoDX 20305
tempoDX0 19354
deltatempoDX 951
tempoDX 20357
tempoDX0 19354
deltatempoDX 1003
tempoDX 20408
tempoDX0 19354
deltatempoDX 1054
tempoDX 20460
tempoDX0 19354
deltatempoDX 1106
tempoDX 20512
tempoDX0 19354
deltatempoDX 1158

il ritardo vale 2000, ma sembra che il codice dentro il secondo IF venga eseguito anche se deltatempoDX è minore di 2000 infatti il led si accende in corrispondenza del primo IF per poi spegnersi

stefano

ciao ho risolto c'era un punto e virgola alla fine di questo IF

if(deltatempoDX > ritardo);

grazie e scusate

stefano

se il mod lo ritiene può cancellare la discussione

Si cancellano solo le discussioni OT o doppie. Tutto il resto è utile.