Pin Digitali I/O con funzione Update

Salve a tutti,

volevo chiedere informazioni su un grande dubbio riguardante la funzione "digitalWrite()" sul software IDE per le schede Arduino & Co.

Mi sono informato che tale funzione è al quanto lenta poichè ognuna è pensata per agire su un singolo pin digitale usando 4/5 o più microcicli.

Per esempio con l'utilizzo dei cicli "For" se devo scrivere "HIGH" su 16 pin, praticamente le azioni verranno fatte una alla volta per ogni pin.
Collegando dei LED sui 16 pin Uscita, giustamente per l'occhio umano è impercettibile notarlo e vedremo accendersi di colpo tutti i 16 LED quando per logica vengono accesi uno alla volta.

La domanda è questa: esiste un comando o un modo per settare i valori per poi aggiornarli sui pin digitali in un colpo solo ?

Praticamente deve essere la stessa funzione come negli integrati 74HC595 (Registro a Scorrimento SIPO)
dove dopo la funzione di scrittura, su un determinato numero di Integrati, si utilizza il pin collegato al LATCH che aggiorna in un ciclo tutte le uscite scritte in precedenza. Un aggiornamento PARALLELO.

Grazie :slight_smile:

Studiare QUI ...

Guglielmo

MizzardNet:
Collegando dei LED sui 16 pin Uscita, giustamente per l'occhio umano è impercettibile notarlo e vedremo accendersi di colpo tutti i 16 LED quando per logica vengono accesi uno alla volta.
La domanda è questa: esiste un comando o un modo per settare i valori per poi aggiornarli sui pin digitali in un colpo solo ?

A parte l'ottimo consiglio di Guglielmo, ma mi chiedevo: tu SAI a quale velocità effettua i cicli un Arduino?

Il clock è a 16MHz, contando in circa 0.85 microsecondi il tempo della digitalWrite (diciamo circa 12 cicli clock), 16 uscite le porti a HIGH in circa 12 microsecondi. A voler abbondare diciamo 20 microsecondi.

Non so a quale applicazione tu stia lavorando ma se non si possono considerare "contemporanei" questi (tanto più per dei LED!)... :wink:

docdoc:
Il clock è a 16MHz, contando in circa 0.85 microsecondi il tempo della digitalWrite

Misurandola col frequenzimetro una singola digitalWrite la vedo durare circa 5.5µs, avevo già provato in passato, ma ho voluto riprovare per esserne certo.

Il codice seguente fa 82476 giri di loop al secondo con le due d.W., e 150238 giri al secondo con una sola d.W. La differenza è appunto di 5.47µs.

void setup() {
    pinMode(9, OUTPUT);
    noInterrupts();
}
void loop() {
    uint8_t static n = 0;
    digitalWrite(9, n);
    digitalWrite(9, n);
    n = !n;
}

docdoc:
A parte l'ottimo consiglio di Guglielmo, ma mi chiedevo: tu SAI a quale velocità effettua i cicli un Arduino?

Il clock è a 16MHz, contando in circa 0.85 microsecondi il tempo della digitalWrite (diciamo circa 12 cicli clock), 16 uscite le porti a HIGH in circa 12 microsecondi. A voler abbondare diciamo 20 microsecondi.

Non so a quale applicazione tu stia lavorando ma se non si possono considerare "contemporanei" questi (tanto più per dei LED!)... :wink:

Sto lavorando ad un progetto per schede I/O per utilizzo industriale dove non ho mai 16 sole uscite ma sempre sulle 200 e oltre attive anche in simultanea, quindi con una accensione diretta.

gpb01:
Studiare QUI ...

Guglielmo

La tecnica della manipolazione dei registri del microcontrollore la conosco e la uso ma so che un registro è formato da 8 bit e quindi in questo caso posso aggiornare al colpo 8 pin digitali.

Ma se devo aggiornare tutti i pin digitali di Arduino MEGA verranno settati 8 alla volta e non tutti insieme.

Devo capire se è possibile avere un out perfettamente parallelo senza latenza continua e non per ogni pin o blocco (byte) ma solo iniziale ovvero Scrittura e poi LATCH.

Sennò vado di registri PIPO (FFD) esterni cosi poi con il CK in comune visualizzo al colpo tutte le uscite nello stesso istante scritte in precedenza.

MizzardNet:
Sennò vado di registri PIPO (FFD) esterni cosi poi con il CK in comune visualizzo al colpo tutte le uscite nello stesso istante scritte in precedenza.

Buona questa, NON hai altre possibilità.

Guglielmo