Pages: [1]   Go Down
Author Topic: Velocità arduino  (Read 959 times)
0 Members and 1 Guest are viewing this topic.
Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2272
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
void loop()
{
  digitalWrite(pin,HIGH);
  digitalWrite(pin,LOW);
}
che frequenza avrà il segnale in uscita?
Grazie a tutti
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2272
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 329
Posts: 22782
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9468
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 329
Posts: 22782
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Avete qualche schermata da Oscilloscopio?
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2387
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per velocizzare puoi saltare il digital write e scrivere direttamente sulla porta.
Non ricordo i comandi però.  smiley-cry

EDIT:
--> http://www.skpang.co.uk/blog/archives/323
« Last Edit: September 08, 2012, 01:17:10 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: