cronometro

Hola a todos.
¿Teneis algún código de un cronometro por ahí para poder orientarme?
Ando buscando por internet pero no veo nada interesante…
No se si usar timers, la funcion millis()…

Si puedes usar timers, será mucho más preciso y si lo haces en ensamblador también mucho mejor

Ok. Una pregunta con respecto al ensamblador. En algunos micros hay que decirle al compilador que el código es estas escribiendo a continuación es ensamblador:(por ejemplo) asm { //código en ensamblador }

He visto un ejemplo por ahí de un cronómetro que usa ensamblador, pero lo pone "a pelo"...¿eso se lo traga el compilador? me refiero, se puede mezclar C con ensamblador?

Hola,

Por detrás de Arduino, todas las funciones son C/C++ y se usa la libreria avrlibc. Puedes ver en la documentación de la misma cómo hacer ésto: http://avr-libc.nongnu.org/user-manual/inline__asm.html

A parte de otras tantas funciones implementadas de C.....

Saludos, ;)

Igor R.

Haciendo una simple búsqueda de google con "arduino ensamblador" vemos en este mismo foro que el IDE de Arduino no acepta ensamblador: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1195141905/1

Un saludo

Si se puede… :wink:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1257722764
(ahi tienes uno de los ejemplos en ensamblador)

Alguna vez he usado asm volatile (“nop”); sin ningun problema para realizar delays.

Al final, por detrás es GCC + libreria avrlibc. Otra cosa es que Wiring=lenguaje Arduino no lo tenga como función básica. Todas las funciones de Arduino (Wiring) estan realizadas por detrás con funciones C/C++ de la libreria avrlibc que puse el link en mi post anterior.

Es lo mismo que otras funciones de C, que puedes utilizar como itoa, atoi, strcmp, funciones de sleep,de interrupciones, … (ninguna de momento esta dentro del lenguaje Wiring-Arduino).

Sacado de http://arduino.cc/en/Reference/HomePage
"The Arduino language is based on C/C++. It links against AVR Libc and allows the use of any of its functions; see its user manual for details. "

Es más, si abres en la carpeta core de Arduino, el archivo wiring.c, podrás ver que la función void delayMicroseconds(unsigned int us) usan ensamblador.

Salu2!

Igor R.

Gracias por las respuestas. Supongo que el juego de instrucciones del micro están en su datasheet. Le echaré un vistazo, pero supongo que podrás acceder a los registros del micro directamente con ensamblador. Gracias de nuevo.

En C también puedes acceder a los registros del micro.

Aquí puedes encontrar un buen tutorial sobre los timer de atmel: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106

Yo creo que puedes hacer un cronómetro en C. Vaya! no se de que precisión estamos hablando.... ;)

Efectivamente, no necesito mucha precisión (centésimas de segundo sería más que suficiente, pero con décimas ya me apaño.

Al final utilicé la función millis() y me va bien. Gracias por vuestros aportes.

Perfecto!!!

Puedes aumentar la resolucion de millis(microsegundos en vez de milisegundos), si lees directamente el registro del contador usado por la funcion millis() (Timer 0):

extern volatile unsigned long timer0_overflow_count;

unsigned long ticks, microseconds;

ticks=(timer0_overflow_count << 8) + TCNT0
microseconds= ticks*4

No estoy seguro si en las ultimas versiones de Arduino han cambiado la funcion millis, pero esto es algo que utilice hace algun tiempo y me funcionaba muy bien.

:wink:

Gracias por tu aporte. Es interesante pero no necesito tanta precisión. Además, tengo que poner el valor en una pantalla LCD 4x20 y ya no me queda hueco...

Tengo este codigo que encontre en internet y te puede valer

int sensi= 2;    // sensor de inicio
int sensf = 3;  // sensor de fin 
unsigned long tiempoi;  // tiempo de inicio de medicion
unsigned long tiempot;  // diferencia de tiempo del movimiento
void setup()
{
  pinMode(sensi,INPUT);
  pinMode(sensf, INPUT);

  Serial.begin (9600);  
}
void loop()
{   
  if (digitalRead(sensi)==0)
  {                
    tiempoi=millis();
    while (digitalRead(sensf)==1)  { Serial.print ("midiendo");}
    tiempot=(millis() - tiempoi);
   Serial.print("Tiempo:");
   Serial.println(tiempot);     
         
   }
      
}

Saludos.