Autor Tema: Cuanto demora una instruccion printf ?  (Leído 3309 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Cuanto demora una instruccion printf ?
« en: 26 de Octubre de 2011, 16:54:04 »
Hola:

el codigo que adjunto envia datos cada 250 mseg via serie. en la rutina de interrupcion tengo el printf para enviar y la variable valor. la pregunta es si saben cuanto demoran dichas instrucciones.

supongo que una demora de 250 mseg es suficiente para que no afecte la demora producida por las dos instrucciones en la rutina de interrupcion.

lo que quiero decir es que se cumple casi exactamente el muestreo del valor float, en este caso cada 250 mseg, no ?


#include <16f88.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=9600,xmit=PIN_B5,rcv=PIN_B2,parity=N)
#use fast_io(a)
#use fast_io(b)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A7
#define LCD_DB7 PIN_A6

#define LCD_RS PIN_B7
#define LCD_E PIN_B6

#include "flex_lcd420.c"

float valor;

#int_Timer1  /*habilitación del timer 0 para cada 1 ms*/
void temporizador() {
   valor=123.79;
// temporizador 250 mseg
// 0.25 = (4/Fosc)*Prescaler*(65536-valor)
// Fosc= 8Mhz, Prescaler = 1:8
// 0.25= (4/8000000)*8*(65536-valor) --> valor = 3036
   printf("%01.2f",valor);  /*Envio valor al puerto serie*/
   set_timer1(3036);
}
void main() {
   setup_adc_ports(NO_ANALOGS);
   set_tris_a(0x00);
   set_tris_b(0x00);
   output_a(0x00);
   output_b(0x00);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); /*Configuración del timer1*/
   enable_interrupts(INT_TIMER1); /*Habilitación general de las interrupciones*/
   enable_interrupts(GLOBAL);
   while(1){
   }
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cuanto demora una instruccion printf ?
« Respuesta #1 en: 26 de Octubre de 2011, 16:57:26 »
Generalmente no se usa rutinas largas en una interrupción. Lo que demora Printf depende de cual es la salida de datos (no es lo mismo UART a 38400 que un LCD) y que tipo de formateo de datos se va a realizar.

Podes simularlo en proteus por ejemplo.

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

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Cuanto demora una instruccion printf ?
« Respuesta #2 en: 26 de Octubre de 2011, 17:08:20 »
Generalmente no se usa rutinas largas en una interrupción. Lo que demora Printf depende de cual es la salida de datos (no es lo mismo UART a 38400 que un LCD) y que tipo de formateo de datos se va a realizar.

Podes simularlo en proteus por ejemplo.

Saludos!

Pero en cualquier caso no es una demora importante respecto de los 250 mseg, no?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cuanto demora una instruccion printf ?
« Respuesta #3 en: 26 de Octubre de 2011, 17:10:43 »
mmm.. Estas enviando 4 caracteres a 9600, o sea aprox. 4.2ms y a eso hay que agregar lo que demoran las instrucciones. No creo que sea más de 5ms, así que iría bien  ;-)


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

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Cuanto demora una instruccion printf ?
« Respuesta #4 en: 26 de Octubre de 2011, 17:17:44 »
mmm.. Estas enviando 4 caracteres a 9600, o sea aprox. 4.2ms y a eso hay que agregar lo que demoran las instrucciones. No creo que sea más de 5ms, así que iría bien  ;-)
Saludos!

5 mseg aprox, ummm. Entonces quizas seria mejor pasar el printf al while(1) y desconectar la UART una vez enviado el float ?. En el siguiente ciclo la volveria a activar al principio del while y asi durante la interrupcion unicamente actualizo el timer.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cuanto demora una instruccion printf ?
« Respuesta #5 en: 26 de Octubre de 2011, 17:19:03 »
El timer podes actualizarlo ni bien ingresas a la rutina.


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

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Cuanto demora una instruccion printf ?
« Respuesta #6 en: 26 de Octubre de 2011, 22:15:05 »
¿Alguien ha visto una implementaciçon de printf?
Es una rutina sumamente pesada y lenta, cuando se usa contra un periférico como la UART es peor.

Mi consejo, trata de mandar el float directo. si es el formato de 32 bits son 4 bytes, incluso puede utilizar un valor entero para representar ese dato tan pequeño que tienes y codificar el resultado en 16 bits.

Si de todos modos es imperativo enviar la cadena, pues la conviertes con fprintf que la pone en memoria y luego envías uno a uno los bytes por la UART, que para eso tiene varias interrupciones y algunas hasta un buffer donde puede que quepa todo el dato.

Saludos
Reinier

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Cuanto demora una instruccion printf ?
« Respuesta #7 en: 27 de Octubre de 2011, 00:39:12 »
si, el printf es demasiado, ocupa bastante ya lo puse por otro post. Creo que era 1k de rom. Yo directamente no lo uso, solo lo recomiendo usar en caso de que se trabaje mucho con strings formateadas, que aunque ocupe mucha rom merece la pena la facilidad de uso.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cuanto demora una instruccion printf ?
« Respuesta #8 en: 27 de Octubre de 2011, 00:40:34 »
En CCS, es tan pesada? Por lo que he visto, en espacio en código, es muy eficiente a diferencia de C18, por ejemplo. Igual 100% recomendable enviar el float directamente. Como se puede hacer? Buscar en el foro, hace muy poco se trato el tema  ;-)


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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Cuanto demora una instruccion printf ?
« Respuesta #9 en: 27 de Octubre de 2011, 01:11:51 »
Efectivamente, el printf de CCS es mucho más liviano que el de los C de Microchip.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Cuanto demora una instruccion printf ?
« Respuesta #10 en: 28 de Octubre de 2011, 23:00:43 »
Hay librerias de printf más ligeras que las de C18, en la distribución de FreeRTOS viene una bajo licencia GPL, ahora no recuerdo exactamente los detalles, pero seguro una búsqueda en SanGoogle bastará.

Coincido con Suky, si hay mucho tratamiento de cadenas, vale la pena. Igual si te sobra un par Kinstrucciones en el PIC, pero si la cosa es apretada, es mejor hacerse una personalizada o no utilizar ninguna. Para convertir un float a string, basta con unas divisiones y unas comparaciones en un ciclo. Si el formato son dos enteros antes y dos después de la coma, el algoritmo es una pasadita para cualquier programador con un poco de entrenamiento.

Saludos
Reinier


 

anything