Show Posts
Pages: [1]
1  International / Español / Re: Tengo una duda sobre arduino on: January 26, 2012, 10:19:58 am
Es normal, ya que se trata de entradas de alta impedancia. Puedes usar ese fenómeno para generar números pseudoaleatorios:

randomSeed(analogRead(0));
2  International / Español / Re: Velocidad de ejecución de instrucciones on: January 21, 2012, 02:03:06 pm
Os ha quedado un post muy interesante me lo guardo para mis alumnos.
Para poner solucionado tienes que editar el primer post del hilo y escribir solucionado en el titulo.

Gracias, ionhs.
3  International / Español / Re: Velocidad de ejecución de instrucciones [Solucionado] on: January 15, 2012, 01:23:48 pm
Hola fm.

He probado tu código y es más rapido, ya que el bucle for tarda sólo 2 ciclos de reloj en retornar que la funcion loop que tarda 10.

Code:
int testPin =  12;

void setup() 
{               
  pinMode(testPin, OUTPUT);   
}
void loop()                   
{
  for(;;)
  {
    PORTB = 0b00010000;
    PORTB = 0b00000000;
    PORTB = 0b00010000;
    PORTB = 0b00000000;
    PORTB = 0b00010000;
    PORTB = 0b00000000;
  }
}

PD. Leí en las normas del foro que cuando un hilo estaba solucionado había que cambiar el título del hilo añadiendo (Solucionado) pero no he visto cómo hacerlo.
4  International / Español / Re: Velocidad de ejecución de instrucciones (Solucionado) on: January 15, 2012, 12:30:08 pm
Esto ya es otra cosa.
He cargado este código:

Code:
int testPin =  12;    

void setup()   {                
  // initialize the digital pin as an output:
  pinMode(testPin, OUTPUT);    
}

void loop()                    
{
PORTB = 0b00000000;
PORTB = 0b00010000;
PORTB = 0b00000000;
PORTB = 0b00010000;
}

Y ahora sí que el arduino tarda en desactivar y activar el puerto (dos instrucciones) 125 nseg (nanosegundos) que corresponde a una frecuencia de 8 MHz.



Tarda 62,5 nseg (nanosegundos) en ejecutar una instrucción,que corresponde a una frecuencia de 16 MHz.
Desde que acaba de ejecutar la última instrucción y vuelve a la primera del bucle gasta 10 ciclos de reloj, 625 nseg (nanosegundos).
Se ve un rizado a lo largo de la señal de 32MHz, el doble del oscilador, no sé si es normal o nó. Tambien he comprobado que en los otros puertos que tendrían que estar a 0 se cuela un poco de la señal del puerto 12.

Gracias a todos por la ayuda. Me he leido varios manuales del arduino y ninguno hablaba de la gran diferencia que hay entre usar "digitalWrite(ledPin, HIGH)" y "PORTB 0b00010000" .
5  International / Español / Re: Velocidad de ejecución de instrucciones on: January 15, 2012, 10:13:12 am
Perdón. Hasta ahora había programado los PICs directamente en ensamblador y pensé que en arduino la instrucción digitalWrite(ledPin, HIGH) se traducía en una sola instrucción en código máquina. smiley-confuse
6  International / Español / Re: Velocidad de ejecución de instrucciones on: January 14, 2012, 10:36:38 am
Con el código que he metido, el duty que tengo es prácticamente del 50%, luego tarda lo mismo en poner el puerto a 0 que en finalizar la funcion loop(), volver al principio de la función y poner el puerto a 1.
La cuestión es: teniendo una frecuencia de reloj de 16MHz y una instrucción por ciclo de relog, ¿cómo es que no puedo conmutar un puerto a más de 125KHz?. Si puedo, el lunes lo repetiré con un pic 16F84.
7  International / Español / Velocidad de ejecución de instrucciones (Solucionado) on: January 13, 2012, 02:14:41 pm
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:
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
Pages: [1]