Autor Tema: Se puede convertir de ascii a decimal ?  (Leído 22302 veces)

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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Se puede convertir de ascii a decimal ?
« en: 24 de Mayo de 2004, 23:15:00 »
Hola...

Quisiera saber si puedo convertir un caracter ascii que mando a la pata de recepción del pic, lo que pasa es que necesito pasar ese valor a decimal para poder controlar el ciclo de trabajo de la señal PWM.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Se puede convertir de ascii a decimal ?
« Respuesta #1 en: 24 de Mayo de 2004, 23:34:00 »
Creo recordar, que el valor decimal del codigo ascii 48 es el 0 decimal....

por lo tanto, para ascii desde 48 hasta 57 podrías convertir los caracteres decimales de 0 a 9....


para la recepción de numeros en ascii, la función sería simple...
(caracter ascii del número - 48 ) = número decimal...

No se si te servirá, o te referías a otra cosa...

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Se puede convertir de ascii a decimal ?
« Respuesta #2 en: 25 de Mayo de 2004, 14:30:00 »
Pues yo creo que si me va a servir, lo que sucede es que desde visual estoy sacando por el puerto serial un caracter ascii, mismo que será recibido por el pic, lo que no sabía era como manipular ese dato, ya que lo necesito para colocarlo como valor en el duty del pwm. Espero me entiendas. De antemano gracias.

El codigo que estoy utilizando para el pic es este:

Codigo:

#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  

main()
{

char value;
char string;
int duty;

while (TRUE)
 {
  value = getc();
  if (value=="j")
    {
     output_high(PIN_B7);
     setup_ccp1(CCP_PWM); //se habilita el pwm
     setup_timer_2(T2_DIV_BY_1, 255,1); //se establece el valor de la frecuencia
     string=getc();
     duty=(string-48);    
     set_pwm1_duty(duty); //se establece como variable el ancho de pulso
    }
 }  
}




Revisamelo porfa y si ves algo mal pues echame la mano, te lo agradecería bastante.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Se puede convertir de ascii a decimal ?
« Respuesta #3 en: 25 de Mayo de 2004, 18:56:00 »
No me lo puedo creer!!! Pero te voy a responder a la pregunta y voy a revisar el código, sin nunca haber programado C para pic...

Bueno, aparentemente declaras la variable value como caracter...
PERO!!!!
lo que estás guardando es el valor ascii del caracter...
entonces en la sentencia if, estás comparando contra "j" pero deberías comparar contra el valor ascii de J
if value === 98   creo que así debería funcionar....
ha puesto 98, porque ahora no tengo la tabla ascii a mano, pero el 98 no corresponde a la j...

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Se puede convertir de ascii a decimal ?
« Respuesta #4 en: 25 de Mayo de 2004, 21:43:00 »
Hola

Pues en si, esa parte del envío de la "j" lo hago como caracter y ese si se me respeta, yo desde visual mando la "j" para iniciar la comunicación y hasta ahí vamos bien. Mi problema comienza al tratar de cambiar el valor que le llega al pic, siendo este valor el que se utilizará en la variable duty del pwm. Ya hice lo que me dijiste pero como que no pasa nada. El problema está en esta parte del código

Codigo:

string=getc();
     duty=(string-48);    
     set_pwm1_duty(duty); //se establece como variable el ancho de pulso


Es mas, yo solo quiero obtener un valor entero entre 0 y 255

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Se puede convertir de ascii a decimal ?
« Respuesta #5 en: 25 de Mayo de 2004, 23:23:00 »
Hola, pues lo que veo es que tu variable string simpre sera 1 solo carater, entonce si envias 34 en ascii, el valor que estas poniendo es 34-0x30 = 4, funciona pero no produce ningun efecto porque es pequeño el valor para el PWM , lo que tienes que hacer es usar una funcion que se llama ATOI  que convierte un string en un valor entero (respuesta a tu pregunta ), entonces declara tu variable string[3] por ejemplo envia un valor desde VB y aplica la funcion, fijate que solo puede poner hasta 10 bits, para mas informacion consulta por esta funcion en el manual de CCS no dudo que funcione pero inclusive encontraras ejemplos.

espero te sriva.

saludos

Ariel
saludos
PikMan

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Se puede convertir de ascii a decimal ?
« Respuesta #6 en: 26 de Mayo de 2004, 06:18:00 »
Vamos a dar otra opinión diferente.

Lo que yo creo que sucede es que el valor de j es el que siempre se le asigna a string (mal rollo) y tú creo entender que lo que quieres es enviar el caracter j para iniciar la comunicación, pero luego poder mandar otro caracter (un número), que será tu Duty.

Lo que creo que debieras hacer es detener el programa con kbhit():

while(1)
{
while(!kbhit());    //Espera la recepcion de un caracter
value=getc();
 if (value=="j")
{ output_high(PIN_B7);
while(!kbhit());
string=getc();
//Usa la función ATOI para pasarlo a entero
duty=stringentero;   //El caracter ascii recibido pasado a entero
set_pwm1_duty(duty);
}

A otra cosa:

El setup_ccp1(CCP_PWM); y el setup_timer_2(T2_DIV_BY_1, 255,1); ponlos en el main

Prueba y cuentas.

PD. Se me olvidaba. Pikman te envié el mismo día que recibí tu mensaje un programa para lo de la tarjeta, 3 o 4 días después te envié otro privado para ver si lo habías recibido. Lo pongo ahora aquí para ver si hay más suerte y me contestas diciéndome que lo has recibido.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Se puede convertir de ascii a decimal ?
« Respuesta #7 en: 26 de Mayo de 2004, 10:51:00 »
Hola

Pues hice lo que me dijeron y pues no manda nada a la salida del pwm, en otras palabras el led que coloqué ahí pues no enciende. Espero haber hecho lo que me dijiste pocher este es el codigo:
Codigo:

#include <16f874A.h>
#include <stdlib.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  

main()
{

char value;
char string;
int duty;
setup_ccp1(CCP_PWM); //se habilita el pwm
setup_timer_2(T2_DIV_BY_1, 255,1); //se establece el valor de la frecuencia

while (TRUE)
 {
  while(!kbhit()); //Espera la recepcion de un caracter
  value=getc();
  if (value=="j")
    {
     output_high(PIN_B7);
     while(!kbhit());
     string=getc();
     duty=atoi(string); //Usa la función ATOI para pasarlo a entero
     set_pwm1_duty(duty); //El caracter ascii recibido pasado a entero establecido como ciclo de trabajo
    }
 }  
}


Tal vez mi error lo tengo en el mismo visual donde mando la "j" para iniciar la comunicación pero no espero datos de regreso, sino que al mismo tiempo envio el dato que será asignado a la variable duty. Para esto tomo el valor numérico de un control de perilla y lo mando por el puerto serie pero como ascii.  Tal vez ahí esté el problema. Espero me corrijan mis errores por favor.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Se puede convertir de ascii a decimal ?
« Respuesta #8 en: 26 de Mayo de 2004, 11:30:00 »
Si tengo un rato te lo pruebo con PROTEUS. Eso sí el programa está hecho para pasarle al Duty el valor entero de un solo caracter ASCII.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Se puede convertir de ascii a decimal ?
« Respuesta #9 en: 26 de Mayo de 2004, 11:57:00 »
Sale, muchas gracias, de todos modos voy a ver que le puedo corregir al programa de visual.

adolfoadc

  • Visitante
RE: Se puede convertir de ascii a decimal ?
« Respuesta #10 en: 27 de Mayo de 2004, 07:26:00 »
Porque no tratas el problema en visual desde el ordenador y envias el valor en hexadecimal, es decir, si quieres que el micro reciba un valor hexadecimal de 0x31 envias desde el pc el ascii correspondiente a 0x31. Hay rutinas en visual para pasar de una base a otra. Complicate todo lo que necesites en el PC y deja lo mas facil para el micro.

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Se puede convertir de ascii a decimal ?
« Respuesta #11 en: 27 de Mayo de 2004, 09:17:00 »
Esta es mi propuesta prueba deberia funcionar

                char string[4];
   int x;



   gets(string);  // guarda carateres en string hasta que recibe CR
   x = atoi(string);  // x es ahora un valor entero

             
               de esta manera debes enviar CR ( 0x0D) al final
               para salir del bucle de gets(), segun lo que
               entiedno si tipeas 1,8,5 x seria = 185

   ver pagina 66 del manual de CCS

saludos

pikman

saludos
PikMan

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Se puede convertir de ascii a decimal ?
« Respuesta #12 en: 27 de Mayo de 2004, 09:42:00 »
Sí Pikman, así funciona. Esa es la solución que le he mandado por privado esta mañana.

De nuevo y a verrrrr si lo lees, te digo:

PD. Se me olvidaba. Pikman te envié el mismo día que recibí tu mensaje un programa para lo de la tarjeta, 3 o 4 días después te envié otro privado para ver si lo habías recibido. Lo pongo ahora aquí para ver si hay más suerte y me contestas diciéndome que lo has recibido.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Se puede convertir de ascii a decimal ?
« Respuesta #13 en: 27 de Mayo de 2004, 10:29:00 »
Pues no se que pasó pero chequen lo que hice en mi código:
Codigo:

#include <16f874A.h>
#include <stdlib.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  

main()
{

char value;
int duty;
setup_ccp1(CCP_PWM); //se habilita el pwm
setup_timer_2(T2_DIV_BY_1, 255,1); //se establece el valor de la frecuencia

while (TRUE)
 {
  while(!kbhit()); //Espera la recepcion de un caracter
  value=getc();
  if (value=="j")
    {
     output_high(PIN_B7);
     while(!kbhit());
     duty=getc();
     //duty=atoi(string); //Usa la función ATOI para pasarlo a entero
     set_pwm1_duty(duty); //El caracter ascii recibido pasado a entero  
    }
 }
}


Al quitar la parte de la transformación del atoi y pasar directamente lo recibido a la variable duty, ya pude variar la intensidad del led. Si alguien me puede explicar que esta sucediendo pues lo agradecería mucho.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Se puede convertir de ascii a decimal ?
« Respuesta #14 en: 27 de Mayo de 2004, 11:26:00 »
aparentemente, estás pasando el valor entero del valor ascii recibido por el puerto...
porque no después de recibir el valor, lo guardas en la eeprom y luego lo lees para depurar...?