Esempio interrupt

Ragazzi mi sto documentando un po sugli interrupt con la mia scheda Arduino DUE, solo non riesco a capire in cosa sbaglio. Qualcuno mi sa dire dove posso trovare un esempio banale con Arduino Due da cui poter prendere spunto e magari trovare un riscontro con la documentazione ufficiale?

Ho provato ad eseguire questo skecth:

float cycle = 0;
int inPin = 22;

void setup() {
  Serial.begin(9600);
  Serial.println("Booting...");
  Serial.print("Valore pin ");
  Serial.println(digitalRead(inPin));
  delay(1000);
  pinMode(inPin, OUTPUT);
  Serial.print("Valore pin ");
  Serial.println(digitalRead(inPin));
  attachInterrupt(inPin, sayHello, FALLING);
  delay(3000);  
}

void sayHello() {
  cycle++;
}

void loop() {
  Serial.print("cycle: ");
  Serial.println(cycle);
  digitalWrite(inPin, HIGH);
  Serial.print("HIGH: ");
  Serial.println(digitalRead(inPin));
  digitalWrite(inPin, LOW);
  Serial.print("LOW: ");
  Serial.println(digitalRead(inPin));
}

L'output è sempre lo stesso: HIGH: 1 LOW: 0 cycle: 1.00 (diventa 1 al primo giro e poi non cambia più)

Qualsiasi condizione io metta HIGH, LOW, RISING, FALLING la ISR viene invocata una sola volta...

Non credo che sia esatto... https://www.arduino.cc/en/Reference/AttachInterrupt Infatti nell'esempio è nel setup.

pinMode(inPin, OUTPUT);

Non sono sicuro se puoi farlo. Non so se funziona una lettura di un pin dichiarato uscita.
Prova a dichiarlo entrata ed attacarci un pulsante.

secondo problema.
È una pessima idea usare un float come variabile per incrementare dopo ca 2,3 milioni un increneto di uno non ha piú influenza sul numero.
Poi dovresti dichiarare la variabile di conta volatile perché cosí viene scritta per intero visto che é composta di 4 byte.

Riguardo il consiglio di gazza_mo secondo me é sbagliato.

Ciao Uwe

Chiedo venia, ho rimosso il post dove dicevo che forse l'errore era dichiararlo nel setup per non trarre in confusione. Sorry !

La variabile cycle non era dichiarata volatile e il metodo loop non leggeva il valore modificato dalla ISR. Per quanto riguarda il pinmode, è un refuso di alcune prove. Posto il codice funzionante:

volatile int cycle = 0;
int inPin = 22;

void setup() {
  Serial.begin(9600);
  Serial.println("Booting...");
  Serial.print("Valore pin ");
  Serial.println(digitalRead(inPin));
  delay(1000);
  pinMode(inPin, INPUT);
  Serial.print("Valore pin ");
  Serial.println(digitalRead(inPin));
  attachInterrupt(inPin, sayHello, CHANGE);
  delay(3000);  
}

void sayHello() {
  cycle++;
}

void loop() {
  if(cycle>1){
    Serial.print("cycle: ");
    Serial.println(cycle);
    Serial.print("STATE: ");
    Serial.println(digitalRead(inPin));
  }
}

Quello che non mi torna è il motivo per il quale un pin dichiarato come INPUT se con un multimetro leggo il suo valore è sempre alto. Mi sarei aspettato il contrario. A questo punto la domanda che mi sorge è la seguente: come faccio a lanciare l'interrupt su un valore alto se questo lo è di default? Non credevo che ci fossero queste enormi differenze tra il Due e l'UNO.

  1. Un entrata é un entrata e non un uscita.
  2. con un tester con un impedenza di qualche decina di MOhm leggi tensioni derivanti da correnti parasite presenti sui transistori di entrata. Percui fai misure fantasma.
  3. a un entrata dai una tensione da un circuito esterno. Se ci monti solo un pulsante, devi aggiungere una resistenza pullup o pulldown.

Ciao Uwe