Autor Tema: Cómo pasar de decimal a exadecimal con el PIC.  (Leído 7520 veces)

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

Desconectado Carls_UPV

  • PIC10
  • *
  • Mensajes: 3
Cómo pasar de decimal a exadecimal con el PIC.
« en: 14 de Julio de 2008, 13:59:30 »
Hola a todos! Soy nuevo en el foro. La verdad es que pinta muy bien la cosa.  :-)

Estoy liado con un proyectillo y me ha surgido una duda, ya que mi intención es hacer un par de operaciones dentro del programa de pic (uso el 18F4550, y la gran mayoria las hago en el pc con visual y las mando hechas al PIC por Puerto Serie). El tema es que tengo una constante que varia segun los eventos(en decimal) , que quiero multiplicar por un dato recibido por serie (en exadecimal). Y ahi me surge el problema, ya que las operaciones de decimales y exadecimales no se como hacerlas.
Se me habia ocurrido hacer una conversion de decimal a hexadecimal, ya que en la operación intervienen varios datos hexadecimales y luego hacer las correspondientes operaciones. La cuestión es que no se hacer tal conversion.

A ver si me podeis hechar una manita  :mrgreen:

Un saludo, y me alegro de entrar en esta comunidad!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #1 en: 14 de Julio de 2008, 14:04:20 »
Hola, bienvenido

Para que el foro te ayude debes darle pistas de qué estás usando...

- Lenguaje de programación del pic y del pc (¿visual qué?)
- Compilador de ese lenguaje
- Código fuente completo o parte de interés
- Circuito de conexiones (si hace falta)

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #2 en: 14 de Julio de 2008, 15:32:04 »
Hola Carls_UPV:

Si almacenas en un registro el dato que viene de la PC y lo llamas "DATO_PC" y a la constante que varia segun los eventos(en decimal) en otro registro "REG_EVENTOS" multiplicalos de la siguiente forma:

  movf    DATO_PC,w
  mulwf   REG_EVENTOS

Ahora puedes leer el resultado de la multiplicación en los registros PRODH:PRODL, no importa si uno de los registros está en decimal y el otro en hexadecimal o binario, la multiplicación se va a realizar satisfactoriamente.

Javicho.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #3 en: 14 de Julio de 2008, 16:16:07 »
Hay que tener cuidado con el "DATO_PC", tal como lo ha puesto javicho, debe ser el dato recibido ya convertido a hexadecimal. Es posible que lo que estés recibiendo de la PC sea el valor ASCII para el dato en cuestión.
Un cordial saludo, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Carls_UPV

  • PIC10
  • *
  • Mensajes: 3
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #4 en: 14 de Julio de 2008, 19:08:52 »
* migsantiago:
Gracias por la bienvenida  :mrgreen:, aqui os pongo los datos que creo de mayor interés:

- Lenguaje de programación del pic y del pc: C, y Visual basic correspondientemente
- Compilador de ese lenguaje: Mplab.

Javicho y firepic muchas gracias, pero fallo mio, deberia haber dicho que el lenguaje con el que programo el pic es C, con la ayuda del Mplab.

Un saludo y gracias de antemano por el apoyo!! :-)

PS: He dicho ya lo bueno que es este foro??  :mrgreen:

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #5 en: 14 de Julio de 2008, 19:36:32 »
Uf qué tonto, lo olvidé... bienvenido al foro Carlos! (Más vale tarde que nunca  :D )
Y por cierto, excelente que trabajes en C!  :-/
Si estás enviando un valor serialmente, puedes guardarlo en una variable tipo string con la instrucción "gets". Para ello debes enviar el ascii de cada caracter que forma el número. Por ejemplo, si vas a enviar 3.14, enviarías "3",".","1","4".  :lol:
Luego puedes convertir la cadena usando las funciones que trae el CCS para strings: atoi, atol, atof, que convierten a int, long int o float, respectivamente.

Sería algo así:
Código: C
  1. char cadena[10];  //Declaras la cadena de caracteres donde guardarás lo recibido vía serial.
  2. float numero; //Declaras la variable donde guardarás el número
  3.  
  4. gets(cadena);  //Recibes del puerto serial                
  5. numero=atof(cadena);   //Conviertes la cadena a número

Aquí estoy poniendo como ejemplo pasar a float, pero puede ser a int o long int, dependiendo de tus requerimientos.
Y con eso sería todo, ya podrías usar el valor que está en la variable "numero" para hacer las operaciones que desees.
Espero que esto te ayude, no olvides publicar tus avances e informar si resuelves tu problema.

Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Carls_UPV

  • PIC10
  • *
  • Mensajes: 3
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #6 en: 15 de Julio de 2008, 13:04:19 »
Ok! Más o menos me ha quedado claro, pero creo que poniendolo así también sería posible:

int x;  //inicializamos la variable como un entero

x=0x00;    //ahora la tendríamos en hexadecimal, y ya podriamos utilizarla para sumarla con otros hexadecimales


La movida que se me plantea ahora es la siguiente, por el puerto serie envio dos bytes separados:

EE_desdeH, EEdesdeL. Que corresponderian a la parte alta o baja del valor de recarga de el Timer 0 en este caso. El tema es que esa temporización sólo la voy a gastar una vez. De manera que según vayan ocurriendo eventos este valor de recarga del T0 variará según una formula siguiente:

Valor_de recarga_actual = EE_desde - ( x * Reducción_deseada ); //si os fijais x es el valor que varia según los eventos, que hemos convertido anteriormente en hexadecimal.

La cuestión es que las variables  EE_desdeH y EEdesdeL, las necesito juntar en la misma variable apra poder hacer la fórmula correctamente.

No se si me he explicado, cualquier duda preguntadme!!!!

Un saludooo!!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo pasar de decimal a exadecimal con el PIC.
« Respuesta #7 en: 15 de Julio de 2008, 14:59:48 »
Carlos, creo que tienes un enredo con los hexadecimales y decimales.
Lo digo por esto que mencionas, entre otras cosas:

]x=0x00;    //ahora la tendríamos en hexadecimal, y ya podriamos utilizarla para sumarla con otros hexadecimales

Viejo, x=0x00 es lo mismo que decir x=0.
CCS o cualquier otro compilador de C sólo es eso, un compilador, pero no olvides que el microcontrolador sólo entiende valores binarios. Así que cualquier variable que tengas almacenada en el micro, está almacenada como ceros y unos, ahora que el compilador pueda interpretar eso como decimal, hexadecimal, o lo que sea... eso es otra cosa.
Te voy a ejemplificar a ver si me explico mejor:
Código: C
  1. int a,b,c;  //Definimos cada variable como entero (o sea, cada valor ocupa 1byte)
  2. a=15;      //Asignamos a "a" el valor decimal 15 (hexadecimal 0x0f)
  3. b=0xbf;    //Asignamos a "b" el valor hexadecimal 0xbf (en decimal 191)
  4. c=a+b;    //Sumamos a y b (no importa cómo hayamos asignado los valores, si en decimal o hexadecimal)
  5.                  //El resultado de la suma será 206 (en hexadecimal 0xce).

En este ejemplo, el valor de "c" está en el pic obviamente en binario, con el compilador puedes decirle cómo mostrarlo.
Por ejemplo, si haces:
Código: C
  1. printf("%X",c);
Verás: CE (en hexadecimal).
Pero si haces:
Código: C
  1. printf("%u",c);
Verás: 206 (en decimal).
El compilador hace lo necesario para mostrar en un formato u otro.
Así que tu problema, de tratar decimales o hexadecimales, en realidad no existe.

Ahora bien, si no vas a recibir caracteres ascii como te mencioné antes, sino el valor hexadecimal de la parte baja y alta del número, pues creo que bastaría con:

Código: C
  1. long int EE_desde; //Defines EE_desde como variable entera 16bits
  2. int *ptr;
  3. ptr=&EE_desde;   //puntero a la parte baja de EE_desde
  4. getc(EE_desdeH); //Recibes serialmente parte alta
  5. getc(EE_desdeL); //Recibes serialmente parte baja
  6. EE_desde = EE_desdeH; //Guardas EE_desdeH en parte baja de EE_desde
  7. EE_desde=EE_desde<<8; //Lo pasas a la parte alta de EE_desde
  8. memcpy(ptr,&EE_desdeL,1); //Copias EE_desdeL en la parte baja de EE_desde

Ok espero te sirva.
Un cordial saludo, nos leemos!  :mrgreen:
« Última modificación: 15 de Julio de 2008, 15:05:02 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web