Autor Tema: Metrónomo musical  (Leído 4240 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
Metrónomo musical
« en: 30 de Enero de 2005, 21:34:00 »
Hola a todo el mundo,

estoy intentando programar un metrónomo musical mediante la interrupción del TIMER0 del 16F84, el metrónomo debe encender y apagar un led a la frecuencia determinada por el usuario (de 40 pulsos por minuto a 240 pulsos).
Ya he hecho alguna prueba programando en C, pero la verdad es que retrasa bastante, alrededor de unos 20 pulsos por minuto.
¿Que puedO hacer para que la temporización sea lo más exacta posible?

Gracias de antemano!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Metrónomo musical
« Respuesta #1 en: 31 de Enero de 2005, 10:10:00 »
Echale un ojo al ejemplo que puse en el enlace a ver si calculaste bien la temporización:

http://personal.auna.com/asencio5/Ejemplos%20C/TIMER/

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Metrónomo musical
« Respuesta #2 en: 31 de Enero de 2005, 18:31:00 »
Hola Modulay, muchas gracias por tu ayuda.
He visto el enlace, y tengo bien calculada la temporización.
Tengo cargado el timer con 225,Pre-escaler a 32 y la interrupción la hace cada 992us.
Hasta aquí todo bien, el problema es que para un tempo de 120 pulsos por minuto (60seg/120ppm=500ms), necesito generar unas 500/992us=504.0322.. ,redondeando 504 interrupciones para conseguir un pulso de 500ms. O sea, que ya retrasa. Y la verdad, es que se nota en cuanto pasan unos 10 pulsos.
La verdad,es que no sé como conseguir una temporización lo más exacta posible para todo el rango de valores del tempo (40 a 240 ppm). Creo que el problema viene que al llamar tantas veces a la rutina de interrupción el error generado es aún mayor. Si me puedes echar una mano te lo agradecería muchísimo.

Un saludo!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Metrónomo musical
« Respuesta #3 en: 31 de Enero de 2005, 20:06:00 »
Segun las cuentas me sale que usas un cristal de 4 MHz.
Esto implica que tendremos que buscar una temporizacion que sea multiplo de 4 us (si el cristal fuera de 10 MHz en este caso no haria falta) y a la vez submultiplo exacto de 1 segundo.
Tomamos 2 ms como referencia,por ejemplo(multiplo de 4 us y submultiplo de 1 seg:

2 ms =  4*32*(256-valor_de_carga) / 4 MHz => valor de carga = 62.5

...si salen decimales,es que el preescaler es demasiado grande.Probamos con preescaler 4:

2 ms =  4*4*(256-valor_de_carga) / 4 MHz => valor de carga = 500

...demasiado grande,el preescaler debe ser algo mayor:


2 ms =  4*8*(256-valor_de_carga) / 4 MHz => valor de carga = 250

Con preescaler 8,valor_de carga 250 y cristal a 4 MHz tienes una interrupcion cada 2 ms exactos.

Todo esto es muy bonito si,pero me acabo de dar cuenta que para 40 ppm o para 240 ppm va bien,pero para todo el rango que necesitas cubrir no vale.
La unica solucion que veo es usar la menor temporizacion posible,que para 4MHz es de 1us,y mejor ponerle 10 us para que te de tiempo a ejecutar lo que necesites (que sea mas bien poco) entre una iterrupcion y la siguiente.De esa forma seguira habiendo un pequeño error,pero del orden de los pocos us.Con esa latencia del orden de los us no hay cambio de ritmo perceptible,creeme.
Otra posible solucion pero bastante engorrosa seria reconfigurar el timer para cada velocidad concreta.Es decir,para 40 ppm establecemos una temporizacion de 2 ms por ejemplo con preescaler 8 y valor de carga 250...para 61 ppm ya deberias establecer otra temporizacion que fuese divisor exacto del tiempo por pulso en segundos,y en funcion de tu cristal de 4 MHz,estimar el valor del preescaler y calcular el valor de carga.Esto deberia hacerse para todo el rango de 200 valores (De locos!!!),asi que seria buena idea implementar un algoritmo que calcule los parametros de reconfiguracion del timer en funcion de las ppm que le pongas.De todas formas,ni asi la temporizacion iba a ser perfecta...para 70 ppm el tiempo por pulso es de 70/60 = 1.16666666666666... segundos....
Por cierto,si le pones al pic un cristal mas rapido,mejor que mejor.
Suerte




Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Metrónomo musical
« Respuesta #4 en: 01 de Febrero de 2005, 06:55:00 »
Para lograr una temporizacion asi como la que quieres tu unico camino es programar en ensamblador y olvidarte de C.
En ensamblador se sabe perfectamente el tiempo que toma cada instruccion por lo que permite realizar una temprorizacion mucho mas exacta.
He realizado algunos programas para controlar tiempo parecido al que pretendes y te puedo decir que programar algo asi en C es solo un quebradero de cabeza.


Salud2

 

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Metrónomo musical
« Respuesta #5 en: 01 de Febrero de 2005, 08:43:00 »
Gracias Modulay y Kruskal.

Estoy hecho un lío, ya no sé qué probar con C para que pueda ser lo más exacto posible. Si bien con los 2 ms de que hablabas Modulay sale perfecto, supongo que para un tempo de 40 ppm, son 60/40=1.5seg/2ms=750 int. Pienso que demasiadas para no perder mucho tiempo en el camino, y si pongo una temporización de 1us para ajustarlo aún más, mucho peor, más interrupciones por pulso.

La idea de Kruskal, ya la había pensado en algún momento, pienso que si sé lo que tardo en entrar y salir del bucle hacia la interrupción, podré ajustar mucho más el número de interrupciones. Además, creo que todo el proceso irá más rápido, y si además le pongo un cristal de 20MHz, mejor, no?
Pero el problema está que no tengo mucha idea de ensamblador. De todas formas, habrá que aprender...

Dónde podría encontrar un manual, repertorio de instrucc, compiladores, etc. para empezar con ensamblador a programar el metrónomo??

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Metrónomo musical
« Respuesta #6 en: 02 de Febrero de 2005, 04:37:00 »
Mira este post, quiza te ayude: http://miarroba.com/foros/ver.php?foroid=6510&temaid=3132687  

Un saludo

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Metrónomo musical
« Respuesta #7 en: 04 de Febrero de 2005, 07:43:00 »
Gracias Pocher!

No se me había ocurrido la idea de no recargar el TMR0, dejándolo correr por si solito, es una buena manera de hacer la temporización lo más precisa posible.Y, sin entrar en la interrupción...yo creo que si que debería de funcionar, o por lo menos, con menos error.

Me pondré manos a la obra.

Gracias!