Velocità arduino

Salve ragazzi, mi vorrei togliere una curiosità ma non ho mezzi per fare la misurazione perciò chiedo a voi, magari è una cosa nota.
Sappiamo che l'arduino lavora a 16MHz ma quanto è veloce ad esempio la funzione digitalWrite?
Con uno sketch del genere

void loop()
{
  digitalWrite(pin,HIGH);
  digitalWrite(pin,LOW);
}

che frequenza avrà il segnale in uscita?
Grazie a tutti

Non so se siamo sulla frequenza del pwm, intorno a 4-500 Hz, la prossima volta che vado in lab faccio la misura.
Tieni però presente che questa NON è la massima frequenza generabile dal micro; agendo sui TIMER è possibile arrivare a valori molto più elevati, quando facevo i test per la barriera infrarossi, Astro mi fornì due righe di codice per generare senza problemi i necessari 38KHz. Tanto per completare il discorso ormai dovrebbe essere noto che basta settare un bit del Low Fuse per avere sul pin ckout del micro la stessa frequenza del clock.

Grazie per la risposta, sapevo del fuse CKOUT ma questo di per sé non permette di variare la frequenza del segnale. La mia era solo una curiosità, giusto per sapere

Credo che fare un digitalWrite HIGH/LOW generi una frequenza ben superiore ai 490 kHz del segnale PWM considerando appunto che la digitalWrite occupa poche decine di cicli di clock essendo un'operazione relativamente semplice (si tratta di manipolare qualche registro per attivare lo stato di un GPIO).

La digitalWrite, e la digitalRead, richiedono circa 2us per essere eseguite, se ne metti due in fila in un loop eterno ci vogliono circa 5 us per eseguire l'intero ciclo, il risultato finale è che ottieni un'onda rettangolare con un fronte che dura circa 2 us e uno 3us, alla fine la frequenza out è attorno ai 200 kHz.
Utilizzando la scrittura diretta dei registri, p.e. tramite le macro cbi e sbi, servono solo due cicli macchina per cambiare lo stato del pin, ovvero 125 ns, in questo caso il risultato finale è che hai un fronte che dura solo 125ns e uno che dura poco meno di 1us per via del tempo richiesto per la gestione del loop, frequenza attorno ai 900 kHz.

Immaginavo richiedessero meno tempo. La differenza fra avere un DSO e non averlo... :sweat_smile:

Avete qualche schermata da Oscilloscopio?

astrobeed:
La digitalWrite, e la digitalRead, richiedono circa 2us per essere eseguite, se ne metti due in fila in un loop eterno ci vogliono circa 5 us per eseguire l'intero ciclo, il risultato finale è che ottieni un'onda rettangolare con un fronte che dura circa 2 us e uno 3us, alla fine la frequenza out è attorno ai 200 kHz.
Utilizzando la scrittura diretta dei registri, p.e. tramite le macro cbi e sbi, servono solo due cicli macchina per cambiare lo stato del pin, ovvero 125 ns, in questo caso il risultato finale è che hai un fronte che dura solo 125ns e uno che dura poco meno di 1us per via del tempo richiesto per la gestione del loop, frequenza attorno ai 900 kHz.

se al posto del loop si usa un while non si risparmia qualcosa?

Per velocizzare puoi saltare il digital write e scrivere direttamente sulla porta.
Non ricordo i comandi però. =(

EDIT:
--> http://www.skpang.co.uk/blog/archives/323