Autor Tema: Convertir variables char a int16  (Leído 5291 veces)

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

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #15 en: 19 de Abril de 2014, 13:38:29 »
Una pregunta las variables valor y duty son globales? o estan dentro de alguna funcion? que no te funciona?

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #16 en: 19 de Abril de 2014, 13:46:47 »
Son variables globales que estan fuera de la funcion void main() y las de interrupciones seriales, no me funciona el casting al recibir datos seriales y convertirlos como me dijiste  :(

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #17 en: 19 de Abril de 2014, 14:20:37 »
Yo lo probe sin la interrupcion como te lo pase y me funciona   :mrgreen:, lo estas probando a nivel de simulacion, con el proteus? que te aparece en la pantalla?

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #18 en: 19 de Abril de 2014, 14:42:20 »
Bien a mi tambien me funciono sin interrupciones osea:

   while(TRUE)
   {
      valor=getchar();
      delay_ms(10);
      duty=(int16)valor;
      printf("%Lu",duty);
      printf(lcd_putc,"%Lu",duty);
   }

Pero veo que me lo muestra en codigo ASCII, osea el valor decimal por ejemplo 48 = 1
Pero lo que quiero es que obtenga de numero de 4 digitos tipo char y se transforme en entero

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #19 en: 19 de Abril de 2014, 14:52:40 »
No entiendo bien lo que deseas hacer.
A ver quieres introducir solo numeros de 4 digitos en ascii y luego convertirlos a enteros?
Lo que te pase convierte un caracteres o numero, solo uno, en un int16.

Explicame un poco mejor.

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #20 en: 19 de Abril de 2014, 15:17:02 »
Si, mira, exactamente quiero variar el PWM del PIC desde la PC, mando valores de 0 a 1024 osea la resolución máxima de salida del CCP1 a 10 bits, para ello mando
un numero tipo char de la PC al PIC osea el "Duty cycle", por lo que necesito convertir ese numero de 1, 2, 3 o 4 cifras a un entero largo para ponerlo en la instruccion:

 set_pwm1_duty(duty);  //Donde duty es una variable global int16


Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #21 en: 19 de Abril de 2014, 15:20:59 »
Si, mira, exactamente quiero variar el PWM del PIC desde la PC, mando valores de 0 a 1024 osea la resolución máxima de salida del CCP1 a 10 bits, para ello mando
un numero tipo char de la PC al PIC osea el "Duty cycle", por lo que necesito convertir ese numero de 1, 2, 3 o 4 cifras a un entero largo para ponerlo en la instruccion:

 set_pwm1_duty(duty);  //Donde duty es una variable global int16

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #22 en: 19 de Abril de 2014, 15:31:52 »
  Antes que nada, deberíamos saber como estas enviando los datos desde el PC. Si los mandas desde una terminal (tú colocas un número y presionas "enter"), seguramente terminarán con el caracter de retorno de carro (decimal 13). Ahora, si los envías apenas presionas un tecla o desde un programa propio el asunto cambia.

  Para el primer caso, puedes utilizar la función fgets -que creo espera hasta el caracter de retorno de carro- (deberías buscar en el manual del compilador) y eliminar el último caracter como te he mencionado.
  Para el segundo caso, puedes implementar tu mismo el armado de tu "palabra" contando la cantidad de datos recibidos y almacenándolos en posiciones sucesivas de un array.

  Luego conviertes la palabra completa con atoi o atol según sea necesario.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #23 en: 19 de Abril de 2014, 15:34:21 »
ok entonces muy sencillo   :shock:
Primero utiliza gets()  para capturar el string de los datos que vas a enviar.
Luego utiliza atol para convertir el string que contiene el numero en un int16 y listo!   :mrgreen:

En resumen como dice angelGris.

Saludos

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #24 en: 19 de Abril de 2014, 15:54:06 »
Por su puesto, y estas en lo cierto AngelGris, mi idea por un momento fue esa: Los datos los envío desde un programa llamado "LabVIEW", en el que de un control numérico, lo convertía a caracter y lo desconcatenaba, enviando el primer digito de la PC al PIC y guardandoló como dices en un arreglo tipo char, hasta juntar los cuatro digitos correspondientes al valor maximo en este caso 1024 y convirtiendolos en entero con atol, pero note un problema, al haber 3, 2 o un digito, se me recorren algunos numeros y la conversion no sale correcta, debido a que cuando por ejemplo cuando tengo el numero 12 las demas posiciones estan en blanco y como que no me lo realiza bien. Por lo que estoy intentando resolver ese problema pero aun no le doy jeje. Gracias por sus ayudas  :D Saludos

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #25 en: 19 de Abril de 2014, 16:31:06 »
En tu programa de labview despues de enviar los caracters envias el \r (carrier return) para que el gets() detecte el final del string y luego con atol lo conviertes en int16   :mrgreen:

Podrias probar en principio con el hiperterminal o similar para que veas que funciona   :mrgreen:

Saludos

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #26 en: 28 de Abril de 2014, 18:04:12 »
Pues por ahora tengo esto:   :-/


char valor1,valor2,valor3,valor4;
int8 dig1,dig2,dig3,dig4;
int16 duty[4];

#INT_RDA
void serial_isr()
{
   valor1=getchar();
   dig1=valor1-48;
   duty[0]=dig1;
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%u",dig1);
   delay_ms(10);
   
   valor2=getchar();
   dig2=valor2-48;
   duty[1]=dig2;
   lcd_gotoxy(3,2);
   printf(lcd_putc,"%u",dig2);
   delay_ms(10);
   
   valor3=getchar();
   dig3=valor3-48;
   duty[2]=dig3;
   lcd_gotoxy(5,2);
   printf(lcd_putc,"%u",dig3);
   delay_ms(10);
   
   valor4=getchar();
   dig4=valor4-48;
   duty[3]=dig4;
   lcd_gotoxy(7,2);
   printf(lcd_putc,"%u",dig4);
   delay_ms(10);
}

Almaceno cada digito que envio de la PC al pic, numero por numero, lo convierto de string a int y lo almaceno en posiciones sucesivas de un array en este caso duty[4] que es un arreglo tipo entero. Mi problema ahora es jeje como convierto ese array tipo entero en un numero comun jeje como 1024 o 3


 

anything