Funzione richiamata all'avvenire di un evento

“Giocherellando” con processing ho notato che nelle struttura era possibile inserire certe funzioni che vengono richiamate all’avvenire di un certo evento, interrompendo tutti gli altri processi!
Per esempio la funzione keyPressed() viene richiamata alla pressione di un tasto della tastiera!
Com’è possibile creare funzioni che all’avvenire di un certo evento vengono automaticamente richiamate “infischiandosene” di tutti gli altri processi in corso!?

Faccio un esempio:

void loop(){
for (int i = 0; i < 1000; i++){
print("i: ");
println(i);
delay(1000);
}
}

Ho questo ciclo for che ogni secondo mi aumenta di 1 la variabile i fino a che questa arrivi a 1000, ma se io volessi fermare questo ciclo nel bel mezzo dell’esecuzione? Cioè, premendo un tasto si interrompe il ciclo e viene eseguita un’altra funzione!

Dovresti creare una struttura "if" per verificare se hai input su un pin alla pressione di quel tasto!

Si fino a qui c’ero arrivato! Ma se non volessi questa struttura if?

Cioè riporto il codice di prima con una piccola aggiunta:

void loop(){
for (int i = 0; i < 1000; i++){
print("i: ");
println(i);
delay(1000);
}
}

buttonPressed(){
//Questa funzione viene richiamata automaticamente alla pressione di un pulsante!

}

Ciao Xfox
Un attimo. 8)

La condizione
if(condizione){codice da eseguire se la condizione é vera}
non é una cosa ne complicata ne lenta.
Se non vuoi usare dei IF non sono disposto di aiutarti perché ritengo che non hai capito nulla di C e della programmazione in generale e perché non ho voglia di perdere tempo a fare del codice complicato solo perché Ti é antipatico il IF. ]:smiley:

soluzioni:
Per primo non usare la funzione delay() perché blocca il controller.
Programma la funzione loop() in modo che viene di continuo ripetuta e che puó controllare le condizioni IF e eseguire il codice condizionato.

if(digitalRead(pinpulsante)
{
buttonPressed();
}

Ciao Uwe

non è un interrupt sul pin del pulsante quello di cui ha bisogno??? l'ho sparata li, non so....

Xfox scrive:

Com'è possibile creare funzioni che all'avvenire di un certo evento vengono automaticamente richiamate "infischiandosene" di tutti gli altri processi in corso!?

Sí gli interrupt possono essere una soluzione ma

  • per primo non sono cosí universali da poter gestire qualsiasi tipo di evento
  • Per usare gli interrupt si devono fare diverse considerazioni. Per primo cosa succede se durante un interrupt ne avviene un altro? puó essere ignorato? o necessariamente elaborato?

Secondo mé é meglio usare la funzione loop e controllare di continuo se un evento é avvenuto.
Adesso Xfox non dice cosa vuole fare, percui é difficile sapere cosa é la soluzione migliore.

Ciao Uwe

Allora, spiego meglio:
In un programma di considerevoli dimensioni (intendo di codice, non di spazio) incasinerei il codice continuando a mettere un controllo di tipo if in ogni pezzo del codice (o in ogni ciclo).

Io so perfettamente come si usa un controllo con l'istruzione if e la uso spesso abbinata a millis().

Potete darmi qualche informazione in più su questi interrupt?

http://arduino.cc/en/Reference/Interrupts
e
http://arduino.cc/en/Reference/AttachInterrupt
Come fonte possono essere usati i pin 2 e 3 ( interrupt 0 e 1).
ANche i timer possono generare un interrupt, ma questi devono essere programmati direttamente i registri del controller.

Ciao Uwe

Grazie mille, era proprio quello che mi serviva!
Ma non riesco a capire cosa significa che posso usare come fonte i pin 2 e 3 (interrupt 0 e 1).
Nell'esemio http://arduino.cc/en/Reference/AttachInterrupt da come n° itterupt 0 e come pin di ingresso il 13.

Ciao Xfox

http://arduino.cc/en/Reference/AttachInterrupt:
Description
Specifies a function to call when an external interrupt occurs. Replaces any previous function that was attached to the interrupt. Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

il 13 viene definito come uscita e ad ogni interrupt il led su pin 13 cambia stato (si accende o spegne).
Ciao Uwe

Oh, si! xD M'è sfuggita questa cosa! Ti ringrazio!

specificherei che ci sono 2 tipi di interrupt: gli interrupt hardware (come cambio di stato di un pin)
e gli interrupt software (lanciati da un programma o dai timer ecc…)

non credo che arduino abbia interrupt software programmabili a piacere.

lesto:
non credo che arduino abbia interrupt software programmabili a piacere.

E già programmati?

già programmati ci sono quelli sul timer e basta, credo... comunque una letta al manuale atmega non guasta mai :slight_smile:

Dove lo trovo? :slight_smile:

Ciao Xfox
Vai s Arduino.cc
menu Hardware, clicchi su Arduino uno (la foto oppure la scritta "Arduino UNO"),
poi trovi nel testo "ATmega328 (datasheet)." il link al datasheet del Controler.

Poi cerchi nel documento di 448 pagine il capitolo 11 Interrupt a pagina 57.
Ciao Uwe

Grazie mille!

google power:
voilà Smart | Connected | Secure | Microchip Technology