E' possibile effettuare piu' letture digitali o analogiche contemporaneamente?

Ciao a tutti ragazzi. Sto lavorando con un protocollo di comunicazione. Avrei bisogno di capire se è possibile effettuare piu' di una lettura analogica o digitale contemporaneamente, perchè visto che lavoro su tempi ristretti, effettuandole a cascata non avrei il risultato sperato...

Le porte digitali puoi leggerle contemporaneamente semplicemente accedendo al registro relativo ad una determinata porta. Vedi:

http://www.arduino.cc/playground/Learning/PortManipulation

Le analogiche non credo perché ogni porta ha bisogno di un certo lasso di tempo per effettuare una conversione analogico/digitale

Le analogiche NO. c'é un unico ADC con un Multiplexer. percui puoi fare una conversione alla volta.
Digitali: se sono sullo stesso Port sí, se sono su diversi Port allora con un po di ritardo:

la suddivisone dei Port sul ATmega:
B (digital pin 8 to 13)
C (analog input pins)
D (digital pins 0 to 7)

Ciao Uwe

Penso che le letture digitali siano lette da un unico shitf register, il quale shift è costruito da pinMode per assegnare lo shift pone dati in d'uscita e quello che riceve dati o ingresso mentre per quelle analogiche richiede tempo per la conversione DAC o ADC che non ricordo mai

Etti:
Penso che le letture digitali siano lette da un unico shitf register, il quale shift è costruito da pinMode per assegnare lo shift pone dati in d'uscita e quello che riceve dati o ingresso mentre per quelle analogiche richiede tempo per la conversione DAC o ADC che non ricordo mai

Eh? :cold_sweat:

Le porte I/O dell'Atmega non sono shift register. Sono indirizzi di memoria di byte in cui sono mappati i bit dei singoli pin. Ogni byte contiene 8 bit per cui controlla 8 porte. Ogni porta logica dell'Atmega necessita di 3 byte:
DDRx: indica la direzione dei dati sui pin
PORTx: contiene lo stato del segnale sui pin impostati in uscita
PINx: contiene lo stato del segnale sui pin impostati in ingresso

Leggendo il registro PINB, ad esempio, leggi lo stato di tutti i pin collegati alla porta B (ossia dall'8 al 13).

leo72:
Leggendo il registro PINB, ad esempio, leggi lo stato di tutti i pin collegati alla porta B (ossia dall'8 al 13).

Aggiungiamo pure che se usi la DigitalRead(), o la DigitalWrite(), per via del peso dovuto al C++ occorrono circa 2 us per leggere/scrivere un singolo bit, se lo fai indirizzando direttamente il registro occorrono solo 62.5 ns per leggere tutti gli otto bit e altri 62.5ns per l'eventuale mascheratura per isolare un singolo bit, totale 125 ns per leggere/scrivere un singolo bit :).

per la cronaca:
Per scrivere un singolo bit serve leggermente di piú tempo se vuoi mantenere lo stato dei altri bit. Devi prima leggere il port, modificare il bit che Ti interessa e poi scrivere il port. In linguaggio macchian somo 3 istruzioni percui 187,5nsec.
Ciao Uwe

uwefed:
Per scrivere un singolo bit serve leggermente di piú tempo se vuoi mantenere lo stato dei altri bit. Devi prima leggere il port, modificare il bit che Ti interessa e poi scrivere il port. In linguaggio macchian somo 3 istruzioni percui 187,5nsec.

Se a software lavori indirizzando direttamente i registri sicuramente sai già il valore di tutti bit in output pertanto per modificare un singolo bit non hai bisogno di leggere prima la porta, usi il valore precedente, lo mascheri in and o or a seconda se devi scrivere 0 o 1 e poi aggiorni la porta, sei obbligato a leggere solo se non conosci il valore precedente assegnato alla porta.