Como calcular el tiempo de ejecucion en un programa?

quiero que alguien me explique como puedo saber el tiempo de ejcucion de un programa, es decir:

si tengo un retardo para mantener encendido un led como puedo saber cuanto dura ese retardo.
solo se que tiene que ver la frecuencia del cristal y el tiempo que se ejcuta cada instruccion, de ante mano se que se usa una formula y hay programas que generan codigos de retardo dependiendo de que tiempo se necesite, pero yo quiero saber como se calcula

agradeceria un ejemplo

yo manejo AVR`s y creo que no lo hago mal, pero es vergonsoso que he hecho varios proyectos interesantes y no se como calcular los tiempos.
para un LCD lo hago funcionar, pero el diagrama de tiempos me pide un retardo de aprox 450mseg, y yo solo pongo un retardo que se que dura mas.

si necesitan ayuda con AVR les puedoayudar en algunas cosas
 
para generar retardos debes hacer un bcle dentro del cual incrementes una variable y cuando llegue al valor condicion del bucle que salga. El retardo lo veras si miras el codigo en ensamblador viendo cuanto tardan en ejecutarse las instrucciones necesarias para ese bucle (evaluacion de la variable, incremento...). Entiendes ahora??
 
Utilizar retardos por software(loops) es lo mas "sucio" que hay, a menos que estos sean muy pequenios. Ya que mientras estos se ejecutan el MCU no puede hacer nada mas... y en muchas aplicaciones un retardo asi no te va a servir.

Mejor un utiliza un timer con un comparador. Cuando quieras comenzar la espera, inicia el timer... mientras ponte a hacer lo que quieras... cuando el timer alcanze el valor fijado para el comparador se generara una interrupcion, en esa interrupcion debes indicar que ya termino la espera y que tu programa debe continuar. Es la forma mas eficiente de hacerlo.

Ahora si quieres medir el tiempo que tarda en ejecutar cierto trozo de codigo haz lo siguiente. Al iniciar fija cualquier pin de salida a '1'...donde termine de ejecutarse el trozo a medir... ese mismo pin de salida ponlo a '0'. Ahora solo basta medir el ancho de ese pulso con un osciloscopio...
 
la manera de calcular esos tiempos es sumar la cantidad de cilcos de reloj
que toma ca instruccion.

todos los micros tienen una tabla en la cual dice cuantos ciclos toma cada instruccion
el tiempo de cada ciclo entonces esta determinada por la frecuencia de operacion
del micro.

La arquitectura harvard (famila PIC) usa un procesador RISC en la cual tadas las
operaciones toman 4 ciclos de reloj

En cambio las arquitecturas von-newman (Motorola, Intel (805X), etc) con procesadores CISC los tiempos de las instrucciones varian entre si y hay que recurrir a la tablita de
el fabricante.

saludos
 
Pues eso es lo que decia yo. perdona eso de que en un loop el micro no puede hacer otra cosa es mentira. Para que existen las interrupciones??? Los retardos por software se hacen por ejemplo para eliminar rebotes y cosas asi.
 
cubeusk dijo:
Pues eso es lo que decia yo. perdona eso de que en un loop el micro no puede hacer otra cosa es mentira. Para que existen las interrupciones??? Los retardos por software se hacen por ejemplo para eliminar rebotes y cosas asi.

En aplicaciones criticas de tiempo, no puedes darte el lujo de desperdiciar tiempo del micro para ponerte a contar variables de forma manual dentro de un bucle... Si bien es cierto que existen las interrupciones, no puedes estar interrumpe e interrumpe por que si no tu mismo delay 'contando' se va a hacer mas grande...

Es decir...

delay_ms(20);

Lo puedes sustituir facilmente por lo siguiente:


Asumiendo 4.00 Mhz; Preescaler 128; Valor del Comparador 625.

Código:
while (isBusy == TRUE) {
               if (state == IDLE) {
                               doSomething();
                               setTimerCompare(TIMER1, COMPARE_A, 0x0271);
                               activateTimer(TIMER1);
                               state = WAITING;
               } else if (state == WAITING) {
	
              // Aqui puedes hacer todo lo que quieras...... 
              en lugar de estar 'contando' dentro de un loop.

               } else if (state == RESPONSE) {
                                deactivateTimer(TIMER1);
                                state = IDLE;
                                isBusy = FALSE;
               }
}

En la interrupcion que genera el timer con un comparador activado...

Código:
setTimer1(0x0000);

if (state == WAITING) {
              state = RESPONSE;
}


Como puedes ver en ambos casos estaras esperando 20ms, sin embargo en un caso tu estaras 'contando' variables dentro de un ciclo (sin poder hacer nada mas), mientras en el otro... dejaras que el micro lo haga, de manera concurrente y tu aprovechas ese tiempo. Ahora como le dije anteriormente... para retardos muy pequenios (para muy pocos ciclos de reloj), si te conviene un loop 'contando'. Entiendes ahora??
 
vamos a ver lo que estas haciendo ahi es despertar al timer despertar al timer para que haga algo mientras llevar una TEMPORIZACION que despues supongo que al final de la ISR de comparacion le meteras un state=response para que el micro se quede idle. Pero eso es una TEMPORIZACION no un RETARDO. Un retardo se usa para eliminar rebotes.

por ejemplo :

P1.0 &= 0xF0;
P1.0 |= 0xF0;

while(P1==0xF0);
for(n=0; n<2000; n++); //retardo para evitar rebotes y asegurarnos de no activacion
//por ruido
if(P1 != 0xF0)
{
fila = P1;
}

P1.0 &= 0x0F;
P1.0 |= 0x0F;
colum = P1;

..... aqui ya metes el switch para sabe determinar la tecla que se pulso a que corresponde
 
Atrás
Arriba