Newsgroup: it.hobby.elettronica.digitale
Titolo: Eseguire una funzione su variazioni o continuamente?

Vi anticipo subito che le osservazioni contenute in questo post sono 
assolutamente "sofistiche"... per non dire delle seghe mentali.
Supponete di dover scrivere una semplicissima applicazione dove dovete 
chiudere un relè e accendere un LED quando un tasto si chiude e viceversa.
La cosa è così banale che mi vergogno a parlarne... ma vi avevo avvertito.
In genere io sono combattuto tra due soluzioni. Quella più immediata:
   if (SWITCH_ISCLOSED()) {
     PIN_RELAY = 1;
     PIN_LED = 1;
   } else {
     PIN_RELAY = 0;
     PIN_LED = 0;
   }
e l'altra meno:
   static int old = -1;
   int switch = SWITCH_ISCLOSED();
   if (old != switch) {
     if(SWITCH_ISCLOSED()) {
       PIN_RELAY = 1;
       PIN_LED = 1;
     } else {
       PIN_RELAY = 0;
       PIN_LED = 0;
     }
     old = switch;
   }
E' chiaro che la seconda sembra esageratamente complicata per il 
problema descritto, il classico cannone per colpire una mosca. Eppure, 
in alcuni casi (ovviamente più complicati di questo esempio), considero 
questo approccio più conveniente.
La differenza sostanziale tra le due soluzioni è che, nella prima, viene 
confermato in continuazione lo stato del relè e del LED. Che io sappia, 
questo non comporta problemi, nel senso che il pin rimarrà stabile alto 
o basso fin quando il tasto non cambia stato.
Nella seconda soluzione, invece, a parte il trucchetto (old 
inizializzato a -1) per forzare una prima impostazione dei pin, lo stato 
dei pin *non* viene confermato continuativamente, ma solo alle 
variazioni dello stato del tasto.
Perché dovrei preferire il cannone piuttosto che lo "schiacciamosche"? 
Se il problema si complica leggermente e il comando al relè e al led 
diventano due funzioni o macro [relay_close()/relay_open() e 
led_on()/led_off()], potrebbe essere che queste funzioni abbiano una 
complicazioni intrinseca, che magari può cambiare con gli sviluppi 
futuri (anche dell'hw). Per esempio, oggi il relay è pilotato 
direttamente da un pin del micro, domandi da uno shift-register o I/O 
expander su bus I2C oppure da un micro slave collegato via CAN bus o 
connessione seriale RS232/RS485.
Magari vorremmo raggiungere il famoso "riutilizzo del codice" e quindi 
sarebbe giusto chiederci cosa succede al nostro semplicissimo algoritmo 
nelle situazioni più disparate.
E' chiaro che, in quest'ottica, il cannone ha i suoi vantaggi. Perchè 
inviare lo stesso comando ad un micro slave per confermare in 
continuazione di chiudere/aprire il relè o accendere/spegnere il LED?
Non è meglio farlo solo sulle variazioni?
Di contro la prima soluzione ha i suoi vantaggi. Oltre alla evidente 
maggiore semplicità, permette di essere sicuri che, indipendentemente da 
bug insidiosi, il relè sarà chiuso e il LED sarà acceso con il tasto 
chiuso. Non mi devo preoccupare di studiarmi e prevedere tutte le 
possibili "transizioni", tanto lo stato del relè e del LED sarà 
confermato in continuazione.
Ok, finisco qui le mie elucubrazioni mentali e passo la parola ad altri 
pazzi come me che vorrano perdere tempo su queste noiose questioni :-)

 assolutamente "sofistiche"... per non dire delle seghe mentali.
[...]
Ti sei praticamente risposto da solo. Il vero problema e' pensare che vi 
sia una soluzione universale, un modulo universale, un circuito 
universale... perche' nel singolo caso pratico o servira' un particolare 
non previsto oppure l'aggeggio sara' cosi' universale da essere quasi 
inutile perche' troppo scarno.
Io preferisco dove possibile lavorare con i livelli/stati per i motivi 
che hai detto, e ricorrere alle variazioni/transizioni solo se 
strettamente necessario (tipicamente se ci sono di mezzo sistemi di 
trasmissione ecc).
Claudio_F

 trasmissione ecc).
Ok, grazie del tuo suggerimento. In effetti faccio così anch'io nella 
maggior parte dei casi semplici... ma mi chiedo se sia la soluzione 
migliore.