Newsgroup: it.hobby.elettronica.digitale
Titolo: pulsanti: interrupt vs polling

ciao!
spero che queste domande siano ancora accettate visto che ultimamente 
qui le domande IT sono poche ormai...
allora devo decidere se usare polling o interrupt per leggere lo stato 
di 8 pulsanti n.a. (con un micro ovviamente)
il micro ï¿œ il 16f88 di casa microchip e non deve far molto altro...
spedisce caratteri via rs232 ma ha giï¿œ la sua uart dedicata
il punto importante ï¿œ che gli 8 pulsanti non sono 1/n e cioï¿œ l'utente ne 
puï¿œ premere 1 oppure 2 oppure anche 8 in contemporanea
per la prima volta da 10 anni a questa parte sarei indirizzato verso il 
polling... appena cambia lo stato della porta decodifico e metto nel 
buffer poi debouncing con un timer
con l'interrupt potrei usare 3 linee della portaB che hanno 
int-on-change  e pullup interno e 3 linee generiche per fare una matrice 
3x3 (9 contatti)
giro a 4mhz, no problemi di batteria
voi che strada scegliereste?
perchï¿œ?

 perchè?
Se usi i contatti a matrice diviene difficoltoso leggerne più d'uno.
Per farlo devi avvalerti di diodi nelle intersezioni dei contatti o
mettere in 3state (input no pull-up) le linee di scansione meno una.
Personalmente la gestione dei tasti la effettuo su interrupt pilotato
dal timer ad intervalli regolari in modo da poter disporre di una
logica software di antirimbalzo.
Proprio recentemente ho realizzato una scheda che utilizza 6 tasti
espandibili ad N in grado di svegliare il micro su pressione di uno
qualsiasi per poi affidare la gestione all'interrupt periodico.
[FIDOCAD]
MC 125 95 0 0 860
MC 145 95 0 0 860
MC 165 95 0 0 860
MC 175 95 0 0 860
MC 185 95 0 0 860
MC 155 95 0 0 860
MC 115 95 0 0 860
RV 40 75 75 165
LI 115 110 115 120
LI 115 120 75 120
LI 125 110 125 115
LI 125 115 125 125
LI 125 125 75 125
LI 135 110 135 130
LI 135 130 75 130
LI 145 110 145 135
LI 145 135 75 135
LI 155 110 155 140
LI 155 140 75 140
LI 165 110 165 145
LI 165 145 75 145
LI 175 110 175 150
LI 175 150 75 150
LI 185 110 185 155
LI 185 155 75 155
SA 115 95
SA 135 95
SA 145 95
SA 155 95
SA 165 95
SA 175 95
SA 125 95
LI 75 95 185 95
MC 135 95 0 0 860
TY 68 122 5 3 0 0 0 * P6
TY 68 117 5 3 0 0 0 * P7
TY 68 127 5 3 0 0 0 * P5
TY 68 132 5 3 0 0 0 * P4
TY 68 137 5 3 0 0 0 * P3
TY 68 142 5 3 0 0 0 * P2
TY 68 147 5 3 0 0 0 * P1
TY 68 152 5 3 0 0 0 * P0
TY 65 92 5 3 0 0 0 * INT
MC 115 75 3 0 010
MC 115 75 1 0 080
LI 115 95 115 85
TY 45 65 5 3 0 0 0 * INT on low-level
In situazione di power-down (clock fermo) le linee I/O P7..P0 sono
programmate ome output e sono a basso livello (0 Volt).
INT è programmato per generare interrupt sulla permanenza a basso
livello (uso gli AVR).
Premendo un tasto, INT sveglia il micro poiché viene portato a basso
livello dalla relativa uscita bassa.
Subito dopo (routine di interrupt) porto P7..P0 come input con pull-up
e INT come normale uscita bassa (output, 0 Volt).
Effettuo l'input parallelo di P7..P0 ed utilizzo il valore per la
gestione.
Da ora in poi il micro resta acceso con l'I/O invariato e a cadenza
regolare (anche 500 volte al secondo) leggo parallelamente i pulsanti.
L'antirimbalzo lo setto in genere sui 30 ms.
Quando ho pochi tasti, uso per l'antirimbalzo un numero corrispondente
di contatori.
In base a questi, genero un byte speculare a P7..P0 ma filtrato.
La generazione di un codice corrispondente alle diverse pressioni
avviene dopo.
Quando gli eventi determinano l'entrata in power-down del micro,
riporto l'I/O in grado di accettare low-level interrupt, come
all'inizio.
Piccio.

 buffer poi debouncing con un timer
E come gestisci poi altre pressioni quasi contemporanee o contemporanee?
Personalmente ricorro agli interrupt come ultima chance, la soluzione di 
Piccio di generare una frequenza real time (interna o esterna, sotto 
interrupt o meno) e agganciarsi a quella per portare avanti i processi 
mi sembra la piu' semplice.
Una volta ho dovuto leggere 96 ingressi asincroni, applicando a ciascuno 
il suo personale antirimbalzo (serviva per conteggiare il numero di 
eventi rilevati da ciascun ingresso), e il modo piu' semplice era 
appunto agganciarmi ad una frequenza, e trattare ogni ingresso con un 
piccolo automa a stati finiti, ciascuno con la sua variabile di stato e 
contatore tempo.
Ovviamente non ho scritto 96 automi, ma un solo automa a cui venivano 
passati di volta in volta i dati tabellari dell'ingresso in esame.
ciao
Claudio_F

 logica software di antirimbalzo.
Confermo, anche noi abbiamo il driver della tastiera che funziona in 
questo modo.
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org

 all'inizio.
quindi se a me l'idle non mi serve mi basta riabilitare l'irq quando 
tutti i contatori per il debouncing sono esauriti
giusto?
una curiositï¿œ: ma perchï¿œ sui pic ci sono le linee di rb con int e pullup?
grazie!
-ice-