Go Down

Topic: Interrupt su funzione con parametro (Read 63 times) previous topic - next topic

mauromago

Salve
Il titolo non rende l'idea benissimo, ma non saprei condensare meglio la questione.

in pratica ho delle chiamate alle funzioni degli interrup esterni che fanno la stessa cosa, solo su una variabile differente.
4 pin che se cambiano stato modificano un valore booleano di riferimento per quel pin e ritornano null.
in questo caso ho 4 funzioni che invece vorrei condensare in una sola, chiamata da tutti gli interrup ma che agisca sulla variabile corretta.

ora ho:
Code: [Select]

...
//dichiarazione funzioni
void Conta1 (){
  check[0] = 1;
}

void Conta2 (){
  check[1] = 1;
}

void Conta3 (){
  check[2] = 1;
}

void Conta4 (){
  check[3] = 1;
}
...
void setup() {
  #ifdef DEBUG
  Serial.begin(115200);
  #endif 
  attachInterrupt(Spin1, Conta1, FALLING);
  attachInterrupt(Spin2, Conta2, FALLING);
  attachInterrupt(Spin3, Conta3, FALLING);
  attachInterrupt(Spin4, Conta4, FALLING);
 
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  setup_wifi();
  reconnect();
  client.publish(mqtt_topicd, "reset-corrente"); 
}
...
void loop() {
   for (int C = 0; C <= 4; C++) {
    if (check[C]){
      #ifdef DEBUG 
      Serial.println ("check");
      #endif
      switch (C) {
        case 0:
        detachInterrupt(Spin1);
        controllo (C);
        attachInterrupt(Spin1, Conta1, FALLING);
        break;
        case 1:
        detachInterrupt(Spin2);
        controllo (C);
        attachInterrupt(Spin2, Conta2, FALLING);
        break;
        case 2:
        detachInterrupt(Spin3);
        controllo (C);
        attachInterrupt(Spin3, Conta3, FALLING);
        break;
        case 3:
        detachInterrupt(Spin4);
        controllo (C);
        attachInterrupt(Spin4, Conta4, FALLING);
        break;       
      } 
    }
  }
...


La dichiarazione di quelle 4 funzioni troppo simili e lo switch case non mi paiono molto eleganti, ma non ho dea di come poter migliorare la cosa.
Ho googleato ma non ho trovato nulla di significativo.

tra i "bravi" c'è chi sa come (e se) si può fare.

Grazie

torn24

Le funzioni Interrupt  non devono avere tipo di ritorno e non possono avere parametri, per cui non posso usare una funzione con parametri.


La funzione però può fare cose diverse in base ad esempio a una variabile globale, ad esempio io mi creo una variabile globale che in base a ciò che accade nel mio programma, aggiorno con valori diversi, sono in una situazione e imposto la variabile a 1, in un altra a 2 ecc, all'interno della funzione chiamata dall'interrupt "senza parametri e con tipo di ritorno void", pongo una successione di if e else if, che valutano il valore della variabile globale e fa cose diverse a seconda del valore.

mauromago

Non era proprio questo che chiedevo, non mi sono spiegato abbastanza bene.

Se tutti gli interrupt puntano alla stessa funzione, ho modo di capire nella funzione quale puntatore l'ha chiamata? ovvero quale interrupt lo ha fatto?

Ma soprattutto nella parte successiva dove faccio attach e detach posso in qualche modo dare il riferimento del pin e della funzione in modo parametrico? così da eliminare lo switch.

M

Go Up