Autor Tema: tiempo que tarda una instruccion  (Leído 3486 veces)

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

Desconectado perla

  • PIC16
  • ***
  • Mensajes: 106
tiempo que tarda una instruccion
« en: 20 de Diciembre de 2017, 15:09:06 »
Hola de nuevo a todos.
Estoy realizando un programa y tengo que tener en cuenta el tiempo que tarda en ejecutarse una instruccion pero no en asamble, si no en basic Pro, el compilador que uso es el micode studio.
El pic es el pic12f629 con un oscilador externo de 4 Mhz.

Me atrevi a hacer un codigo para ello y puse lo siguiente:

for d= 1 to 65535 'veces de tepeticion
pause 1
next
high gpo.2 'cuando finaliza enciende un led
stop

De esta forma al poner en marcha el pic me dice que tarda 73 Segundos aproximados en encender el led de referencia con un cronometro.
A los 73 Segundos le restos los 65,535 Segundos que son las paradas de la pausa y me quedan 7,46 Segundos como tiempo de ejecucion de la instruccion de for, con lo que  si divides los 7,46 entre las 65535 repeticiones me dan 0,113 Milisegundos en concepto del tiempo que necesita para realizar una instruccion.

No se si estoy en lo cierto.

Alguien me puede decir algo?.


Desarrollador de vending.

Saludos desde Murcia (España).

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:tiempo que tarda una instruccion
« Respuesta #1 en: 20 de Diciembre de 2017, 15:19:47 »
Cuando trabajas con lenguajes de alto nivel, no podes estar seguro de cuanto tarda una instruccion, por que una instruccion puede tener por detras 1, 10, 100 o miles de instrucciones de ASM, ademas el compilador detectara cual es la mejor forma de realizarlo y por ende un cambio puede significar mucha diferencia.

Ademas uno no tiene en cuenta que el for consume ciclos tambien, seguramente ese high gpo.2 sea solo 1 instruccion en ASM, y hace que lo que tarda sea 1us, pero gracias al for, a trabajar con 16bits (por usar 65535) tengas ese valor.

Una cosa,, proba realizar esos 65535 con 2 for de 0 hasta 255. ya que el micro tiene mejor respuesta en 8 bits, y deberia darte un tiempo menor.

Desconectado perla

  • PIC16
  • ***
  • Mensajes: 106
Re:tiempo que tarda una instruccion
« Respuesta #2 en: 20 de Diciembre de 2017, 15:45:11 »
Hola KILLERJC gracias por tu respuesta tan rapida. Algo de eso que me comentas me estaba imaginando.
Probare eso que me comentas.
Saludos
Desarrollador de vending.

Saludos desde Murcia (España).

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re:tiempo que tarda una instruccion
« Respuesta #3 en: 05 de Enero de 2018, 11:24:56 »
Como te indican es muy difícil de saber cuanto tarda un determinado código en ejecutarse si no dispones de alguna herramienta en tiempo de ejecución, con herramienta me refiero a algún tipo de simulador.

De todas formas puedes obtener unos tiempos muy aproximados utilizando un timer interno del pic, de esta forma puedes conocer el tiempo que tarda una sentencia en ejecutarse.
Activas el timer antes de entrar en el código a medir e inmediatamente después de terminar el código lees el valor del registro del timer, como el timer tiene tiempos conocidos tanto en su escritura como en su lectura obtendrás un valor muy exacto.
« Última modificación: 14 de Enero de 2018, 08:55:08 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re:tiempo que tarda una instruccion
« Respuesta #4 en: 14 de Enero de 2018, 09:54:09 »
He encontrado un antiguo ejemplo:
Código: QBasic/QuickBASIC
  1. '********************************** PIC Entrenadora BASIC *********************************
  2. 'NOMBRE: 16F88_Pic_EBasic_LCD_Timer1_MidiendoTiempo_10
  3. 'VERSION: 1.0
  4. 'MICRO: PIC16F88
  5. 'Fecha/Autor: 5/07 By COS, PSI v7.41
  6. 'DESCRIPCION: Midiendo el tiempo que tardan ciertas rutinas en ejecutarse.
  7. 'Representación  del tiempo por el hiperterminal.
  8. 'Programar el hyperterminal del Windows:
  9. 'Bits por segundo: 4800
  10. 'Bits de datos: 8
  11. 'Paridad: Ninguno
  12. 'Control de flujo: Ninguno
  13. 'LCD a 4 bit, sin bit de RW
  14. 'Valor por el display y por el hyperterminal
  15. '************************************************************************************************
  16. Define CONFIG = 0x2f50  'Configuración bits (Fuses)
  17. Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
  18. Define CLOCK_FREQUENCY = 8  'Clock en Mhz
  19. 'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  20. 'Configuración del LCD------------------------------------------------------
  21. Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
  22. Define LCD_DREG = PORTA  'El bus de datos sera el puerto A
  23. Define LCD_DBIT = 0  'El bus de datos seran los 4 bit menos significativos del puerto A
  24. Define LCD_RSREG = PORTB  'El bit de control RS sera del puerto B
  25. Define LCD_RSBIT = 7  'Se usara el RB7 como RS
  26. Define LCD_EREG = PORTB  'El bit de control E sera del puerto B
  27. Define LCD_EBIT = 6  'Se usara el RB6 como E
  28. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg., depende del lcd (este 500)
  29. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg., depende de la respuesta del lcd
  30. Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  31. 'Asignación I/O y valores de inicio de las salidas---------------------
  32. ANSEL = 0x00  'Los pin I/O digitales
  33. CMCON = 0x07  'Comparador a off
  34. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  35. TRISA = 0x00  'Puerto A como salidas
  36. TRISB = 0x00  'Puerto B como salidas
  37. TRISA.4 = 1  'Como entrada (RA4, adc)
  38. TRISA.6 = 1  'Como entrada (RA6, tecla S1)
  39. TRISA.5 = 1  'Como entrada (RA5, tecla S2)
  40. 'TRISB.5 = 0 'RB5(Tx, RS232)
  41. TRISB.2 = 1  'RB2 (Rx, RS232)
  42. PORTB.3 = 1  'Luz lcd a on (RB3)
  43. PORTA.7 = 1  'Led amarillo a off
  44. PORTB.0 = 1  'Led verde a off
  45. 'Configuración Timer1----------------------------------------------------------
  46. T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
  47. T1CON.T1CKPS0 = 0  'Factor del preescales del timer1, 0
  48. T1CON.T1CKPS1 = 0  'Factor del preescales del timer1, 0
  49. T1CON.TMR1ON = 0  'Parado el contador del TMR1
  50. PIE1.TMR1IE = 0  'Desactiva las interrupciones del timer1
  51. 'INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
  52. 'Enable  'INTCON.GIE habilita todas las interrupciones globales
  53. '---------------------------------------------------------------------------------------
  54. Lcdinit  'inicializa el LCD sin cursor
  55. 'Asignacion de nombres
  56. Symbol led_amarillo = PORTA.7  'led amarillo
  57. Symbol led_verde = PORTB.0  'led verde
  58. 'Variables
  59. DIM timer1 AS LONG  'Contendra el valor de los registros del timer1 y posterior valor a uSeg.
  60. DIM aux AS Byte
  61. aux = 0
  62. 'Cabecera LCD
  63. 'WaitMs 1000  'Pausa de 1Seg
  64. Lcdout "16F88_LCD_TIMER1"  'Imprime en el LCD el literal
  65. Lcdcmdout LcdLine2Home  'Selecciona linea y cursor al principio
  66. Lcdout "MidiendoTiempo"  'Sscribe la cadena de literales en el lcd
  67. 'WaitMs 3000  'Pausa de 3Seg
  68. 'Main Programa---------------------------------------------------
  69. main:
  70.         TMR1H = 0x00  'Borra el registro alto del timer1
  71.         TMR1L = 0x00  'Borra el registro bajo del timer1
  72.         T1CON.TMR1ON = 1  'Activa el contador del TMR1
  73.         'Rutina a medir en uSeg-----------------------------------
  74.         'WaitMs 15  'Tarda 14997 uS
  75.         'Lcdcmdout LcdClear  '__Tarda 2930uS
  76.         'Lcdout "Hola TodoPic"  '_
  77.         'aux = 100  '__________Tarda 1 uSeg
  78.         'If aux = 100 Then  '_____Tarda 2 uSeg.
  79.         'Endif  '______________
  80.         FOR aux = 0 TO 100  '____Tarda 457 uSeg.
  81.         NEXT aux  '____________
  82.         '-------------------------------------------------------------------
  83.         'Lectura timer1
  84.         T1CON.TMR1ON = 0  'Para el contador del TMR1
  85.         timer1.HB = TMR1H  'Asigna registro de mas peso
  86.         timer1.LB = TMR1L  'Asigna registro de menos peso
  87.         IF timer1 > 0 THEN timer1 = timer1 - 1  'Se resta tiempo conocido
  88.         'Envia datos al LCD
  89.         Lcdcmdout LcdClear  'Borra el lcd y cursor linea 1
  90.         Lcdout "Timer1:", #timer1  'Datos por el lcd
  91.         'Envia datos al puerto serie
  92.         Serout PORTB.5, 4800, CrLf, "Timer1: ", #timer1, CrLf  'Puerto serie Tx, por soft
  93.         'Calcula usegundos
  94.         timer1 = (timer1 * 5) / 10  'En microsegundos
  95.         'Datos al Lcd
  96.         Lcdcmdout LcdLine2Home  'Cursor al principio de la linea 2 del lcd
  97.         Lcdout "Tiemp.:", #timer1, "uS."  'Datos por el lcd
  98.         'Datos al puerto serie
  99.         Serout PORTB.5, 4800, CrLf, "Tiempo: ", #timer1, " uSeg.", CrLf  'Puerto serie Tx, por soft

Si se quiere mayor precisión sobre todo en tiempos pequeños es cuestión de cambiar los cálculos enteros a Float.

« Última modificación: 14 de Enero de 2018, 19:51:35 por dogflu66 »
Saludos desde Granada, España.

Desconectado jorgenuviola

  • PIC16
  • ***
  • Mensajes: 148
    • rat argentina!!
Re:tiempo que tarda una instruccion
« Respuesta #5 en: 04 de Febrero de 2018, 23:49:14 »
interesante el tema, ahora no consigo el pic simulator ide, baje como 10 versiones y en vista no funcionan...¿alguna sugerencia?

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re:tiempo que tarda una instruccion
« Respuesta #6 en: 05 de Febrero de 2018, 09:58:53 »
De vista no tengo ni idea, puedes enviar un correo al autor a ver que te contesta. :(
Saludos desde Granada, España.


 

anything