Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Come utilizzare il delay nella funzione dell'interrupt

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

0
voti

[1] Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto Utentega2bo » 14 mag 2020, 23:40

Buonasera a tutti, oggi stavo provando a scrivere uno sketch in arduino e ho bisogno di sapere se esiste un modo, un alternativa o se proprio non si può, fermare l'arduino quando sta eseguendo un interrupt.
Vi spiego meglio, io avrei bisogno di una funzione tipo delay che però possa essere utilizzata all'interno della funzione richiamata dall'interrupt.
Avatar utente
Foto Utentega2bo
10 5
New entry
New entry
 
Messaggi: 73
Iscritto il: 10 mar 2020, 0:46

3
voti

[2] Re: Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto Utentelucaking » 15 mag 2020, 8:36

All' interno di un ISR la funzione delay() di arduino non funziona, in quanto essa stessa fa uso dell' interrupt che governa la funzione millis(), e all' interno di una ISR questo interrupt viene sospeso.
L' unica che dovrebbe funzionare correttamente è la funzione delayMicroseconds().
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Per avere un buon controllo del flow è buona norma scrivere delle ISR brevi che si limitino a fare lo stretto indispensabile e far gestire tutto il resto al main loop.
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

0
voti

[3] Re: Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto Utentega2bo » 15 mag 2020, 8:39

Ok grazie, ora provo.
Avatar utente
Foto Utentega2bo
10 5
New entry
New entry
 
Messaggi: 73
Iscritto il: 10 mar 2020, 0:46

3
voti

[4] Re: Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto UtenteIlGuru » 15 mag 2020, 9:19

Le interrupt service routine devono essere brevi e veloci, pertanto utilizzare ritardi all'interno di esse è fondamentalmente sbagliato.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.434 1 10 13
Master
Master
 
Messaggi: 1530
Iscritto il: 31 lug 2015, 23:32

3
voti

[5] Re: Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto UtentePietroBaima » 15 mag 2020, 9:34

Lo scopo di un service di interrupt è quello di fare qualcosa che non può essere rimandato per nessuna ragione, per esempio leggere degli ingressi, scrivere delle uscite, fare il refresh della memoria (se non automatico), salvare dei dati perché sta per mancare l’alimentazione, leggere l’ADC, scrivere il DAC, ecc. ecc. ...

Quando il processore esegue una chiamata INT gli altri service di interrupt sono disabilitati: abbiamo quindi focalizzato tutta la capacità di calcolo del processore su quella chiamata che quindi deve rigorosamente essere breve e veloce. Se ci sono da leggere degli ingressi si leggono quelli e poi si esce, se ci sono da scrivere delle uscite si scrivono quelle e poi si esce. STOP
Fare calcoli (soprattutto moltiplicazioni o divisioni) durante un INT è sbagliato. Se bisogna calcolare delle funzioni disponibili solo dopo aver letto i dati, queste si calcolano fuori dall’interrupt o, in rarissimi casi, si usano delle tabelle.

Fare perdere tempo con un delay durante un INT non è un po’ sbagliato, è profondamente sbagliato, enormemente sbagliato. In gergo informatico si dice che è una vaccata disumana.

Lo è perché è un errore non solo dal punto di vista della programmazione, ma anche dal punto di vista logico e logistico di approvvigionamento delle risorse di macchina.
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex

Io capisco le cose per come le scrivete. Per esempio: K sono kelvin e non chilo, h.z è la costante di Planck per zepto o per la zeta di Riemann e l'inverso di una frequenza non si misura in siemens.
Avatar utente
Foto UtentePietroBaima
79,8k 6 12 13
G.Master EY
G.Master EY
 
Messaggi: 10007
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[6] Re: Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto Utentega2bo » 15 mag 2020, 11:10

Ma perché dopo svariati tentativi di cercare di filtrare l'ingresso di un interrupt via hardware mi è rimasta la via software e un modo è quello di mettere un daley.
Perché se no, non so come fare via software.
Perché io utilizzo un relè per controllare la 220 con Arduino e senza collegare la 220 al rele, il relè si accende e si spegne bene ma appena gliela collegato e schiaccio una volta il pulsante mi prende 20 pressioni.
Avatar utente
Foto Utentega2bo
10 5
New entry
New entry
 
Messaggi: 73
Iscritto il: 10 mar 2020, 0:46

1
voti

[7] Re: Come utilizzare il delay nella funzione dell'interrupt

Messaggioda Foto UtentePietroBaima » 15 mag 2020, 12:05

Prima di tutto devi fare una funzione di antirimbalzo del tasto, se non c’è già.
Poi, il problema EMC è stato completamente trascurato dal masterista che ha curato la scheda Arducoso e gli effetti di questa trascuratezza sono riflessi in molti post qui, nella sezione Arduino.

Se non basta posizionare la scheda su di un piano, collegato a GND, di alluminio (con un foglio isolante) allora l’unico modo è quello di racchiuderla in una scatola metallica, facendo attenzione a filtrare ogni ingresso e uscita.

Sicuramente il tuo problema non si risolve con un delay in un INT...

Ti devi costruire un INT periodico e un INT per leggere lo stato del tasto, che viene chiamato sia dal fronte in salita che da quello in discesa.
Per farla semplice puoi utilizzare l’INT periodico che serva solo quel tasto (anche se non è bellissimo, come prima prova va quasi bene) e fare così: quando l’INT del tasto viene chiamato, se il tasto è premuto azzeri il contatore dell’INT periodico ed esci. Quando l’INT del tasto viene chiamato di nuovo, perché il tasto viene rilasciato, memorizzi in una variabile (attenzione al cast) il valore raggiunto dal contatore, alzi un FLAG ed esci. Abilita un altro INT se il contatore va in overflow. In questo caso blocca il contatore al massimo finché il tasto non viene rilasciato.

Fuori dal service, nel modulo della HAL, allora costruirai una funzione che si chiamerà “debounce” che reagisce al FLAG e disabiliterà l’INT che legge il tasto per un certo tempo (100 ms?), ma solo se il tasto è stato premuto per un tempo superiore ad un certo tempo minimo (30ms?).
Per fare questo ti serve un altro contatore.
Con l’ATMEGA utilizzato da Arducoso non hai problemi sul numero di contatori.

Questa non è una funzione che si può considerare professionale (in campo professionale si fa uno scheduler di eventi) ma è una funzione affidabile per gestire spikes e rimbalzi dei tasti.
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex

Io capisco le cose per come le scrivete. Per esempio: K sono kelvin e non chilo, h.z è la costante di Planck per zepto o per la zeta di Riemann e l'inverso di una frequenza non si misura in siemens.
Avatar utente
Foto UtentePietroBaima
79,8k 6 12 13
G.Master EY
G.Master EY
 
Messaggi: 10007
Iscritto il: 12 ago 2012, 1:20
Località: Londra


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti