Autor Tema: Conversión de un valor ingresado por módulo UART a entero  (Leído 435 veces)

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

Desconectado Alejandrohd199z

  • PIC10
  • *
  • Mensajes: 5
Conversión de un valor ingresado por módulo UART a entero
« en: 21 de Junio de 2020, 06:49:52 »
Buen día a todos, quisiera saber si alguien me puede apoyar en la conversión de un valor ingresado vía UART para en base a este poder cargar en el RTC ds1307 valores de hora y fecha, estoy utilizando el dsPIC33FJGP202, en especial los módulos de comunicación serie ya sea asíncrona con el UART, para atrapar los datos y I2C para escribir en el ds1307, ya intenté de muchas formas realizar la conversión de lo que recibo a entero y obviamente después a BCD debido a que el ds1307 envía y recibe información en este formato, pero no he podido realizar esta conversión con éxito solamente la inicial para mostrar una fecha y hora por defecto me funciona, estoy trabajando con el software MikroC

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #1 en: 21 de Junio de 2020, 10:12:16 »
indica como llegan los valores (es decir como te llegan los valores desde la UART) y como queres que salgan. Con algun ejemplo (para no estar buscando el datasheet del DS1307)

Desconectado Alejandrohd199z

  • PIC10
  • *
  • Mensajes: 5
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #2 en: 21 de Junio de 2020, 13:23:03 »
Llegan en forma de carácter es decir si ingreso un 23 me llega 0x32 0x33, aclaro que estoy realizando comunicación entre la PC y el dsPIC vía UART y para el ds1307 uso I2C

Desconectado Alejandrohd199z

  • PIC10
  • *
  • Mensajes: 5
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #3 en: 21 de Junio de 2020, 13:24:55 »
Y quiero dejarlos en el formato BCD  para cargarlos en los registros del ds1307, aunque mi idea es lo que llegue de la UART convertirlo a decimal y con la librería del mikroC pasarlo a BCD

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #4 en: 21 de Junio de 2020, 15:06:16 »
Si se que llegan en formato ASCII, el problema es que no me estas diciendo como llega toda la trama que deseas cargar. Ni se que queres enviar... por ejemplo
Si quisiera cargar la hora,minuto,segundo, dia, mes y año podria enviarlo de miles de formas. Por ejemplo:

23110001012020
23:11:00 01/01/2020
23:11:00 01/01/20
23:11:00/01/01/2020
23,11,00,01,01,2020
01,01,2020,23,11,00
etc

Desconectado Alejandrohd199z

  • PIC10
  • *
  • Mensajes: 5
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #5 en: 21 de Junio de 2020, 15:14:02 »
Una disculpa quiero cargar la hora xx:xx:xx y la fecha día/mes/año

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #6 en: 21 de Junio de 2020, 15:24:19 »
Pero todo junto? hay algo que los identifique ? O envias y que el micro se encargue ?

Desconectado Alejandrohd199z

  • PIC10
  • *
  • Mensajes: 5
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #7 en: 21 de Junio de 2020, 16:00:15 »
En un inicio cargo la fecha y hora (siempre formato 24 hrs) por ejemplo las envío 12, 06, 22 y la hora 15,30,55 para después visualizar en una LCD del siguiente modo 12/06/22 y la hora 15:30:55, y en el UART atrapo por ejemplo para la fecha el dia: 23, el mes:06, y el año:20 y al momento de cambiar esos valores a decimal es donde cometo el error debido que por razones del ds1307 lo convierto a BCD, para visualizar en la LCD siempre estoy leyendo del ds1307 y convirtiendo lo que leo en ASCII para visualizar de forma correcta y ahí no tengo el error porque la primer fecha que le envio es decir cuando inicializo las variables si se visualiza de forma correcta

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 450
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #8 en: 22 de Junio de 2020, 03:17:36 »
Primero tendrias que parsear las cifras desde las tramas UART y convertirlas a INT con una funcion tipo: atoi(); u otros medios.

 Una vez que tienes las cifras convertidas a entero, lo tienes que convertir a BCD en base hexadecimal, las siguientes funciones sirven para ello:

Código: C
  1. int dec_bcd(int dato) {                 // Decimal a BCD^hex
  2.  int  decenas = dato / 10;
  3.  int  unidades = dato - (decenas * 10);  
  4.  int  resultado = 16 * decenas;
  5.  resultado += unidades;
  6.  return resultado;  
  7. }
  8.  

El resultado de la función anterior ya está listo para cargar en el registro correspondiente del rtc.

Y esta otra función hace lo contrario, lees del RTC y te convierte el valor bcd hexadecimal en un entero:

Código: C
  1. int bcd_dec(int dato) {
  2.     int dat = (dato / 16) * 10;           // BCD^hex a INT.
  3.     dat += (dato % 16);
  4.     return (dat);
  5. }
  6.  
« Última modificación: 22 de Junio de 2020, 03:23:35 por remi04 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #9 en: 22 de Junio de 2020, 10:40:02 »
Citar
Primero tendrias que parsear las cifras desde las tramas UART y convertirlas a INT con una funcion tipo: atoi(); u otros medios.

El problema es identificar que esta enviando...

Recibirlo es sencillo. Suponiendo que en RX tengo mi dato recibido

valor *= 10;
valor = RX - 0x30;


Hacerlo cada ves que entre un dato.... Y cuando pase el segundo dato ya tenes el entero en valor.
Suponiendo que envie las horas, minutos y segundos entonces, falta el codigo de asegurarse que sean numeros, de revisar el indice que no se pase, se puede hacer con punteros, etc:

Código: C
  1. int i = 0, index = 0;
  2. int valor = 0;
  3. int datos[6];
  4.  
  5.  
  6. //recepcion
  7. valor *= 10;
  8. valor += RX - 0x30;
  9. i++;
  10. if (i) {
  11.   datos[index] = valor;
  12.   i = 0;
  13.   index++;
  14.   valor = 0;
  15. }

Pero eso no lo dejaria como BCD, si lo quisiera directamente en BCD, entonces:


Código: C
  1. int i = 0, index = 0;
  2. int valor = 0;
  3. int datos[6];
  4.  
  5.  
  6. //recepcion
  7. valor <<= 4;
  8. valor += RX - 0x30;
  9. i++;
  10. if (i) {
  11.   datos[index] = valor;
  12.   i = 0;
  13.   index++;
  14.   valor = 0;
  15. }

Y los tendria en BCD.

Nuevamente recalcar que falta mucho codigo para determinar que se esta enviando, discriminar los separadores, etc.

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 450
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #10 en: 22 de Junio de 2020, 11:19:44 »
Claro. Falta saber cómo es la trama que recibe, aunque doy por sentado que eso ya lo tiene controlado el.

  Respecto al BCD, en verdad los DS trabajan cada campo como un valor absoluto de lo que representa, pero en base 16.

  Por ejemplo, los minutos, van en el registro 1 de 8 bits y su valor vale de 0 a 59 pero tienes que pasárselo con base hexadecimal:

    Si quieres grabar un 10, para grabar que son 10 minutos tienes que pasarle un 16.
  Para 11 , un 17.   Sucesivamente.

 
   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #11 en: 22 de Junio de 2020, 12:25:45 »
Citar
  Por ejemplo, los minutos, van en el registro 1 de 8 bits y su valor vale de 0 a 59 pero tienes que pasárselo con base hexadecimal:

    Si quieres grabar un 10, para grabar que son 10 minutos tienes que pasarle un 16.
  Para 11 , un 17.   Sucesivamente.

Es en BCD, es decir si quiero 10 minutos, necesito sobre los bits4 a 7 poner un 1, y un 0 en los bits 0 a 3, es decir 0x10, el 59 seria 0x59

Al menos en los codigos que vi, y en el datasheet no dice nada de hacerlo como vos decis..

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 450
Re:Conversión de un valor ingresado por módulo UART a entero
« Respuesta #12 en: 23 de Junio de 2020, 03:21:24 »
Citar
  Por ejemplo, los minutos, van en el registro 1 de 8 bits y su valor vale de 0 a 59 pero tienes que pasárselo con base hexadecimal:

    Si quieres grabar un 10, para grabar que son 10 minutos tienes que pasarle un 16.
  Para 11 , un 17.   Sucesivamente.

Es en BCD, es decir si quiero 10 minutos, necesito sobre los bits4 a 7 poner un 1, y un 0 en los bits 0 a 3, es decir 0x10, el 59 seria 0x59

Al menos en los codigos que vi, y en el datasheet no dice nada de hacerlo como vos decis..

  Es lo que yo decía arriba. Si quiero 10 minutos tengo que poner 0x10
  0x10 == 16.

   Es decir, es BCD hexadecimal.   

  Lo puedes tratar directamente en hexadecimal, pero si lo quieres tratar en tu código en decimal no hay más remedio que hacer una conversion de bases.  La forma que yo he puesto es una de ellas aunque haya muchas y de hecho es la que uso en todos mis programas con los rtc (1307) en mi caso que es el que más utilizo.  Pero suele ser igual en todos ellos.

   


 

anything