[RISOLTO]quante volte mandare HIGH/LOW un pin in un ciclo

ciao
mentre scrivevo uno sketch mi sono trovato a dover decidere tra due soluzioni, mostrate sotto, mi sono posto la domanda, se mettere un pin HIGH più volte all'interno di un ciclo, finché non esce, è indifferente, o è sconsigliato

...
i=1;  
    while(digitalRead(posB)==0 && fase1==1)
    {
      if(i=1)
      {
      digitalWrite(outA,1);
      delay(ritardo);
      digitalWrite(outA,0);
      i=0;
      }
}
...

o questa

... 
    while(digitalRead(posB)==0 && fase1==1)
    {    
      digitalWrite(outA,1);
      delay(ritardo);
      digitalWrite(outA,0);
     }
...

voi cosa dite?

stefano

Se vuoi fare un blink devi aggiungere un ritardo anche allo spegnimento

digitalWrite(outA,1);
delay(ritardo);
digitalWrite(outA,0);
delay(ritardo);

altrimenti il pin rimane acceso il tempo del delay e spento il tempo necessario per reiniziare il ciclo: pochi microsecondi.
Poi dipende da te, se vuoi comandare il ciclo dall'esterno aggiungi una variabile di supporto, se non serve usa la seconda soluzione.
Il ciclo vita del pin credo sia di qualche migliaia a di ore.

Non credo ci siano problemi. Semplicemente nel primo caso il led si accende e si spegne una volta, nel secondo va ad intermittenza finchè digitalRead(posB)==0 e fase1==1

nel secondo caso però devi aggiungere un delay(ritardo); alla fine del while prima di chiuderlo

Vuoi sapere se si può mandare HIGH un pin che è già HIGH?

quello che vorrei sapere è se ha senso mandare continuamente un pin del micro HIGH, all'interno di un ciclo, dal punto di vista della sua resistenza

stefano

Stefano guarda che mica è un relé meccanico eh ... stiamo parlando di semplici semiconduttori ... prova a pensare ad un banale generatore di onde quadre ad alta frequenza ... hai idea di quante volte vada HIGH - LOW al secondo ??? :grin: XD :grin: XD

Guglielmo

Non ci sono problemi se metti HIGH un pin che é giá HIGH. L'unico problema puó essere che visto che il digitalWrite() é un po lento il codice potrebbe essere piú veloce se non lo rimetti a HIGH.

Ciao Uwe

ok grazie
la mia era uno scrupolo
della velocità del digitalWrite non sapevo pensato, devo verificare il comportamento

stefano

stefa24:

      if(i=1)

Attento che l'uguaglianza si fa con 2 segni uguale, quindi == :wink:

voi cosa dite?

Un digitalWrite con segnale HIGH è semplicemente mettere ad 1 il bit di un registro. Se tale bit è già ad 1, l'operazione a livello elettrico credo sia ininfluente, nel senso che non dovrebbe sortire effetto. Servirebbe però un oscilloscopio e vedere se sul pin si rileva qualche variazione di stato. In questo il datasheet mi pare lacunoso perché non affronta esplicitamente il caso.

si hai ragione if(i==1) è la sintassi giusta, è per questo che all'inizio non mi funzionava poi me ne sono accorto

stefano

leo72:
Un digitalWrite con segnale HIGH è semplicemente mettere ad 1 il bit di un registro. Se tale bit è già ad 1, l'operazione a livello elettrico credo sia ininfluente, nel senso che non dovrebbe sortire effetto. Servirebbe però un oscilloscopio e vedere se sul pin si rileva qualche variazione di stato. In questo il datasheet mi pare lacunoso perché non affronta esplicitamente il caso.

Interessante come dubbio. Chi ha un oscilloscopio? Chi fa un test per la comunità? :smiley:
(Sorry io non c'e' l'ho. Era un dubbio che mi era venuto anche a me.)

Non ho fatto misure ma non dovrebbe generare delle interferenze sul Pin il fatto che il registro viene ricaricato con lo stesso valore.

Ciao Uwe

Non parlavo di interferenze, ma proprio di impercettibili cambi di stato. Cioè, volevo capire se scrivendo "1" su un bit di una porta già impostato ad "1" il microcontrollore effettuasse lo stesso l'operazione di attivazione del segnale HIGH oppure se ignorava la cosa perché non c'era cambio di stato nel registro. Magari con un oscilloscopio si poteva capire se il micro tentava lo stesso l'operazione oppure no.

Se ci fossero sarebbero piú brevi di un ciclo di clock. Percui non misurabili con gli oscilloscopi amatoriali o semiproffessionali (un spike di qualche decina di ns ogni 10 o 100µs)
Ciao Uwe