Autor Tema: pasar Hex a dec  (Leído 9461 veces)

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

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
pasar Hex a dec
« en: 09 de Febrero de 2011, 08:57:47 »
Hola a todos estoy usando CCS C, y estoy con un PIC16F886 que recibe los comandos I2C de otro PIC16F886 que actua como maestro, hasta ahi todo bien, recibo los comandos y los muestro en pantalla sin problemas, ahora mi problema es que lo que recibo por I2C esta en Hex, o eso creo, y no encuentro la manera de pasarlo a decimal para poder trabajar con el.Sabeis alguna instruccion tipo atol,atof, o algo asi para pasar un valor hex a decimal?.
Gracias.

El codigo del Esclavo seria el siguiente(solo recibe por I2C y muestra en pantalla,de momento)

char dato1;
char dato3,dato2;
int16 dato4,dato5;
int x;
int i;
int d;

#int_SSP
void RDA_isr()
{
do{
if(i2c_poll()) {
         dato1=i2c_read();
         dato2=i2c_read();
         dato3=i2c_read();
         printf("\n\r El dato es: %x ",dato2);
         printf("\n\r El dato es: %x ",dato3);
         
         d=atoi32(dato2);
 
        //dato4=(d*100);
        printf("\n\r D: %u",d);
         //dato5=dato4+dato3;
         //printf("La Frecuencia es: %Lu",dato5);

         }
   }
 while(true);
 
}
 
void main() {
enable_interrupts(INT_SSP);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
printf("\f");

printf("\r\n Esperando Dato.....:");
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar Hex a dec
« Respuesta #1 en: 09 de Febrero de 2011, 09:47:06 »
  Si el dato no es un string lo podés manejar tranquilamente.

  Osea, recibir 0xff o 255 o 0b11111111 es lo mismo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: pasar Hex a dec
« Respuesta #2 en: 09 de Febrero de 2011, 10:12:45 »
  Si el dato no es un string lo podés manejar tranquilamente.

  Osea, recibir 0xff o 255 o 0b11111111 es lo mismo.

Gracias por tan rapida respuesta,te he hecho caso y el dato recibido lo guardo como tipo int cambiando solamente las 3 primeras lineas del programa :
har dato1;
char dato3,dato2;
int16 dato4,dato5;   

POR ESTO

int dato1;
int dato3;
int dato2;
int16 dato4;
int16 dato5;

Ahora bien mi problema es que le quiero mandar dos datos por I2C que sean la frecuencia a la que quiero que trabaje el modulo PWM, lo del Modulo PWM lo tengo claro ya, mi problema es que no se como pasar esos datos recibidos por I2C (por ejemplo dato2=0x10 y dato3=0x23) pasarlos a  una variable de tipo entero asi resultado=1023

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar Hex a dec
« Respuesta #3 en: 09 de Febrero de 2011, 10:34:41 »
  Partamos de la base que toda transmisión por I2C se hace en bloques de  8 bits.
  Yo no uso CCS así que no sé como trabaje dicho compilador con respecto al I2C. De todas maneras para generar una variable de 16 bits (que sería lo que vos querés hacer al unir los dos datos) creo que existe la función make16, tendrías que ver en la ayuda del CCS. y sino recurrir a lo siguiente.

Código: C
  1. int16 resultado;
  2. int8 dato2;
  3. int8 dato3;
  4.  
  5. resultado = (dato2 * 256) + dato3;
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: pasar Hex a dec
« Respuesta #4 en: 09 de Febrero de 2011, 14:40:27 »
En CCS se utiliza la función make16, que se encarga de convertir datos de 8 bits (char o int) a datos de 16 bits, para ello puedes utilizar lo siguiente.

Código: [Seleccionar]
long x;
int hi,lo;

x = make16(hi,lo);

Por ejemplo si:
   hi=0x10
   lo=0x03
Entonces
   x=0x1003

Puedes leer un poco más en la ayuda de CCS
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: pasar Hex a dec
« Respuesta #5 en: 09 de Febrero de 2011, 15:00:23 »
  Partamos de la base que toda transmisión por I2C se hace en bloques de  8 bits.
  Yo no uso CCS así que no sé como trabaje dicho compilador con respecto al I2C. De todas maneras para generar una variable de 16 bits (que sería lo que vos querés hacer al unir los dos datos) creo que existe la función make16, tendrías que ver en la ayuda del CCS. y sino recurrir a lo siguiente.

Código: C
  1. int16 resultado;
  2. int8 dato2;
  3. int8 dato3;
  4.  
  5. resultado = (dato2 * 256) + dato3;

Gracias angel, he probado la instruccion make16 y si que esta integrada en el CCS C, seria asi:

resul = make16(dato2,dato3);

Pero claro, yo necesito ese valor en decimal para poder calcular el valor del Registro TR2 del PWM del PIC.
Hay alguna Instruccion que pase a decimal ese variable en Hexadecimal?

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: pasar Hex a dec
« Respuesta #6 en: 09 de Febrero de 2011, 15:03:39 »
En CCS se utiliza la función make16, que se encarga de convertir datos de 8 bits (char o int) a datos de 16 bits, para ello puedes utilizar lo siguiente.

Código: [Seleccionar]
long x;
int hi,lo;

x = make16(hi,lo);

Por ejemplo si:
   hi=0x10
   lo=0x03
Entonces
   x=0x1003

Puedes leer un poco más en la ayuda de CCS

Gracias bigluis,  :)

Ahora mi problema es que necesito pasar esa variable a decimal para poder calcular el valor del Registro TR2 para el PWM.
Alguien sabe de alguna instruccion tipo atol o atoi que me convierta esa variable hex  de 16 bits a una decimal
« Última modificación: 09 de Febrero de 2011, 15:06:32 por ferorts »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar Hex a dec
« Respuesta #7 en: 09 de Febrero de 2011, 15:19:59 »
  No entiendo. Para hacer cálculos matemáticos es indistinto si los tenés en HexaDecimal o en Decimal.  Da lo mismo hacer 0xFF + 128 que 255 + 128.

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: pasar Hex a dec
« Respuesta #8 en: 09 de Febrero de 2011, 15:51:50 »
  No entiendo. Para hacer cálculos matemáticos es indistinto si los tenés en HexaDecimal o en Decimal.  Da lo mismo hacer 0xFF + 128 que 255 + 128.



OK,Gracias Angel, tenias razon da lo mismo que este en hex que en dec, solo hay que indicarlo, :), es que soy un poco cabezon..jaja.
He hecho una pequeña prueba y funciona, a ver si mañana lo termino y lo posteo por si le hace falta a alguien.
Gracias de nuevo.


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar Hex a dec
« Respuesta #9 en: 09 de Febrero de 2011, 21:17:47 »
  Veo que usas varias veces printf, ¿Estás mandando dicha información hacia una PC vía RS232?

  ¿El printf de x da bien?

  Olvidate por un momento de los if que testean el rango.
  Multiplica x por 0x10 y luego envialo con printf. Después multiplica x por 0x40 y también envialo con printf. Como para tener idea de cuales son las diferencias en la multiplicación.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado POLIGRAFO

  • PIC10
  • *
  • Mensajes: 5
    • Automatismos Passera
Re: pasar Hex a dec
« Respuesta #10 en: 17 de Marzo de 2011, 18:52:04 »
Hola
necesitaba pasar unos datos provenientes de un transponder (rfid) que me enviaba los datos en hex (ocupando un byte por cada hex enviado), y quería achicar un poco todo eso, así que hice estas funciones. si alguien conoce una forma menos aparatosa de hacerlo le agradecería lo comente  ;-)

char conversion_alta(int e){
   if(RxTransp[e]==48) return (0x0)  ;//primer 0
   if(RxTransp[e]==49) return (0x10) ;//primer 1
   if(RxTransp[e]==50) return (0x20) ;//primer 2
   if(RxTransp[e]==51) return (0x30) ;//primer 3
   if(RxTransp[e]==52) return (0x40) ;//primer 4
   if(RxTransp[e]==53) return (0x50) ;//primer 5
   if(RxTransp[e]==54) return (0x60) ;//primer 6
   if(RxTransp[e]==55) return (0x70) ;//primer 7
   if(RxTransp[e]==56) return (0x80) ;//primer 8
   if(RxTransp[e]==57) return (0x90) ;//primer 9
//per saltum
   if(RxTransp[e]==65) return (0xA0) ;//primer A
   if(RxTransp[e]==66) return (0xB0) ;//primer B
   if(RxTransp[e]==67) return (0xC0) ;//primer C
   if(RxTransp[e]==68) return (0xD0) ;//primer D
   if(RxTransp[e]==69) return (0xE0) ;//primer E
   if(RxTransp[e]==70) return (0xF0) ;//primer F
   return (0x0)  ;
}
char conversion_baja(int e){
   if(RxTransp[e]==48) return (0x00) ;//primer 0
   if(RxTransp[e]==49) return (0x01) ;//primer 1
   if(RxTransp[e]==50) return (0x02) ;//primer 2
   if(RxTransp[e]==51) return (0x03) ;//primer 3
   if(RxTransp[e]==52) return (0x04) ;//primer 4
   if(RxTransp[e]==53) return (0x05) ;//primer 5
   if(RxTransp[e]==54) return (0x06) ;//primer 6
   if(RxTransp[e]==55) return (0x07) ;//primer 7
   if(RxTransp[e]==56) return (0x08) ;//primer 8
   if(RxTransp[e]==57) return (0x09) ;//primer 9
//per saltum
   if(RxTransp[e]==65) return (0x0A) ;//primer A
   if(RxTransp[e]==66) return (0x0B) ;//primer B
   if(RxTransp[e]==67) return (0x0C) ;//primer C
   if(RxTransp[e]==68) return (0x0D) ;//primer D
   if(RxTransp[e]==69) return (0x0E) ;//primer E
   if(RxTransp[e]==70) return (0x0F) ;//primer F
   return (0x0)  ;
}

void convertir_tag(void){
char tag_alto=0, tag_bajo=0;
i=1;
tag_alto=conversion_alta(i);
i++;
tag_bajo=conversion_baja(i);
tag[0]=(tag_alto + tag_bajo);

i++;
tag_alto=conversion_alta(i);
i++;
tag_bajo=conversion_baja(i);
tag[1]=(tag_alto + tag_bajo);

i++;
tag_alto=conversion_alta(i);
i++;
tag_bajo=conversion_baja(i);
tag[2]=(tag_alto + tag_bajo);

i++;
tag_alto=conversion_alta(i);
i++;
tag_bajo=conversion_baja(i);
tag[3]=(tag_alto + tag_bajo);

i++;
tag_alto=conversion_alta(i);
i++;
tag_bajo=conversion_baja(i);
tag[4]=(tag_alto + tag_bajo);

       //fprintf(RS232,"\r\nT %X%X%X%X%X",tag[0],tag[1],tag[2],tag[3],tag[4]);

}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar Hex a dec
« Respuesta #11 en: 17 de Marzo de 2011, 22:15:23 »
  ¿Vos recibís un ASCCII y querés convertirlo a hexa (o sea a un número)? en C existe la función atoi (AsciiToInteger)para hacer eso.

  Sino, por ejemplo en la función "conversión_baja" podés hacer algo así

Código: C
  1. if ((RxTransp[e] >= 48) && (RxTransp[e] <= 57)) return RxTransp[e] - 48; // devuelve el codigo recibido menos 48
  2. //entonces si se recibe el 50 se devuelve el 2 (y justamente 50 corresponde al numero 2)
  3. if ((RxTransp[e] >= 65) && (RxTransp[e] <= 70)) return RxTransp[e] - 65;

y en conversión alta

Código: C
  1. if ((RxTransp[e] >= 48) && (RxTransp[e] <= 57)) return (RxTransp[e] - 48) << 4;
  2. if ((RxTransp[e] >= 65) && (RxTransp[e] <= 70)) return (RxTransp[e] - 65) << 4;

uso el << 4, para que haga un shift a la izquierda así queda en el nibble alto del byte.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: pasar Hex a dec
« Respuesta #12 en: 18 de Marzo de 2011, 16:10:20 »
Por lo general los compiladores traen una funcion que se encarga de realizar eso.

Por ejemplo CCS utiliza la funcion atoi que se encarga de convertir una cadena ASCII en su equivalente entero, es decir si tienes la cadena "123" y quieres convertirlo al valor 123 utilizas

valor=atoi("123")

En ves de esa cadena puedes utilizar un arreglo.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA