PDA

Ver la versión completa : Cronómetro para la GP32



Salustian
03/05/2005, 09:32
Hola,

acabo de empezar a programar para la GP32 y estoy haciendo algo sencillito, un cronómetro. Ya lo tengo casi listo, pero me he encontrado un problemilla... si comparo un minuto medido con mi cronómetro y un minuto de un reloj me da una diferencia de algo más de 2 segundos :shock:

¿Alguien podría decirme si la precisión en la medida del tiempo en la GP32 depende de la configuración de los MHz? (yo la he puesto a 66 MHz)

En caso afirmativo... ¿alguna pista de cómo conseguir la configuración de MHz que me dé la máxima precisión? (hasta el fin de semana no podré hacer pruebas con distintas velocidades en la GP32 y el geepee32 no es fiable en eso)

Un saludo a todos los que formais este fantástico foro.

PD: el tiempo lo mido tomando al iniciar el crono los tick con gettickscounter()
y para actualizar el valor del crono resto ese valor inicial al actual, por lo que no debería aparecer el error por retardos al dibujar ni nada parecido.

PD2: Os adjunto el programilla por si quereis echarle un vistazo.
(cuando lo considere terminado lo liberaré como GPL)

PD3: Las teclas para usar el GPCrono son:

R ó L -> cambiar entre modo cronómetro y cuenta atrás
R + L -> Reset
A -> Iniciar/parar el crono
B -> Checkpoint (con el crono en funcionamiento)
Start -> Crono y checkpoints a cero (con el crono en reposo)
Cruceta -> Modificar valor del crono (con el crono en reposo)

Aiken
03/05/2005, 13:18
efectivamente depende de los mhz!

has elegido programar un tema escabroso :( la gp32 NO tiene reloj interno! por lo cual lo que estas midiendo es ciclos de cpu.

obviamente a mas mhz pues mas ciclos de cpu

asi que tendras que hacer un calculo de cuantos ciclos de cpu son 1seg a los mzh que quieras, en tu caso 66Mhz

supongo que estas usando 1000 ticks = 1 seg

no se si conseguiras que sea preciso tu cronometrogp32 pues vas a depender de lo preciso que sea el tema de los ticks.


CONSEJO. A mas megaherzios hay mas ticks en un segundo asi que podras conseguir mas precision. Pues perderas menos decimales por redondeos que creo que es lo que te esta pasando :)


Eso si, ya sabes que a mas megaherzios se gastan mas pilas, pero bueno ... si quieres un cronometro preciso tendras que usar mas megaherzios para tener mas "unidades de division por segundo (mas ticks) y asi que no se pierdan segundos por redondeo.

Aiken

oankali
03/05/2005, 13:44
Segun este enlace http://www.gp32x.com/board/index.php?showtopic=16038&hl=clock#4 , si que hay un reloj en tiempo real (RTC).
Por lo visto el SDK de Mr. Mirko lo tiene implementado, pero no el SDK oficial.

Oankali

Uncanny
03/05/2005, 14:45
Segun este enlace http://www.gp32x.com/board/index.php?showtopic=16038&hl=clock#4 , si que hay un reloj en tiempo real (RTC).
En esta (http://darkfader.net/gp32/#rtc) web hay un ejemplo del uso del RTC en la GP32, lo malo es que no veo para descargar el código fuente para poder ver como funciona...

oankali
03/05/2005, 15:24
Corrijo lo dicho antes, parece que sí está implementado también en el SDK oficial pero a través de la funciones GpTimer*().

Aquí tienes un test que programé hace mucho para saber si funcionaban las funciones bajo el SDK para Windows.
No sé si te servirá, ya que no lo he probado en la GP32 y no sé que como reacciona con diferentes velocidades de la CPU.

@Uncanny: me había olvidado completamente de este ejemplo de darkfader! Estoy seguro que si le pides el código, te lo dará.

Oankali

Salustian
03/05/2005, 15:44
Gracias a todos por contestar... lo que pensé que sería una aplicación bien sencilla se complica... instalación de interrupciones... ensamblador... tengo el c un poco olvidado y mejor poco a poco.

A ver que consigo hacer para mejorar la precisión.

PD: no useis el progamilla para cronometrar a Fernando Alonso jeje

Oankali, acabo bajarme el fichero que has dejado, lo he compilado con el GCC 4.0 beta de devkit.tk y funciona aparentemente bien en el geepee32. En cuanto pueda lo probaré en la consola a diferentes velocidades. Un saludo e infinitas gracias :)

Salustian
04/05/2005, 08:48
Aquí tienes un test que programé hace mucho para saber si funcionaban las funciones bajo el SDK para Windows.
No sé si te servirá, ya que no lo he probado en la GP32 y no sé que como reacciona con diferentes velocidades de la CPU.
Oankali

Pues según las pruebas que he hecho sí que depende la velocidad; he medido 60 segundos con tu programilla cambiando la velocidad y comparándolo con un cronómetro, y el resultado fue el siguiente:

16MHz -> 1m 3seg.
33MHz -> 31seg.
40MHz -> 51 seg.
66MHz -> 1m.
102MHz -> 20 seg.
133MHz -> 31 seg.
166MHz -> 25 seg.

Claro, con la precisión que dan mis reflejos, que no es mucha.

Probaré con las funciones que me indicas del SDK a 66 MHz, pero por lo que he leido en otros post no tengo muchas esperanzas de mejorarlo demasiado.

De nuevo, muchas gracias por todo.

Un saludo.

bulbastre
14/05/2005, 16:40
¿cómo va el tema?

wOw!
14/05/2005, 16:53
También tienes que tener en cuenta el error cualitativo de lo que tardas en activar y parar el cronómetro ;)

EDIT: Ouch Sorry no había leido arriba

Salustian
18/05/2005, 10:01
Ya he logrado implementar el reloj en tiempo real que sale en el enlace que dejó Uncanny (sobre todo gracias al fantástico makefile de Oankali).

El problema es que solo consigo una precisión de 1/64 segundos, cuando lo deseable sería al menos 1/100.

Estoy pensando ir contando ticks y corregirlos en función del RTC. Por la cuenta de la vieja creo que el error que cometería sería como máximo de 2-3 ms.

Un saludo y gracias por vuestra ayuda.

A ver si saco pronto la versión definitiva :)

oankali
18/05/2005, 10:43
El mérito del Makefile no es mio. De hecho ya lo pone al principio.
Yo solo lo he modificado para mis necesidades (no recuerdo qué modifiqué :)).

Lo de los 1/64 segundos es la limitación que tiene el RTC.
Pero pienso como tu. Si al principio del programa calculas los ticks por segundos reales a través del timer. Luego es cuestión de compaginar el RTC con los ticks y supongo que deberías de conseguir una precisión bastante aceptable.

La idea de este cronómetro es muy interesante. Acoplado con un programa que hice en VB para entrar resultados de carreras se podría conseguir un sistema interesante para las competiciones :)

Cuando tengas acabado tu programilla, ya me gustaría echarle una ojeada al código, como curiosidad.

Oankali

Salustian
25/05/2005, 09:36
Hola,

ya tengo lo que creo es la versión definitiva de mi cronómetro (salvo que alguien encuentre algún fallo que se me haya escapado).

un fichero es el binario, que hay que copiar en el directorio gpmm y el otro es el código fuente. Para compilar este último podeis seguir el tutorial de oankali, creo que solo tendreis que modificar algún path en el makefile.

el crono tiene un error entre 0 y 3 ms (aproximadamente) debido a la sincronización entre los ticks (que no son muy precisos) y el reloj en tiempo real (RTC) de la GP32, que no tiene mucha resolución.

Un saludo al grupo.

PD: para ayuda pulsar Select.

doble-h
25/05/2005, 10:00
ahora lo provare a ver k tal

oankali
01/06/2005, 10:42
Bueno, me he tomado un momentito y me he mirado el programa.
La verdad es que me ha gustado. No está nada mal.
En cuanto al código, pues que lo encuentro un poco confusillo. Lo digo sobretodo por ese mega GpMain() que lo incorpora casi todo.
Hay muchos comentarios, eso sí, no me puedo quejar :)
Aún así, tendrías que intentar partir tu código en varios módulos.
Yo por ejemplo pondría la gestión de la ayuda aparte (aunque solo sea el enseñar una pantalla). Supongo que si lo has hecho así es porqué así es más fácil mostrar la ayuda mientres sigue corriendo el crono. Pero se puede hacer.
Toda la preparación de la pantalla también la prepararía en otra función.
Y puede que los cálculos de ajuste del crono entre el RTC y los ticks también los pondría en otra función.

Por cierto, he encontrado interesante tu enfoque sobre la gestión de los botones. Aunque me parece que para una cosa tan sencilla, se hace un poco complicado. Y yo le he echado a faltar la gestión de la repetición cuando dejas el botón apretrado al cambiar los dígitos. Ya sabes, el primer cambio inmediato, el segundo al cabo de 400ms por ej., y los siguientes al cabo de 100ms.

Nada, solo eran unos comentarios.
Sigue adelante que tiene todo un aspector muy pulido.
A ver que sacas la próxima vez ;)

Oankali

Salustian
10/06/2005, 17:45
Pues muchísimas gracias Oankali, por echarle un vistazo. Y también por tus comentarios. Quizás encuentres mi código un poco confuso debido a que me dedico profesionalmente a programar autómatas industriales, servomotores y demás cacharros, y tengo muchos "vicios" del tipo de programación que se usa en estos menesteres (redes de petri, grafcets, etc).

El control de los botones es solo el principio de una idea más amplia en la que pretendo incorporar todo lo que mencionas.

Me encanta entrar (casi) a diario en gp32spain y encontrar gente maja como tú.

Un saludo y a seguir programando.