Autor Tema: Hay una manera de contar los ciclos que ha gastado el PIC?  (Leído 2965 veces)

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

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Hay una manera de contar los ciclos que ha gastado el PIC?
« en: 06 de Mayo de 2013, 12:57:13 »
Saludos..

Si alguien es tan amable, podría por favor ayudarme con esta duda... Tengo un programa en asm, pero necesito guardar en un registro la cantidad de ciclos que ha consumido el PIC realizando una subrutina. Por ejemplo, si tengo un programa que al pulsar un botón 1 me llame una rutina A, y al pulsar otro botón me llame una rutina B que es más larga que la A, quisiera que al retornar de una u otra rutina, me guarde en un registro la cantidad de ciclos que se ha consumido.

Otro ejemplo podría ser que tenga un contador que al pulsar un botón incremente o decremente un registro. Si el registro tiene guardado un 5, al realizar el descuento el PIC consumirá menos tiempo que si tuviera 40. ¿Cómo consigo yo saber cuánto tiempo ha perdido el PIC descontando, y que dicho valor lo tenga disponible en un registro de memoria o en W?

Gracias de antemano, si no me expliqué bien me hacen saber, por favor... Buenas tardes...
« Última modificación: 06 de Mayo de 2013, 13:04:00 por romarco »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #1 en: 06 de Mayo de 2013, 13:07:55 »
Hay varias formas.

La más sencilla sería seguramente utilizando el Simulador del MPLAB, que te permite mediante el StopWatch controlar la cantidad de ciclos ejecutados, y mediante Breakpoints podrías seguramente enseguida saber con precisión la cantidad de ciclos consumidos.

Por otra parte, también podrías intentar hacer algo utilizando por ejemplo un Timer del mísmo micro, que puedes poner a correr justo antes de ingresar a la subrutina a medir, y detener justo al retornar de la mísma, y verificar el valor del Timer.

Otra opción, es si posees osciloscopio(o frecuencímetro), podrías poner un pin en alto justo antes de ingresar a la subrutina y bajarlo al salir. Podrías medir el tiempo fácilmente también y transformarlo a cantidad de ciclos consumidos, sabiendo la cantidad de ciclos por segundo a la que está trabajando el micro.

 Seguramente también habrá otros métodos, y todo depende de qué herramientas te resultan más sencillas de manejar.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #2 en: 06 de Mayo de 2013, 14:50:39 »
Gracias por tu respuesta BrunoF. Creo que lo que necesito lo resolveré con el timer. No sabía que podía poner a correr el timer junto con el programa, de ser así me alegra.

Investigaré un poco más sobre la puesta en marcha del temporizador del micro. Gracias nuevamente, me sirvió tu respuesta...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #3 en: 06 de Mayo de 2013, 15:29:22 »
Citar
La más sencilla sería seguramente utilizando el Simulador del MPLAB, que te permite mediante el StopWatch controlar la cantidad de ciclos ejecutados, y mediante Breakpoints podrías seguramente enseguida saber con precisión la cantidad de ciclos consumidos.

romarco la mas sencilla es esta que te dice Bruno, pero bueno...

Si son subrutinas ni siquiera necesitas breakpoints, en el call pones el stopwatch a zero, le das en vez de a la flecha step into a la de al lado step over te salta a la instruccion siguiente al call y te da el tiempo exacto.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #4 en: 06 de Mayo de 2013, 18:27:46 »
Sí, pero lo que necesito es que el mismo programa en el micro me guarde en el registro el valor de los ciclos consumidos. No es que yo quiera saber cuántos ciclos me consume una rutina, sino que el mismo micro calcule los ciclos consumidos y de acuerdo al valor que me de, va a realizar una operación distinta.

Para que entiendas mejor, yo tengo un delay de 200 uSegundos en total, que será el tiempo que RB1 estará encendido después de dar una señal de disparo en RA1. Ahora bien, si doy un disparo en RA2, el programa tendrá que llamar una subrutina que que consume digamos que 10 uSegundos, pero aunque el programa haga las gestiones que sea, quiero que el delay nunca varíe, siempre sea de 200 uSegundos, lo que quiere decir, que como esa rutina consume 10, el delay tendrá que modificarse ahora para que sea de 190 porque ya he consumido 10, que en total son los 200 que necesito. Si llamo otra subrutina que consume 150 uSegundos, ahora necesito que el delay sea de 50 uSegundos porque que he consumido 150.

Para hacer eso, debo o bien sea precalcularlo todo, o hacer un programa que el mismo calcule lo que ha consumido y lo que falta por consumir para completar el delay de 200 uSegundos...

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #5 en: 06 de Mayo de 2013, 18:31:49 »
No te conviene.
Si quieres ejecutar algo cada xx milisegundos, te conviene mas hacer una rutina por interrupcion del timer, y esta se ejecutara siempre cada ese tiempo programado, en forma independiente a las demas funciones que utilizes.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #6 en: 06 de Mayo de 2013, 18:43:55 »
A ver si entiendo... Comienza a correr el timer al dar una señal por RA1 por ejemplo. Si el programa está realizando un trabajo y el timer llega a su tiempo, salta a la dirección 0x04 y reproduce las líneas de comandos que están ahí, mientras que el trabajo que se estaba haciendo sigue haciéndose al mismo tiempo que hace lo que está en la dirección de las interrupciones?

Puede ser esto posible? De no ser posible, lo que dices entonces no me resulta mucho...

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #7 en: 06 de Mayo de 2013, 22:49:42 »
Eso no existe en microcontroladores... :D :D :D
No hay multihilo ni mucho menos.
Eso solo ocurre en maquinas con mas de un core y aun asi, no es procesamiento paralelo.

Cuando atiendes la interrupción haces solo eso.
Aun en los RTOs se procesa un solo hilo a la vez, solo que todas las operaciones tienen franjas de tiempo donde son atendidas, ni mas ni menos que por un sistema basado en interrupciones...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #8 en: 07 de Mayo de 2013, 02:19:08 »
Como sera lo micros LPC4300 que tiene 2 procesadores.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #9 en: 07 de Mayo de 2013, 08:36:59 »
Lee lo que dice el fabricante, y puede ser que si se programa con .NET sea posible usarlos como si fuera multihilo.
Los compiladores comunes no lo pueden hacer.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #10 en: 07 de Mayo de 2013, 09:06:40 »
Bueno, ya me imaginaba que no se podía la multitarea en un PIC, por eso se me había ocurrido contar los ciclos consumidos para saber qué tiempo se ha perdido en cada subrutina, y ver cuánto falta para que el micro me corra otras subrutinas. Así hago con un solo micro, varias operaciones a la vez y que parezca que el micro admite multitareas.

Ya he logrado un dimmer, con dos display de 7 segmentos. Ahora lo que me falta es arreglar lo del delay para cuando presione los botones de subida y bajada. No quiero que al detectar una pulsación me llame una rutina de delay, porque en ese tiempo que pierde el micro para que el incremento no vaya tan rápido, se deja de mandar el disparo al triac, lo que provoca que la carga se apague. O sea, cada vez que intento subir o bajar la intensidad de la corriente a la carga se apaga por unos 200 milisegundos (que fue el tiempo que le puse a la demora). Quiero que en vez de esto, haya algo que me cuente todos los ciclos consumidos en el programa y que una condición que mire si ha consumido 200 milisegundos. Si se da dicha condición, me permita entonces incrementar o decrementar el registro de mayor o menor intensidad. No se si me doy a entender...

Les agradezco, ya con este hilo tengo una idea de cómo hacerlo. La sugerencia que veo más adecuada es la del timer. Buenos días...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #11 en: 07 de Mayo de 2013, 09:43:13 »
Deduzco que es un dimmer en corriente alterna, por lo del TRIAC ¿verdad?, entonces la solucion es bastante sencilla interrupcion externa para detectar cruce por 0 e interrupcion para el tiempo del TIMER, y ya puedes hacer todo lo que quieras porque el nivel de luz siempre lo tendras atendido con esas interrupciones, puedes incrementar o decrementar contadores para subir o bajar intensidad de luz, hacer antirrebotes para los pulsadores y todo lo que quieras ya que al TRIAC lo atenderan las interrupciones.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #12 en: 07 de Mayo de 2013, 10:02:17 »
Claro, ya la interrupción de cruce por cero la tiene. Lo que haré ahora es interrumpir por desbordamiento del timer. Cada vez que el timer desborde, va al vector de interrupciones y me incrementa tres contadores según sea necesario. Si Variable1 llega a 255, incrementa los Variable2 en 1, si Variable2 llega a 255 incrementa otro contador Variable3. Cuando este último contador llega a 3, sabré que aproximadamente se han gastado 200 msegs y permitirá incrementar o disminuir la intensidad de la luz.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #13 en: 07 de Mayo de 2013, 13:14:46 »
Hola romarco,

Para aprovechar los recursos del uC mejor: interrumpe la menor cantidad de veces posible.

No tengo idea de que microcontrolador estás usando, pero generar tantas interrupciones para sólo incrementar y controlar variables que lo único que hacen es esperar a que transcurra un lapso de tiempo mayor, es un despilfarro de recursos enorme y puede impactar negativamente en las otras funciones que el microcontrolador este haciendo. En lugar de eso, te propongo interrumpir la menor cantidad de veces posible, ya sea utilizando el pre-scaler, un timer de 16 bits, etc.

Suponiendo que el uC que estás usando ejecuta 1 instrucción cada 1uS (4Mhz de clock en las familias bajas y medias de PIC), para contar 200mS deberíamos entonces esperar 200000 instrucciones. Usando un Timer de 8 bits, con un pre-scaler de 256 (el máximo posible de algunos) podemos contar(esperar en este caso) 65536 instrucciones, que en este caso se pueden convertir fácilmente en 65536uS(65.536mS). Si interrumpimos cada este intervalo de tiempo, sólo necesitaremos una variable para contar 3 interrupciones por desbordamiento, lo que nos daría un total de 65536  * 3 = 196608 instrucciones(uS) o bien 196.608mS. Si queremos hilar fino allí podríamos pre-cargar al Timer por única vez con 256 - [(200000 - 196608) / 256] = 243 para contar con mayor aproximación los 200mS.

Hay que siempre intentar interrumpir la menor cantidad de veces. Pensás que en tu planteo se interrumpe cada 256 instrucciones, y la subrtuina de interrupción te consumiría mínimamente unos 40 de esos(entre demora del ingreso, salvar registros claves, identificar interrupcion, incrementar contadores y analizar, restaurar registros claves y volver). Haciendo eso solo el uC ya tiene un 15% del tiempo ocupado para hacer solamente eso. Haciendolo como yo te digo, el % de procesador consumido es de aproximadamente 0.08%.

Saludos.



"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Hay una manera de contar los ciclos que ha gastado el PIC?
« Respuesta #14 en: 07 de Mayo de 2013, 13:16:00 »
¿Cuantos niveles de luz va a tener ese dimmer?  :oops: :(

Citar
se han gastado 200 msegs y permitirá incrementar o disminuir la intensidad de la luz.

Tienes que controlar 10ms que es lo que dura el semiciclo a 50hz. ¿No entiendo lo de 200ms?

¿Es una lampara de tu casa o un local? ¿O es algun tipo de lampara especial?

Citar
va al vector de interrupciones y me incrementa tres contadores según sea necesario.

Aunque le dieras 100 niveles diferentes con un contador llega, pero el ojo humano no apreciaria tantos niveles de iluminacion, lo normal son 5 niveles, 10 o como mucho 20, no se es mi opinion.

Tambien puedes hacer la cuenta directa con el TIMER, asi cada vez que desborde activas TRIAC y listo.