TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pikman en 24 de Mayo de 2003, 12:32:00

Título: FUNCION
Publicado por: pikman 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

Título: RE: FUNCION
Publicado por: lu6vg 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
Título: RE: FUNCION
Publicado por: pocher 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
Título: RE: FUNCION
Publicado por: pikman 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
Título: RE: FUNCION
Publicado por: pikman 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



Título: RE: FUNCION
Publicado por: lu6vg 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);
}
Título: RE: FUNCION
Publicado por: pikman 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
Título: RE: FUNCION
Publicado por: lu6vg 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
Título: RE: FUNCION
Publicado por: pocher 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.

Título: RE: FUNCION
Publicado por: pacalaconcurso 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
Título: RE: FUNCION
Publicado por: pikman 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

Título: RE: FUNCION
Publicado por: pacalaconcurso 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
Título: RE: FUNCION
Publicado por: pikman 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
Título: RE: FUNCION
Publicado por: pocher 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
Título: RE: FUNCION
Publicado por: pocher 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();
    }
}

Título: RE: FUNCION
Publicado por: pikman en 28 de Mayo de 2003, 12:55:00
Hola Pocher!,

Bueno, como tu dices, me convenciste funciono ahora de maravillas, solo tengo un detalle,

vos decis

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)

4 caracteres y tres decimales, pero no lo hace si pones 5 carateres deberia reservar uno pero no lo hace,

resulta que me despaza todo a la izquierda cuando el valor es inferior a 1 ( por ejemplo 0.95 bar ) anteriormente cuando yo ponia %lu me hacia lo mismo pero se arreglo cuando le puse la cantidad de caracteres que pretendia mostrar, por lo que veo en el manual cuando lo variable a mostrar es float no es posible decir cuatos caracteres usar, pues pongas lo que pongas siempre usa lo mismo, lo que si varian son los decimales despues de la coma, bueno muchas gracias por tu ayuda, no se como puedo ayudarte pero estoy tus ordenes,

saludos

PikMan
Ariel




Título: RE: FUNCION
Publicado por: lu6vg en 28 de Mayo de 2003, 19:07:00
Hola

Una pequeña correccion para obviar variables

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

#include <16f84.h>

#include <lcd2.c>

main()
{

int32 value=512;

float presion;

presion=(float)((value*25)/819;

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",presion); // Manda al LCD un número de al menos
// 4 caracteres con 3 posiciones deci-
// males (saca 15.619)

sleep();
}
}

Saludos

Luis
Título: RE: FUNCION
Publicado por: pikman en 29 de Mayo de 2003, 12:02:00
Hola, Luis, Felix y Pocher,

                                       Bueno queria agradecerles la ayuda, finalmente pude obtener la lectura 14,96 Bars, si bien funciona bien poniendo la variable como float, decidi finalmente estudiar un poco el ejemplo que posteo Luis y pude hacer que funcione correctamente, y asi ahorro 200 palabras de memoria que me ocupa el hecho de utilizar variables del tipo float, no se si necesitan el codigo tal cual quedo, para mi realmente ha sido una muy buena experiencia incial.
En uno de los ejemplos de CCS esta uno que envia un mail estatico, son un modem que llama s7600, alguien tiene idea de donde se consigue, yo esoy usando el mx614 pero por lo que veo en el codio parece ser algo mas complejo aunque creo que es posible poner el mx614 el tema es que este es halfduplex y no se si me permitira  realizar la comunicacion contra el server, bueno si saben algo,

un saludo cordial.

Ariel

Título: RE: FUNCION
Publicado por: lu6vg en 30 de Mayo de 2003, 20:37:00
Ariel

Fijate si podes adaptar mi ejemplo. Sino a mi regreso lo charlamos

Saludos

Luis

Cita:

Hola, LUIS,
                 Bueno, te hago una consulta, mas arriba pegaste un ejemplo de como convertir la variable en una cadena, si bien esta funcionando como yo queria, el solo hecho de definir variables float incremento el programa 200 palabras mas de memoria de programa, me gustaria que me des un ejemplo de como hacer la conversion y mandarla al LCD, creo que esto ademas de darme la posibilidad de poner la coma donde yo quiera, creo que ocupara menos cantidad de memoria, bueno de C no te puedo enseñar nada, pero llevo 10 años usando microntroladores PIC, no se si hay algo que necesites o si te puedo ayudar cuenta con ello.

saludos

Ariel

Título: RE: FUNCION
Publicado por: pikman en 30 de Mayo de 2003, 21:00:00
Luis, ya lo hice andar....., lo que pasa es que no se porque quedo el post donde te pedia el ejemplo de nuevo, disculpas, anda como float e imprimiendo en una cadena, es mas en el manual hay un ejemplo similar lo que justifica porque no exixte la funcion ITOA en CCS,

un saludo nos leemos a tu regreso.

saludos

Ariel


Escrito originalmente por lu6vg
Ariel

Fijate si podes adaptar mi ejemplo. Sino a mi regreso lo charlamos

Saludos

Luis

Cita:

Hola, LUIS,
                 Bueno, te hago una consulta, mas arriba pegaste un ejemplo de como convertir la variable en una cadena, si bien esta funcionando como yo queria, el solo hecho de definir variables float incremento el programa 200 palabras mas de memoria de programa, me gustaria que me des un ejemplo de como hacer la conversion y mandarla al LCD, creo que esto ademas de darme la posibilidad de poner la coma donde yo quiera, creo que ocupara menos cantidad de memoria, bueno de C no te puedo enseñar nada, pero llevo 10 años usando microntroladores PIC, no se si hay algo que necesites o si te puedo ayudar cuenta con ello.

saludos

Ariel


Título: RE: FUNCION
Publicado por: lu6vg en 30 de Mayo de 2003, 21:24:00
Recien leo lo del mx614. Yo compre un CMX867 que es un modelo mas moderno de la misma compania. No lo he hecho funcionar todavia. Mas adelante cambiaremos informacion al respecto

Saludos

Luis
Título: RE: FUNCION
Publicado por: pikman en 03 de Junio de 2003, 11:42:00
Hola!,
         Bueno, buscando alternativas para la convertion de un entero a cadena, con el fin de poner la coma enontre que en el driver del ltc128.c que incluye el CCS para el converor a/d de 12 bits hay algo parecido que es esto:

void convert_to_volts( long int data, char volts[6]) {
   byte i, d, div_h, div_l;
   long int temp,div;

   div=0x3330;

   for(i=0;i<=4;i++) {
     temp=data/div;
     volts=(byte)temp+"0";
     if(i==0) {
       volts[1]=".";
       i++;
     }
     temp=div*(byte)temp;
     data=data-temp;
     div=div/10;
   }
   volts="";
}


como pueden ver lo que hace es primero dividir por para ajustar el valor leido al la escala de voltage ( eso entiendo) pero despues no entiendo que hace en esta linea:

volts=(byte)temp+"0";

Esto lo probe usando el conversor del 877 que es de 10 bits y funciona pero no asi como esta, bueno espero que puedan entenderlo, pues ni siquiera usa la funcion sprintf,

saludos

Ariel
Título: RE: FUNCION
Publicado por: lu6vg en 07 de Junio de 2003, 21:36:00
Hola

No analice el codigo, pero te comento que cuando pones de sumar "0" lo que hace es sumar el valor ASCII del caracter. Creo que en este caso es 30 y pico. Si fuera una A por ejemplo seria 65 el valor.

Saludos

Luis