Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Debounce software interrupt esterno

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

0
voti

[41] Re: Debounce software interrupt esterno

Messaggioda Foto Utentelucaking » 1 set 2022, 8:10

Ok, voi pensate che io non vi ascolti, ma ho solo bisogno di tempo, ci stavo lavorando su :D.
Daltronde ascolto il telegiornale in versione ridotta perché viene incontro alle mie capacità mentali (cit.)...

Per favore ditemi che così comincia ad avere una sua decenza.
Codice: Seleziona tutto
#define SW_PIN 2
#define CLK_PIN 3
#define DT_PIN 4


volatile boolean button_trig = 0;
volatile boolean encoder_trig = 0;
volatile unsigned long button_trig_time;
volatile unsigned long encoder_trig_time;
int encoder_count = 0;
int last_encoder_count = 0;

void button_isr ()
{
   button_trig_time = millis();
   button_trig = 1;
}

void encoder_isr ()
{
   encoder_trig_time = millis();
   encoder_trig = 1;
}

int encoder_read ()
{
   unsigned int encoder_val = digitalRead(CLK_PIN) << 1 | digitalRead(DT_PIN);
   switch (encoder_val) {
   case 0: /* case 3: */
      encoder_count--;
      break;
   case 1: /* case 2: */
      encoder_count++;
      break;
   }
   return encoder_count;
}

void setup()
{
  pinMode (SW_PIN, INPUT);
  pinMode (CLK_PIN, INPUT);
  pinMode (DT_PIN, INPUT);
  attachInterrupt (0, button_isr, FALLING); // encoder SW_PIN.
  attachInterrupt (1, encoder_isr, CHANGE); // encoder CLK_PIN.
   Serial.begin (9600);
}

void loop()
{
   if (encoder_trig) {
      if (millis() - encoder_trig_time > 1) {
         if (encoder_read() != last_encoder_count) {
            Serial.print(encoder_count);
            Serial.print(" ");
            last_encoder_count = encoder_count;
         }
      encoder_trig = 0;
      }
   }
   
   if (button_trig) {
      if (millis() - button_trig_time > 300) {
         Serial.print("\n\rConfermato ");
         Serial.println(encoder_count);
         Serial.println();
         button_trig = 0;
      }
   }
}
Avatar utente
Foto Utentelucaking
1.443 3 5 8
Expert
Expert
 
Messaggi: 1284
Iscritto il: 29 mag 2015, 14:28

0
voti

[42] Re: Debounce software interrupt esterno

Messaggioda Foto UtenteEtemenanki » 1 set 2022, 8:37

lucaking ha scritto:... proprio con questo tipo di encoder ee ero riuscito discretamente...

E per il condizionare l'entita' dell'incremento al fatto che il pulsante sia premuto o no mentre giri ? (per evitare di dover fare una quindicina di giri per passare da 0 a 255, ad esempio)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
3.422 3 4 9
Master
Master
 
Messaggi: 2270
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

4
voti

[43] Re: Debounce software interrupt esterno

Messaggioda Foto Utentenicsergio » 1 set 2022, 8:53

Thread interessante, ho sempre lavorato con gli encoder incrementali, ma non mi ero mai posto il problema della lettura: nel mio campo si usano dei contatori veloci per acquisire dal PLC i 3 canali (A, B e tacca di zero) oppure si parametrizza nell'azionamento il tipo di trasduttore di posizione e questo viene gestito automaticamente, nel caso di manopole in genere mi ritrovo direttamente sull'interfaccia predisposta dal costruttore il codice gray o decimale relativo all'impostazione.

Molto carina l'implementazione di Foto Utentedjnz, che appunto rende inutile il debuonce.

lucaking ha scritto:..credo di essere ancora lontano, dovrò studiarmi la macchina a stati e la rappresentazione con la matrice.


Foto UtenteGioArca67 lo ha spiegato bene, con questo modo l'incremento o decremento del passo avviene dopo la verifica della determinata sequenza di 4 eventi, dati dai fronti positivi e negativi dei segnali dei due ingressi:


se può aiutarti ho provato a disegnare in FidocadJ (così lo potete eventualmente correggere) il diagramma a stati secondo lo standard UML indicato da Foto UtentePietroBaima:
Avatar utente
Foto Utentenicsergio
4.016 3 9 13
Master
Master
 
Messaggi: 700
Iscritto il: 1 gen 2020, 16:42

0
voti

[44] Re: Debounce software interrupt esterno

Messaggioda Foto UtenteEtemenanki » 1 set 2022, 9:18

Aggiungo al mio post precedente solo una domanda, per curiosita' ... perche' usare un'interrupt per il pulsante dell'encoder ?

Intendo dire, ok per i segnali della rotazione, dato che potrebbero anche andare persi se fosse troppo veloce, ma la pressione del pulsante non dovrebbe in ogni caso durare a sufficenza da essere rilevabile nel loop con un banale digitalRead ? (ok, a meno che il loop non sia strapieno di roba o la pressione sia fatta di proposito il piu breve possibile per fregare il loop, ma qui si andrebbe nel perverso :mrgreen: )
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
3.422 3 4 9
Master
Master
 
Messaggi: 2270
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

0
voti

[45] Re: Debounce software interrupt esterno

Messaggioda Foto UtenteWALTERmwp » 1 set 2022, 9:53

GioArca67 ha scritto:
WALTERmwp ha scritto:Cosa fare in alternativa è stato scritto: nella ISR modifichi una variabile, fuori dalla ISR (cioè nel loop)

Anche se l'ho indicato sopra mi piace pochissimo nel caso in esame.
Ok solo per eventi radi e loop abbastanza veloce, altrimenti diventa un polling.
si, osservazione condivisibile.
Piuttosto, si rileva l'evento(attivazione interrupt per variazione dell'ingresso) che comporta l'innesco di una temporizzazione(per filtrare il rimbalzo) anch'essa associata ad interrupt.
Oppure ...

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
27,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8103
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[46] Re: Debounce software interrupt esterno

Messaggioda Foto Utenteluxinterior » 1 set 2022, 10:39

Ho trovato un "datasheet"
Io ho sbagliato perché pensavo a encoder di posizione in cui bisogna tenere conto del conteggio.In questo caso non dichiarano nemmeno gli impulsi giro (....ci arrivo con calma ma ci arrivo)

A questo punto io lascierei perdere l'interrupt ma farei un campionamento periodico delle linee ogni tot millisecondi ed eventuale debounce software. In base allo stato delle linee confrontato col precedente decidi cosa fare (Non ho letto tutte le risposte ma ho visto macchine a stati ecc..) La gestione la fai nel main loop hai solo un interrupt periodico che fa solo due cose
sposta stato attuale delle linee in stato precedente
aggiorna stato attuale leggendo gli ingressi (interruttore compreso)

fai una "foto" dello stato delle linee ogni tot millisecondo quello che succede in mezzo non o vedi e non ti interessa
Allegati
25.pdf
(153.39 KiB) Scaricato 19 volte
Avatar utente
Foto Utenteluxinterior
3.346 3 4 8
Master
Master
 
Messaggi: 2018
Iscritto il: 6 gen 2016, 17:48

0
voti

[47] Re: Debounce software interrupt esterno

Messaggioda Foto UtenteGioArca67 » 1 set 2022, 10:55

?????
Avatar utente
Foto UtenteGioArca67
2.213 3 4 9
Master
Master
 
Messaggi: 2030
Iscritto il: 12 mar 2021, 9:36

0
voti

[48] Re: Debounce software interrupt esterno

Messaggioda Foto Utentelelerelele » 6 set 2022, 8:44

Nel software che ha impostato, con la routine di ISR ed il ritardo, funziona da antirimbalzo, se toglie il ritardo, i rimbalzi vanno a conteggiare rotazioni inesistenti e quindi salti errati in avanti ed indietro.

WALTERmwp ha scritto:Piuttosto, si rileva l'evento(attivazione interrupt per variazione dell'ingresso) che comporta l'innesco di una temporizzazione(per filtrare il rimbalzo) anch'essa associata ad interrupt.

Ecco, questa può essere una buona soluzione.

saluti.
Avatar utente
Foto Utentelelerelele
3.292 3 7 9
Master
Master
 
Messaggi: 3812
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[49] Re: Debounce software interrupt esterno

Messaggioda Foto UtenteEcoTan » 6 set 2022, 9:01

In quest'altro thread si affronta un problema simile:
viewtopic.php?f=17&t=83519&p=880174&hilit=encoder#p880174
Avatar utente
Foto UtenteEcoTan
6.613 4 11 13
Expert EY
Expert EY
 
Messaggi: 4528
Iscritto il: 29 gen 2014, 8:54

Precedente

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti