Autor Tema: FUNCION  (Leído 9113 veces)

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

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
FUNCION
« en: 24 de Mayo de 2003, 12:32:00 »
Hola, gracias por leer, tengo una duda, hace poco que estoy usando CCS, y bien estoy utilizando variables enteras de 32 bits el tema es que ya pude  leer y precesar, tambien la presento en un LCD, pero tengo un problema, la lectura es 1496, que se debe leer 14,96 pero no se como hacer para poner la coma, entiendo que debe haber en lenguaje C una funcion que me devuelva un string character a partir de una variable, pero no la encuentro, les aclaro que uso para el LCD la funcion       PRINTF asi:  printf( PUT_C , "variable=%lu",variable )

un saludo cordial,

PIkMan

saludos
PikMan

Desconectado lu6vg

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 313
RE: FUNCION
« Respuesta #1 en: 24 de Mayo de 2003, 18:25:00 »
la funcion ITOA pasa de valoren enteros a caracter. El memotecnico es Int TO Ascii. La contraria es ATOI y esta FTOA. No recuerdo si estan imprementadas en el CCS.
Otra manera de poner fprint(var_char,"%lu",var_num)
donde var_char es una variable tipo char y var_num es tu variable numerica.

Saludos

Luis

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: FUNCION
« Respuesta #2 en: 25 de Mayo de 2003, 02:11:00 »
Pickman. ¿podrías bajar el ejemplo de representación de una variable entera de 32 bits en la LCD usando la instrucción printf?

Un saludo

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: FUNCION
« Respuesta #3 en: 26 de Mayo de 2003, 13:15:00 »
Escrito originalmente por lu6vg
la funcion ITOA pasa de valoren enteros a caracter. El memotecnico es Int TO Ascii. La contraria es ATOI y esta FTOA. No recuerdo si estan imprementadas en el CCS.
Otra manera de poner fprint(var_char,"%lu",var_num)
donde var_char es una variable tipo char y var_num es tu variable numerica.

Saludos

Luis

                Gracias por responder LUIS, bueno si no quise aclarar pero justamente es que no encuentro una funcion similar, en el de hi-tech esta ITOA pero en CCS no, hay muchas funciones destinadas a convertir strings en valores pero no valores en strings, igual no entiendo bnien tu sugerencia, pues lo que yo pretendo hacer es insertar una coma,  como te explico anteriormente yo hago esto

printf(LCD_PUTC, "Pres=%4lu",presion);

esto devuelve en el LCD por ejemplo 1496, y se debe leer
14,96, bueno ademas te consulto si tu nick es la licencia de radioaficionado o es casulidad?, pues yo soy lu7mbe, claro entenderas si es que estas en esto, gracias Luis de nuevo.

PikMAn
saludos
PikMan

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: FUNCION
« Respuesta #4 en: 26 de Mayo de 2003, 13:23:00 »
Escrito originalmente por pocher
Pickman. ¿podrías bajar el ejemplo de representación de una variable entera de 32 bits en la LCD usando la instrucción printf?

Un saludo


Hola  Pocher;
                     Bueno si entiendo bien queres saber como enviar al LCD,

tenes que incluir lcd.c  ( ademas de editarlo segun tus conexiones con el LCD y el micro ), y despues sencillamente haces esto

printf(LCD_PUTC, "Pres=%4lu",presion);

en este caso presion esta definida antes como Int32, lo use porque los calculos me demandaron 17 bits, por eso es que pongo %4lu, para indicar una variable larga en modo decimal que reserva 4 caracteres, poder poner hasta 9, en la pagina 108 del manual de CCS esta explicado si queres consultar,   a tus ordenes.

saludos

PikMan



saludos
PikMan

Desconectado lu6vg

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 313
RE: FUNCION
« Respuesta #5 en: 26 de Mayo de 2003, 21:51:00 »
Como nunca me acordaba de los nick de los divesos sitios a los que iba tome como norma usar mi licencia asi no me olvido y esta siempre libre

Mirando lo que te escribi me di cuenta que cometi un error. La funcion es SPRINTF y no fprint como puse.
Te pongo un ejemplo que te convierte un numero a texto y le agrega una como. Lo compile en C para PC para verificar que no metia la pata nuevamente, pero no deberias tener problema para adaptarlo. Tenes que cambia la ultima sentencia por la que usas con el LCD.
Supuse que el numero es de 4 cifras, sino tendras que trabajarlo un poco mas con un for.

Saludos

Luis

main(){
 char texto[6]="",aux[6]="";
 long numero=1496;
 sprintf(aux,"%ld",numero);
 texto[0] = aux[0];
 texto[1] = aux[1];
 texto[2] = ",";
 texto[3] = aux[2];
 texto[4] = aux[3];
 texto[5] = "";
 printf("%s",texto);
}

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: FUNCION
« Respuesta #6 en: 26 de Mayo de 2003, 22:09:00 »
Escrito originalmente por lu6vg
Como nunca me acordaba de los nick de los divesos sitios a los que iba tome como norma usar mi licencia asi no me olvido y esta siempre libre

Mirando lo que te escribi me di cuenta que cometi un error. La funcion es SPRINTF y no fprint como puse.
Te pongo un ejemplo que te convierte un numero a texto y le agrega una como. Lo compile en C para PC para verificar que no metia la pata nuevamente, pero no deberias tener problema para adaptarlo. Tenes que cambia la ultima sentencia por la que usas con el LCD.
Supuse que el numero es de 4 cifras, sino tendras que trabajarlo un poco mas con un for.

Saludos

Luis

main(){
 char texto[6]="",aux[6]="";
 long numero=1496;
 sprintf(aux,"%ld",numero);
 texto[0] = aux[0];
 texto[1] = aux[1];
 texto[2] = ",";
 texto[3] = aux[2];
 texto[4] = aux[3];
 texto[5] = "";
 printf("%sr",texto);
}




OK, Luis bueno mi nombre es Ariel y titular como te dije de lu7mbe, por el momento no estoy activo en radio pues tengo en reparaciones mi HF, no se si estas activo, estimo que si, bueno como te digo desde el principio hace poco que he comenzado con el C para pelear contra la demanda de desarrollos, pues en asm es muy dificil llegar con los tiempo a pesar de que cuento com muchas librerias de casi 10 años de programar, cero que CCS es la solucion, bueno te agradezco mucho tu ayuda voy a probar y luego te muestro como queda, por lo poco que entiendo creo que es la solucion, mi direccion de mail es lahoras@fullzero.com.ar, a tus ordenes.

PikMan
saludos
PikMan

Desconectado lu6vg

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 313
RE: FUNCION
« Respuesta #7 en: 26 de Mayo de 2003, 22:23:00 »
Ariel

Yo estoy aca por hobby solamente, pero me reenganche con el foro por la gente que hay en el mismo. Siempre le esquive al assembler en las compu, desde la epoca de la TI-99 4A y posteriores. Cuando estaba en la Uni me emamore de la filosofia de programacion del C sobre todo comparado con el basic de la epoca que era totalmente no-estructurado y con numeros de lineas.
Asi que cuando vi que en PICs se podia trabajar con C me anime a largarme y aca estoy. Soy muy novato en PICs. Recien estoy empezando. Para un amigo hice una baliza de CW que estoy probando en un BOARD a presion. La idea es que al final se haga sobre un 12C508A por el precio, pero la estoy probando con un 16F877 ya que lo tengo a mano.
Actualmente no estoy muy activo en HF, pero sigo experimentando y por eso llegue a los PICs
Saludos

Luis

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: FUNCION
« Respuesta #8 en: 27 de Mayo de 2003, 11:12:00 »
Hola Ariel, hola Luís.

Ariel muy interesante y potente la función:

        printf(LCD_PUTC, "Pres=%4lu",presion);

No la había usado antes.

He estado pensando tu problema  y creo haber encontrado una solución bastante sencilla. Mira a ver que te parece:

float n=1496;

float presion;

presion=n/100;

printf(LCD_PUTC, "Pres=%4.3f",presion);   //Para 3 decimales

Saca en la LCD como resultado 14.959 (no sé porqué no saca 14.96 exacto)

Luís la función SPRINTF ¿para qué compilador es? La he estado buscando en el manual de CCS y no la veo.

Saludos a los dos.


Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: FUNCION
« Respuesta #9 en: 27 de Mayo de 2003, 13:34:00 »
hola a todos....

la funcion sprintf es igual que printf solo la que salida es una cadena

char cadena[20];
sprintf (cadena,"valor= %lu",variable);


si variable vale 200 cadena[20] seria "valor = 200"

sirve para guardar datos con un formato determinado en una cadena

saludos

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: FUNCION
« Respuesta #10 en: 27 de Mayo de 2003, 14:52:00 »
Hola pocher, gracias por tu ayuda, mira lo que vos propones funciona si asignas directamente un valor, como vos pones
                     float n=1496

el problema es que el resultado de la medicion es una variable de 32 bist entera, y no se como hacer, pues no puedo hacer float  n=resultado, me da error, ademas le puse 2 decimales y me pone 14.96, creo que la mejor opcion es pasar lo que me resulta a un string de caracteres y depues los mando de a 1 y pongo la coma donde quiera y sin problemas, lo que pasa es que tampoco puedo lograrlo, lo ultimo que me queda es, insertar asm y no quiero.

saludos

saludos
PikMan

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: FUNCION
« Respuesta #11 en: 27 de Mayo de 2003, 15:59:00 »
pikman, no se pueden asignar tipos diferentes, lo que puedes hacer es convertir la variable a float:

float n;
int32 variable;
n = float(variable);


espero que asi te funcione.

saludos

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: FUNCION
« Respuesta #12 en: 27 de Mayo de 2003, 21:56:00 »
Hola pacalaconcurso,
                                  Gracias por ayudarme, es que soy novato en C pero me entusiasma la velocidad con que se puede desarrollar, espero poder conseguir lo que busco, desde ya a tus ordenes,

Ariel/PiKMan
saludos
PikMan

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: FUNCION
« Respuesta #13 en: 28 de Mayo de 2003, 02:40:00 »
Hola Ariel.

No te funciona lo de Félix, por los paréntesis.

Este es el programa que yo he probado y funciona (espero que sea esto lo que deseas):

// LCDfloat: Envio de variables decimales (15.62) a la LCD

#include <16f84.h>

#use delay(clock=4000000)
#include <lcd2.c>

main()
{
 
    int32 presion=1562;

    float n,x;
 
    n=(float)presion;
 
    x=n/100;

    while(1)
    {
    lcd_init();   // Comandos de inicialización del LCD.

    lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); // Envía comando al LCD
   
    printf(LCD_PUTC,"x=%4.3f",x);    // Manda al LCD un número de al menos
                                     // 4 caracteres con 3 posiciones deci-
                                     // males (saca 15.619)
   
    sleep();
    }
}


Saludos

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: FUNCION
« Respuesta #14 en: 28 de Mayo de 2003, 11:27:00 »
A ver si ahora te convenzo:

// LCDfloat: Envio de variables decimales (15.62) a la LCD

#include <16f84.h>

#include <lcd2.c>

main()
{
 
    int32 presion,value=512;

    float n,x;

    presion=(value*2500)/819;       // El resultado sale 1562,8
 
    n=(float)presion;
 
    x=n/100;

    while(1)
    {
    lcd_init();                       // Comandos de inicialización del LCD.

    lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); // Envía comando al LCD
   
    printf(LCD_PUTC,"x=%4.3f",x);    // Manda al LCD un número de al menos
                                     // 4 caracteres con 3 posiciones deci-
                                     // males (saca 15.619)
   
    sleep();
    }
}