Quanti MIPS per un arduino UNO/Nano ?

Ciao gente,
Curiosità che non ho trovato la giusta risposta.
Se il quarzo è a 16 MHz, il clock di sistema è diviso per 12? Allora fanno 1,33 MIPS, se fa una istruzione a ciclo?
Oppure il clock interno è diviso per 8 ?

Nella prima pagina del datasheet: "Up to 20 MIPS Throughput at 20MHz"

ExperimentUno:
Se il quarzo è a 16 MHz,

Con il clock a 16 MHz il numero di mips medio è circa 8, quello di picco è 16, molte istruzioni degli AVR richiedono due cicli macchina, un discreto numero 3 o 4, per questo motivo il valore medio è circa 1/2 del clock.

Ma la CPU non è direttamente connessa all' ingresso dell' oscillatore. In Arduino UNO come è programmato System Clock Prescaler e a quanto va la CPU?

Sono venuto a capo di questa curiosità per capire quanto tempo potevo spendere tra due interrupts e a quale massima frequenza degli interrupts.
Ovvero sto tentando un bit banging per simulare un encoder in quadratura con un display LCD attaccato. Sper(av)o di arrivare a 5 KHz.

ExperimentUno:
In Arduino UNO come è programmato System Clock Prescaler e a quanto va la CPU?

Se usi il prescaler, su Arduino è settato a 1 di default, ovviamente riduci il clock della CPU, solo potenze di 2 da 1 fino a 256, però rimane sempre valida la regola che il valore medio di mips è circa 1/2 del clock.
Se devi emulare un encoder in quadratura lascia perdere l'emulazione software, fallo usando il timer a 16 bit, è l'unica via per ottenere un risultato decente.
Molti mesi fa avevo scritto del codice per la simulazione degli encoder per un altro utente che aveva bisogno di un emulatore, se ritrovo il topic ti metto il link.

Trovato, leggiti questa discussione dovi trovi anche il codice per emulare gli encoder in quadratura tramite timer.

Avevo trovato la prima discussione, ma anche lì è un semplice abbozzo. Ho capito come funziona e ho presentato un altro topico.
I metodi possono essere di usare microsecond() con una piccola variante, di chiamare la funzione ciclicamente con un piccolo ritardo che esegue una rotazione dei bit. Oppure quella di sottoporla ad interrupt di un timer, io ho trovato FlexiTimer2 (mi permette di variare il periodo di interrupt). Il secondo (metodo con interrupt) garantisce la priorità sulla esecuzione della funzione senza ritardi, al massimo sono le altre a ritardare.

Comunque per questo topico, ho risolto la domanda.

ExperimentUno:
Avevo trovato la prima discussione, ma anche lì è un semplice abbozzo.

Abbozzo ?
Io ho messo un codice completo e perfettamente funzionante per l'emulazione degli encoder in quadratura, poi se servono altre cose è compito tuo aggiungerle. :slight_smile:

OK, scusa il termine. Il codice fa una cosa semplice.

ExperimentUno:
Il codice fa una cosa semplice.

Fa quello che deve fare, lo fa molto bene, ed quello che era stato richiesto in quello specifico topic, ovvero fa anche quello che serve a te se devi emulare un encoder in quadratura, ovviamente fa solo la parte emulazione, altre cose le devi aggiungere tu.

Non sono a sminuire tale codice. sono io che dovrei arrangiare qualcosa in più.
Per stare in topico, ho capito come si può programmare il multiplexer per avere anche la CPU al massimo. Io avevo notato che c'è un prescaler a 8, ma quella è l' impostazione di fabbrica.

Gli AVR vergini arrivano con i fuse settati per il clock rc interno, 8 MHz, con prescaler 1:8, pertanto vanno un MHz, se lo devi usare con il quarzo devi cambiare i fuse, puoi usare quelli di Arduino che prevedono il clock quarzato con prescaler 1:1.