Go Down

Topic: Velocidad de ejecución de instrucciones (Solucionado) (Read 3 times) previous topic - next topic

troglodita

Jan 13, 2012, 08:14 pm Last Edit: Jan 21, 2012, 08:00 pm by troglodita Reason: 1
Hace tres meses que ando enredando con el arduino. Hoy he medido la velocidad máxima de conmutación de una de sus salidas digitales mediante un osciloscopio con este sketch:

Code: [Select]
int ledPin =  12;  
void setup()  
{                
 pinMode(ledPin, OUTPUT);    
}
void loop()                    
{
 digitalWrite(ledPin, HIGH);  
 digitalWrite(ledPin, LOW);  
}


Ya que el micro que lleva, un atmega168, trabaja a 16MHz y utiliza un ciclo por instrucción según el datasheet, pensé que la frecuencia medida en el pin 12 sería de 8MHz pero sólo tengo 125KHz.
Casualmente 125KHz x 64 = 8MHz
He seguido consultando el datasheet y he visto que tiene unos "fuse", el equivalente a la palabra de configuración de los PICs. Hay unos bits CLKPS3..0, que se supone configuran un prescaler aplicado al reloj. ¿Podría ser que el prescaler viene configurado a 64 DEC?.
¿Como puedo acceder a ese dato desde la pantalla Arduino?
El arduino es el que vende Elektor, un friduino igual que el Diecimila pero con el chip de soldadura superficial.

Gracias

chiva

Ten en cuenta que es una llamada a una función, que ya de por si mete un overhead, más luego ejecutar todo el código de dentro de la función que no son dos líneas. En la carpeta del IDE de Arduino tienes el código fuente disponible para ver que hace la función.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

fm

Si quieres algo un pelín más rápido puedes probar con este código:

Code: [Select]
int ledPin =  12;

void setup() 
{               
  pinMode(ledPin, OUTPUT);   
}
void loop()                   
{
  for(;;)
  {
  //  digitalWrite(ledPin, HIGH);
    PORTB = 0b00100000;

  //  digitalWrite(ledPin, LOW); 
     PORTB = 0b00000000;
  }
}


Deberías conseguir una señal de 4MHz con una relación 1/4 entre el tiempo en 1 y 0.
   

chiva

Creo que sacaron hace poco la función DigitalWriteFast, pero todavía no le he echado un vistazo, puede ser interesante
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

PepeChorva

Con lo que dice FM, si copias varias veces las líneas de PORTB (15 o 20c&P), tendrías cerca de los 8MHz (para 2 instrucciones, o sea, los 16MHZ), te saltarías varios overheads de las subrutinas, como dice Chiva.

Es una cuestión de gestionar recursos, si te interesa código muy eficiente, deberias repetir el encender led apagar led millones de veces, para evitar saltos de memoria (que es uno de los factores que hace que no te de la frecuencia del reloj), pero necesitarías una memoria bastante grande.
Por otro lado, si sacrificas un poco de eficiencia en beneficio de ahorrar líneas de código, puedes meter problemas más complejos, a costa de perder un poco de rendimiento.
El truco consiste en jugar con estos dos factores  :smiley-mr-green:
---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

Go Up