Autor Tema: tiempo de ejecucion codigo C en MPLAB  (Leído 16361 veces)

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

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #30 en: 03 de Febrero de 2010, 20:32:39 »
Yo estoy descargando la versión que me dijiste que tenes del compilador, es la última. Te cuento si tuve algún cambio...

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #31 en: 03 de Febrero de 2010, 20:50:17 »
Instale la última versión del compilador, la 4.104.

Ahora las mediciones en el simulador es de 47ms y en el PIC 39ms. Supongo que con un par de ajustes van a estar midiendo lo mismo!!!!

Excelente Angel!!!

Mañana continúo con las pruebas de ajuste y comento!!! Es hora de un descanso.

Un abrazo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #32 en: 04 de Febrero de 2010, 12:20:07 »
Envié un mensaje anterior, pesaban mucho los adjuntos y hubo un error.

Ayer a la noche probé con tres programas de puertos virtuales y simulando en proteus. En el programa terminal leía 52.275 ms mientras que el MPLAB decía 63.283 ms.

Hoy desinstalé todos los programas y volví a instalar. MPLAB 8.43; CCS 4.104; Proteus 7.6. Simulé y tiraba los mismo números.
Entonces se me dio por poner una velocidad de 2400 baudios, tanto en el programa como en el terminal y en la simulación de Proteus. Ahora en las capturas se puede apreciar MPLAB 63.283 ms, y en el termnal 63.180 ms.

Yo creo que tendrías que programar tu PIC con esa velocidad puesta en el programa, y obviamente setear el terminal a esa velocidad, y ver que valor te llega.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #33 en: 04 de Febrero de 2010, 15:56:11 »
Efectivamente, con la versión 8.43 a la velocidad de 2400 da el mismo valor tanto en el PIC como en la salida del Simulador. A 9600 hay diferencia... que raro...

Lo que no puedo obtener, es el valor medido con el StopWatch, o sea, en la salida del simulador tengo el mismo valor que en el terminal (recibiendo del PIC). Hay que ver si la lógica del timer0 es la correcta para el cálculo
« Última modificación: 04 de Febrero de 2010, 16:10:41 por marito »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #34 en: 05 de Febrero de 2010, 11:26:31 »
La lógica del cálculo es correcta.
Hoy estuve haciendo algunas pruebas. Hay un problema en la instrucción "CycleTime=(float)(0.0000512*(get_timer0())+0.0131072*contadorglobal);" El asunto está en que te toma el valor de Timer0 muy tempranamente, y entonces cuando termina de realizarse dicha intrucción el timer0 ya tiene otro valor.

Puse para ver el registro del Timer0 en el MPLAB, antes de comenzar dicha sentencia el Timer0 tiene el valor 212 y al terminar 218.

Al finalizar la sentencia "CycleTime = ....."   el StopWatch indica 63.636800 ms

Si hago los cálculos (con la fórmula que está en el programa) con timer0 en 212 el valor de CycleTime es 63.283 ms.

Pero si hago los cálculos con timer0 en 218 (que es el valor que tiene al finalizar la sentencia) CycleTime es 63.5904 ms.
Este valor es mucho más cercano al del StopWatch.

Veamos cuál es la diferencia concreta.... 63.6368 - 63.5904 = 46.4u -> 46.4u/200n (que es el tiempo de instrucción) = 232
este valor es la cantidad de instrucciones que se están quedando afuera de la cuenta. ¿Y por qué se quedan afuera? como se está usando un preescaler de 256 no se llega a incrementar una vez más el timer0
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #35 en: 05 de Febrero de 2010, 16:21:27 »
Yo hice una prueba, y como era de esperar los resultados son idénticos, hay una diferencia de 1 ciclo que puede ser de algún detalle que se escapa al no ver las instrucciones en assembler.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #36 en: 06 de Febrero de 2010, 15:06:18 »
Me cansé de hacer pruebas en CCS  :5]; si agregaba mas delay o ponía mas sentencias "printf...." antes de hacer el cálculo de CycleTime éste variaba enormemente. Definitivamente hay algún gran problema o en la implementación de printf o cuando se ingresa demasiado a la interrupción para incrementar ContadorGlobal.

Bajé rutinas de delay y serial para Hitech y me puse a probar con el... te subo dos capturas... ProgramaHitech1 muestra el valor que tiene el StopWatch antes del cálculo de la variable Ciclos; 69.4604 ms

En la captura ProgramaHitech2 vemos que el valor en la variable ciclos es 694272.

Si se divide el valor de ciclos en 10000 nos da el tiempo en ms 69.4272;
La diferencia entre StopWatch y ciclos es 33.2us que equivalen a 166 instrucciones. Este número se está quedando afuera porque no supera la división del prescaler del Timer0 (que está en 256);

Ahora bien, tuve que realizar los cálculos de esa manera porque intenté usar la función FTOA -FloatToASCII- pero no me tomaba bien los decimales. Entonces decidí hacer que ciclos sea "unsigned long" y usar todos número mayores que 0.

Código: [Seleccionar]
/*************
*
* Prueba para ver si puede usar el puerto serie con HiTech
*
*************/
#define   PIC_CLK 20000000



#include <htc.h>
#include "delay.c"
#include "serial.c"

//#include <stdlib.h>
//#include <stdio.h>
//#include <string.h>

#include "Definiciones.h"
/*
#define INTERNAL 0
#define EXT_L_TO_H 32
#define EXT_H_TO_L 48
#define TMR0_DIV_1 8
#define TMR0_DIV_2 0
#define TMR0_DIV_4 1
#define TMR0_DIV_8 2
#define TMR0_DIV_16 3
#define TMR0_DIV_32 4
#define TMR0_DIV_64 5
#define TMR0_DIV_128 6
#define TMR0_DIV_256 7
#define set_timer0(x) TMR0= x
#define setup_timer0(x) (OPTION = 0b11000000|x)
*/

unsigned int ContadorGlobal;

void interrupt tc_int(void)
{
if (T0IE && T0IF)
{
T0IF=0;
++ContadorGlobal;
}
}


void main (void)
{

unsigned long Ciclos;

setup_timer0(INTERNAL|TMR0_DIV_256);
serial_setup();
INTCON= 0b10100000;



while (1)
{
set_timer0(0);
ContadorGlobal = 0;
Ciclos = 0;
DelayMs(20);
putst ("Que Mal el CCS ");
DelayMs (30);
putst ("Que barbaro lo del Timer0");
Ciclos = (ContadorGlobal*131072) + (unsigned long)(TMR0)*512;

}
}
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #37 en: 06 de Febrero de 2010, 21:19:29 »
Terminé de hacer pruebas con HiTech y tengo el mismo problema  :x  :x  :x.
Quiero creer que entonces es el MPLAB que, al no simular bien la comunicación serie, se boludea -en términos técnicos- y calcula mal los ciclos
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #38 en: 06 de Febrero de 2010, 22:25:14 »
Me parece que en la simulación de la comunicación serial los 2 simulan de forma distinta el vaciamiento del buffer de comunicación. Habría que hacer las pruebas en hard real y ver realmente cual es el más acertado.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #39 en: 08 de Febrero de 2010, 19:39:54 »
Hola!!! Estuve desaparecido un par de dias porque estuve a full en el trabajo! Las últimas pruebas que estuve haciendo, me dieron valores muy parecidos, tanto en hardware como en software (simulador). Me da una pequeña diferencia, como comente en el último post que hice, pero voy a intentar ajustar el programa para ver si los valores se aproximan. Te comento que los valores de tiempo los necesito en este momento para hacer los cálculos de ángulo de inclinación con un giroscopo y utilizar este dato en un controlador PID. Estoy bastante entretenido!!!
Saludos!!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #40 en: 08 de Febrero de 2010, 21:13:42 »
Acá lo importante es estar seguro que la programación es correcta y mediante una salida y un osciloscopio comprobar las medidas. La simulación es solo eso, y no se puede confiar plenamente  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #41 en: 09 de Febrero de 2010, 10:41:49 »
Esta buena esa. Activas dicha salida al principio del While y la desactivas justo después del cálculo de CycleTime; Al medirla con el osciloscopio se puede saber cuanto dura realmente el ciclo. Pero de todas maneras puede seguir habiendo una pequeña diferencia, ya que en la sentencia del cálculo de CycleTime se toma el valor del Timer0 en x punto y cuando termina dicha sentencia puede ser que el valor del Timer0 haya cambiado.

De hecho, simulándolo con el MPLAB (aunque no haya rutinas de comunicación, para que no alteren demasiado la medida) se llega a notar eso. (Que el valor del Timer0 es diferente cuando comienza la sentencia de cálculo de CycleTime a cuando termina dicha sentencia). Pero esto no sería demasiado problema ya que al valor calculado se le puede agregar uno fijo (que haga las veces de offset) y listo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: tiempo de ejecucion codigo C en MPLAB
« Respuesta #42 en: 03 de Marzo de 2010, 15:57:28 »
Finalmente pude realizar la medición de ciclo de programa con osciloscopio, forzando a uno el estado de un puerto al comienzo del programa y a cero al final. El tiempo medido con el mismo, coincide al que realiza el PIC utilizando el Timer0, por lo que ahora voy a estudiar bajo que condiciones, el cálculo con el simulador coincide con los anteriores.
Saludos!!!


 

anything