Go Down

Topic: Velocità arduino (Read 1 time) previous topic - next topic

pelletta

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
Code: [Select]
void loop()
{
  digitalWrite(pin,HIGH);
  digitalWrite(pin,LOW);
}

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

Michele Menniti

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.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

pelletta

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

leo72

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

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.


leo72

Immaginavo richiedessero meno tempo. La differenza fra avere un DSO e non averlo...  :smiley-sweat:

PaoloP

Avete qualche schermata da Oscilloscopio?
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

lesto


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?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

flz47655

http://www.logicaprogrammabile.it/arduino-uno-pin-speed-test/

PaoloP

#9
Sep 08, 2012, 08:12 pm Last Edit: Sep 08, 2012, 08:17 pm by PaoloP Reason: 1
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
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Go Up