TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: Renatox_ 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
#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);
}
-
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,
-
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
-
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.
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..?
-
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
-
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.
-
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.
-
:-/ 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 "
:-/