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.
Come utilizzare il delay nella funzione dell'interrupt
7 messaggi
• Pagina 1 di 1
3
voti
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.
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.
3
voti
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.
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.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12206
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
0
voti
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.
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.
1
voti
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.
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.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12206
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
7 messaggi
• Pagina 1 di 1
Chi c’è in linea
Visitano il forum: Nessuno e 2 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)





pigreco]=π