Pages: [1]   Go Down
Author Topic: cronometro  (Read 2007 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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,  smiley-wink


Igor R.
Logged


Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si se puede.... smiley-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.
« Last Edit: November 29, 2010, 04:26:16 pm by igorreal » Logged


0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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




« Last Edit: November 29, 2010, 06:14:02 pm by igorreal » Logged


0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 << smiley-cool + 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.


 smiley-wink
« Last Edit: December 01, 2010, 04:43:06 am by igorreal » Logged


0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tengo este codigo que encontre en internet y te puede valer

Code:
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.
Logged

Trabajando en ...

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

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

Pages: [1]   Go Up
Jump to: