Clock

Ciao a tutti,
sono nuovo e volevo fare un paio di domandine semplici, forse stupide :-/, la cui risposta però non riesco a trovare:
-con che frequenza sono controllati i pin? sia quelli analogici che quelli digitali.
-posso al minimo fare delayMicroseconds(1)?

Grazie

E' il programmatore (cioè tu) che decide quando controllare ingressi e/o uscite. Chiaramente il ciclo minimo che potrai considerare è dato dalla velocità dell'oscillatore (in questo caso abbiamo un quarzo da 16Mhz), e dalla durata di ciascuna istruzione utilizzata prima di interrogare/modificare lo stato dei "pin" (cosa però che puoi verificare e controllare solo in assembler). Poi ci sono le funzioni interne (timer, seriali, ecc) e gli interrupt esterni, che invece ti permettono di eseguire alcune utili azioni indipendentemente dal programma e anche in modo asincrono, ma che comunque il programma deve prevedere, configurare e gestire. Per comprendere a fondo le potenzialità di un sistema a microprocessore, è necessario dare uno sguardo al relativo datasheet, dove è riportato anche tutto quello che serve per avere la completa risposta al tuo quesito. (il link del datasheet è qui:http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf ) Purtroppo è in inglese, e qui occorre uno sforzo di buona volontà per capirlo, perchè senza la comprensione del datasheet difficilmente riuscirai mai ad ottenere risultati...

Dimenticavo: da quello che ti ho scritto sopra dovresti aver già avuto la risposta alla tua seconda domanda, cioè che è possibilissimo continuare a controllare un pin anche con il tempo minimo previsto dalla funzione delayMicroseconds( n ) .. ;)

Grazie per le info. Avevo già scaricato il datasheet e gli avevo dato un’occhiata. Però (pag 28) ho visto che ci sono vari clock e mi erano venuti i dubbi: lui gira a 16 MHz, ma quando fa INPUT o OUTPUT usa clk_io (per i piedini esterni?) oppure clk_adc (se uso i piedini analog in?)?, ovvero che l’aggiornamento dello stato su detti piedini avvenga a frequenza diversa…? probabilmente studiando il datasheet lo scoprirò, ma mi piaceva “sentirmelo dire” :wink: e soprattutto sapere come l’interfaccia “C-like” maschera queste cose. Si può vedere la traduzione assembler del programma? Mi pare di no ma sarebbe una funzionalità interessante da offrire alla comunità.
Sono questioni che per ora non sono legate a esigenze reali, mi sto solo guardando in giro: ho visto un ragazzo su playground che lo faceva comunicare con un mouse e tutto ciò potrebbe essermi utile sapere

grazie

Considera che il modo in cui arduino accede ai piedini è meno rapido di quello che c’è scritto
sul datasheet.

Arduino usa una tabella interna per vedere a che PORT/PIN corrisponde un certo piedino e questo
fa perdere del tempo. se hai bisogno di temporizzazioni precise al microsecondo devi accedere alle porte
direttamente.

Ricorda inoltre che ci sono degli interrupt ogni millisecondo che possono sfasare i tempi…

massimo

se hai bisogno di temporizzazioni precise al microsecondo devi accedere alle porte direttamente.

Per ora è solo per curiosità, ma come si farebbe con il software "base" che è su questo sito? C'è il verso di "arrivare" all'assembler?

Considera che il modo in cui arduino accede ai piedini è meno rapido di quello che c'è scritto sul datasheet.

Ma questo è dovuto al fatto che effettivamente è utilizzato un clk_io diverso? Comunque, penso soprattutto agli analog in/out, probabilmente la conversione da dato analogico a digitale avviene ad un rate più basso..suppongo ::)

il compilatore C che sta sotto arduino ha gia mappato le port su variabili che
si chiamano PORTB, PORTC , PORTD etc

per arrivare all’assembler volendo basta usare asm(" "); tipo
asm volatile(“nop\n\t”
“nop\n\t”
“nop\n\t”
“nop\n\t”
::);

http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

per la secoda domanda no il clock è sempre lo stesso… solo che ogni volta che fai rifetimento a un piedino con
digitalRead o digitalWrite la porta e il bit giusto vengono ricercati dentro a una tabella e questo porta via tempo

massimo

Ok, grazie per le info!

Sono sempre io. In definitiva, forse sono arrivato ad una questione cruciale riguardo al clock: se usassi gli ingressi analogici del ucontrollore per leggere un segnale captato da un microfono (supponiamo già elettricamente adattato) quale frequenza di campionamento massima posso considerare (prescindendo dal fatto che l'orecchio umano non risponde oltre i 20khz)? Il limite è determinato dal microfono stesso?

grazie

no :)

il limite è arduino che comunque ci mette del tempo a fare la conversione AD e poi il fatto che non c'è molto spazio per memorizzare i dati.

massimo

Io sono arrivato ad una velocita' massima 1kherz acquisendo un unico canale analogico senza inviare i dati alla seriale.

Ganzo! finalmente ho un limite effettivo della banda passante ;D !

Invece che mi dite del DO? supponendo di avere un codice che fa solo su e giù su un pin usando digitalWrite che frequenza riesco a ottenere? forse è più veloce usare l'istruzione shiftOut? Ovviamente non ho ancora arduino se no farei il test ;)

Grazie ciao Alessandro

Io sono arrivato ad una velocita' massima 1kherz acquisendo un unico canale analogico senza inviare i dati alla seriale.

Ehm.. io avevo aperto una discussione qui http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1216669939 appunto su frequenze di campionamento max, etc...

  • l'hai tenuta per quanti campioni? il limite dovrebbe essere il kilobyte di ram, quindi meno di 1000 campioni, meno di un secondo, giusto?
  • con che incertezza sei arrivato a quella misura di frequenza massima di campionamento? quant'è preciso, nel tempo, il delay tra un campione e l'altro?

Ale914

Guarda che nel forum trovi un po di articoli di uno che usava un piedino con attaccata un'antenna per trasmettere sulle onde medie... una mezza porcata ma la frequenza teorica è di qualche megaherz (il clock è 16 MHz e credo che tutte le istruzioni del processore eseguano in 1 ciclo di clock perciò ne hai...)

per operazione ripetitive meglio imparare come funzionano i timer, caricarli e lasciarli andare mentre il processore fa altro..

massimo

Ale914 una mezza porcata ma la frequenza teorica è di qualche megaherz (il clock è 16 MHz e credo che tutte le istruzioni del processore eseguano in 1 ciclo di clock perciò ne hai...)

per operazione ripetitive meglio imparare come funzionano i timer, caricarli e lasciarli andare mentre il processore fa altro..

wow, in termini di frequenza di campionamento allora si sale parecchio, ma rimane allora il problema sul numero di campioni massimo memorizzabili temporaneamente in RAM prima di poterli trasmettere al PC sulla seriale...

mi dai qualche spiegazione in più circa i timer? mi basta solo qualche riferimento poi mi arrangio a cercare in google, ma così non ho capito se intendi qualcosa interno all'arduino, o altri chips

Grazie

Dentro all'arduino ci sono un certo numero di componenti hardware noti come Timers

questi in realtà sono dei contatori che possono essere programmati per fare un po di tutto: * contare impulsi in arrivo su un piedino * misurare frequenze * generare forme d'onda (questo viene usato dall'hardware PWM per generare i segnali) * generare interrupt at intervalli regolari etc etc

nel sorgente di arduino c'è una sezione legata ai timer dove trovi un po di tutto

googolando ho trovato http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106 http://members.shaw.ca/climber/avrtimers.html http://winavr.scienceprog.com/avr-gcc-tutorial/program-16-bit-avr-timer-with-winavr.html http://www.scienceprog.com/two-avr-gcc-examples-of-using-avr-8-bit-timers/

è da molto tempo che vorrei scrivere una libreria per incapsulare il funzionamento dei timers.. magari qualche programmatore scafato che ci legge potrebbe prenderesene carico :)

massimo

Grazie mille per i link.

Però non ho capito il nesso con il resto dei post. I timer lavorano in digitale su impulsi e tempo, quindi nulla a che vedere con campionamento di segnali analogici.