Autor Tema: rutinas matemáticas math.h y printf  (Leído 4777 veces)

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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
rutinas matemáticas math.h y printf
« en: 19 de Enero de 2007, 22:19:46 »
 Hola amigos, en el capítulo <math.h> de Mathematical Function, del pdf para manejar las librerías del C30 de Microchip, da ejemplos para manejar las funciones matemáticas, por ejemplo pongo el un código pequeño para una rutina con el cos(x);

 Como pueden observar una vez hallada la operación de y=cos(x); esta imprime con la rutina printf(); los valores de x e y, pero a donde lo lleva el printf, a donde imprime esta cadena, lo lleva a un archivo de texto que hay que crearlo antes con la ayuda de la librería stdio.h, alguien porfa si me puede aclarar esto, gracias

Código: [Seleccionar]
#include <math.h> /* for cos */
#include <stdio.h> /* for printf, perror */
#include <errno.h> /* for errno */

int main(void)
{
 double x,y;
 errno = 0;
 x = -1.2;
 y = cos (x);
 if (errno)
    perror("Error");
 // el stdio.h permite usar el printf como lo hace el ccs
 printf("The cosine of %f is %f\n\n", x, y);
 errno = 0;
 x = 0.0;
 y = cos (x);
 if (errno)
    perror("Error");
 printf("The cosine of %f is %f\n\n", x, y);
}
control de movimiento

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: rutinas matemáticas math.h y printf
« Respuesta #1 en: 22 de Enero de 2007, 05:46:57 »

Buennass:

El printf lo que hace es sacarte los datos por el puerto de la USART del dspic, por lo tanto si quieres verlo por el hyperterminal o otro programa parecido, deberás configurar la usart primero. Te recomiendo el Dspic Tools Libraries para la configuración del módulo de la USART, facilita las cosas.

De todas maneras en este foro, y en la página de nocturno encontrarás ejemplos para configurar la USART,

saludos y suerte,
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado CheKeBo

  • PIC10
  • *
  • Mensajes: 18
Re: rutinas matemáticas math.h y printf
« Respuesta #2 en: 14 de Marzo de 2007, 16:00:47 »
Hola,

Yo para escribir en un LCD texto con numeros en distintos formatos, hex, bin, etc..., utilizo una función muy util que esta en stdio.h que es sprintf, esta función es igual que printf pero envia el resultado a un array del tipo char. una vez tienes ese array puedes escribirlo donde quieras.

Ejemplo:

unsigned char buf_lcd[10];   // buffer de la cadena
float valor;

valor=3.2345;   
n=sprintf(buf_lcd,"El valor es: %1.4f",valor);


el resultado sería :

n="El valor es: 3.2345"

es muy util para no utilizar printf, ya que este te lo envia por la uart y para enviarlo a otro sitio tendrias que modificar la funcion putchar, que es mas complicado.

Un saludo

CheKeBo

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: rutinas matemáticas math.h y printf
« Respuesta #3 en: 15 de Marzo de 2007, 14:29:58 »
hola Chekebo, yo también probé con la función sprintf y sin adherir la cabecera <stdio.h> y me compila, el problema de esta función es que toma demasidos ciclos, por ejemplo para este ejemplo toma 1036 ciclos. Puedes comprobar el tiempo que tarda tu rutina con el Stop Watch del Mplab.

Código: [Seleccionar]
char mystring[15];
 float myfloat;
 myfloat=-12.34;
 n=sprintf(mystring,"%5.3f",myfloat);

 Donde n=7 y mystring="-12.340", de esta forma se podrían enviar en forma de cadena los valores numéricos por los módulos de comunicación uart y spi por ejm, pero a costa de perder muchos ciclos. Tu conoces alguna otra forma de enviar valores numéricos, por ejm flotantes, por los módulos de comunicación..?
control de movimiento

Desconectado CheKeBo

  • PIC10
  • *
  • Mensajes: 18
Re: rutinas matemáticas math.h y printf
« Respuesta #4 en: 15 de Marzo de 2007, 15:57:37 »
Hola Renatox,

¿has probado a descomponer el float en bytes y enviarlos tal cual al PC para luego en el PC montarlos y hacer un float?

Un float son 32bits, descompones el float en 4 bytes (char) y envias esos 4 bytes, luego los vuelves a montar y ya tienes en el PC el float.

Yo lo utilizo en mis programas y funciona muy bien.

CheKeBo

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: rutinas matemáticas math.h y printf
« Respuesta #5 en: 15 de Marzo de 2007, 18:24:20 »
 Excelente solución Chekebo, pero no tengo idea como descomponer un float, ni un entero en bytes :-), porfavor pégate un ejemplo de esto, y como otro pic recibe estos 4 bytes y lo transforma otra vez a flotante, gracias.
control de movimiento

Desconectado CheKeBo

  • PIC10
  • *
  • Mensajes: 18
Re: rutinas matemáticas math.h y printf
« Respuesta #6 en: 19 de Marzo de 2007, 12:06:52 »
Bueno, vamos a ver si soy capaz de explicarlo claro.

Yo trabajo en el formato 5.23 y tengo que hacer una transformación a ese formato antes, pero supongo (no lo he probado) que funcionará igualmente.

1. transformo el float al formato 5.23, conviertiendo el float en un long int.
2. descompongo los bytes


nota: Formato 5.23: para pasar al formato 5.23 hay que hacer:  2^23 = 8388608 y multiplicarlo por el float.

Para volver a montarlo

1. monto los bytes
2. deshago la transformación 5.23

Ejemplo:

void Convierte_5_23(float numero)
{
long int num1,aux_convierte;
unsigned char dummy1, dummy2, dummy3, dummy4;

// lo transformo a 5.23 y entero de 32 bits
num1=numero*8388608;

// lo descompongo en 4 bytes
aux_convierte=(num1&0x000000FF);
dummy1=aux_convierte;      // bytel
aux_convierte=(num1&0x0000FF00)>>8;
dummy2=aux_convierte;      // bytelm
aux_convierte=(num1&0x00FF0000)>>16;
dummy3=aux_convierte;      // bytehm
aux_convierte=(num1&0xFF000000)>>24;
dummy4=aux_convierte;      // byteh
}
 
ahora para volver a montar el dato

void Convierte_float(char dummy1, char dummy2, char dummy3, char dummy4)
{
long int aux_convierte;
float numero_float;

// monto los 4 bytes      
aux_convierte=dummy4;   // byte h
aux_convierte<=8|dummy3;  // desplazamos a la izq 8 bits y le sumamos (OR logico) el byte hm
aux_convierte<=8|dummy2;  // desplazamos a la izq 8 bits y le sumamos (OR logico) el byte lm
aux_convierte<=8|dummy1;  // desplazamos a la izq 8 bits y le sumamos (OR logico) el byte l

// deshacemos la transformación 5.23
numero_float=aux_convierte/8388608;
}


La ultima función no la he probado, pero creo que funcionará. Lo he hecho de memoria, ya que hoy estoy de vacaciones y no tengo aqui el MPLAB para probarlo.

Es posible que si te saltas la transformación a 5.23 tambien te funcione, al fin y al cabo estas descomponeniendo en bytes y volviendo a montarlos.

Yo utilizo el formato 5.23 porque es utilizado en los DSP de analog devices que utilizo, pero por lo demas debe ser lo mismo.

Un saludo

CheKeBo.

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: rutinas matemáticas math.h y printf
« Respuesta #7 en: 19 de Marzo de 2007, 22:28:12 »
 :-/ eeeeeeeee me salió,  gracias Chekebo me mostraste el camino, hize modificaciones a tu programa, voy a postear lo que he obtenido en el hilo "dspic Curso Básico en C30 "

 :-/
control de movimiento


 

anything