Go Down

Topic: Pin Digitali I/O con funzione Update (Read 257 times) previous topic - next topic

MizzardNet

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  :)

gpb01

Search is Your friend ... or I am Your enemy !

docdoc

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!)... ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Claudio_FF

#3
Dec 14, 2018, 06:18 pm Last Edit: Dec 15, 2018, 11:22 am by Claudio_FF
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.

Code: [Select]
void setup() {
    pinMode(9, OUTPUT);
    noInterrupts();
}
void loop() {
    uint8_t static n = 0;
    digitalWrite(9, n);
    digitalWrite(9, n);
    n = !n;
}
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

MizzardNet

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!)... ;)

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.

MizzardNet

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.

gpb01

#6
Dec 14, 2018, 10:05 pm Last Edit: Dec 14, 2018, 10:05 pm by gpb01
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
Search is Your friend ... or I am Your enemy !

Go Up