Go Down

Topic: cronometro (Read 2687 times) previous topic - next topic

javilolo

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()...

chiva

Si puedes usar timers, será mucho más preciso y si lo haces en ensamblador también mucho mejor
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

javilolo

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?

Igor R

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.

chiva

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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Igor R

#5
Nov 29, 2010, 09:52 pm Last Edit: Nov 29, 2010, 10:26 pm by igorreal Reason: 1
Si se puede.... ;)
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.

javilolo

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.

Igor R

#7
Nov 30, 2010, 12:10 am Last Edit: Nov 30, 2010, 12:14 am by igorreal Reason: 1
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.... ;)





javilolo

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

javilolo

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

Igor R

#10
Dec 01, 2010, 10:14 am Last Edit: Dec 01, 2010, 10:43 am by igorreal Reason: 1
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.


;)

javilolo

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...

flico

Tengo este codigo que encontre en internet y te puede valer

Code: [Select]

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.
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

Go Up