TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: badtzdizzy en 24 de Mayo de 2004, 23:15:00

Título: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: Abago 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...
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: Abago 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...
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy 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
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pikman 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
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pocher 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pocher 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: adolfoadc 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pikman 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

Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pocher 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy 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.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: Abago 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...?
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pikman en 27 de Mayo de 2004, 11:56:00
OK, pues lo que sucede es sencillo, tu variable duty esta definida como entero de 8 bits y el compilador la convierte en forma automatica, la desventaja de lo que estas haciendo es que solo podras ingresar 1 digito, y no de 0 a 1023 como lo permite el modulo CCP,

saludos

ARIEL
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pocher en 27 de Mayo de 2004, 12:36:00
El máximo Duty que vas a conseguir es con el entero 9.

Según la frecuencia que has elegido para el PWM:

Dutymín=0.25us (entero 1)

Dutymáx=51us (entero 255)
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy en 27 de Mayo de 2004, 13:57:00
Que podría hacer entonces para poder tener control desde el numero 0 hasta el 255 ?  Tendría que mapear en el pic para conseguir estos valores ?  Gracias por sus consejos

Lo que yo uso en visual es esto:

Chr Function
     

Returns aString containing the character associated with the specifiedcharacter code.

Syntax

Chr(charcode)

The required charcodeargument is aLong that identifies a character.

Remarks

Numbers from 0 – 31 are the same as standard, nonprintableASCII codes. For example, Chr(10) returns a linefeed character. The normal range for charcode is 0 – 255. However, onDBCS systems, the actual range for charcode is -32768 to 65535.

Note   The ChrB function is used with byte data contained in a String. Instead of returning a character, which may be one or two bytes, ChrB always returns a single byte. The ChrW function returns a String containing theUnicode character except on platforms where Unicode is not supported, in which case, the behavior is identical to the Chr function.


Entonces segun yo pues le mando al pic el ascii de los valores entre 0 y 255 y entonces el pic me los interpreta como enteros tambien de 0 a 255
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: pikman en 27 de Mayo de 2004, 22:13:00
Bueno, es que me parece que no interpretaste lo que que espuse ademas pocher te envio un provado, si implementas en tu rutina mi ejemplo, podras introducir no solo un entero de 8 bit si no que puedes usar una word y asi extender el valor hasta 1023 como maximo, no te compliques con el VB, envia los tres o cuatro digitos desde VB guardalos en una cadena y luego lo conviertes al un entero, al contrario de lo que dice un colega mas arriba, usando C es mas facil resolver esto que desde VB,

saludos

ARIEL
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy en 28 de Mayo de 2004, 09:49:00
okey, lo hago y les aviso que tal salió. GRACIAS a todos
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: kruskal en 28 de Mayo de 2004, 20:09:00
La solucion es sencilla, para aprovechar la variacion que permite el PWM1 de 0  1023 tienes ocupar una sencilla regla de tres. Como cada caracter es un valor por ejemplo A es en decimal 65 (0x41) y Z es 90 (0x5A), aplica una sencilla regla de tres asignando a Z o A el valor 1023.

me parece que vas a controlar con caracters el PWM por lo que utilizar la funcion Atoi es inutil.


Salud2

kruskal@hotmail.com
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy en 31 de Mayo de 2004, 11:21:00
Hola

Pues hice los cambios y el programa quedó, solo tengo un pequeño problemita y es que al momento de enviar el dato pues se enciende el led pero a los pocos segundos y a veces hasta en menos tiempo se apaga hasta que vuelvo a presionar el boton para enviar el dato. Esto no sucedía cuando enviaba caracteres. Así que no se si se deba a que se vacíe el buffer y llegue un cero. De antemano gracias por la ayuda.
El código de C quedó como me lo mandaron y al de visual solo tuve que cambiar esta línea

MSComm1.Output = Chr(duty)

por esta otra

MSComm1.Output = CStr(duty) & vbCr
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy en 31 de Mayo de 2004, 12:05:00
Pues leyendo el manual CCS C, encontré que al final de leer la cadena se manda un cero. ¿Será por eso que se apaga el led? Por favor aclarenme esa duda.

¿ Acaso será mejor hacer la recepción mediante un ciclo ? si es así cómo le podría hacer porque la verdad no se ni por donde.

De antemano gracias
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: Xa2 en 16 de Junio de 2004, 14:37:00
Buenas foreros!!
Y como hago para una vez obtenido el duty, poder mandar al PC numeros decimales??es decir, como se pasaria de entero a ASCII??? hay alguna funcion especifica??
Saludos y gracias!!!

PD: La siguiente funcion se podria hacer??
dutyreal=(duty*60)/100
Decirme si podria ser por favor!!! Hasta pronto!!
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: badtzdizzy en 17 de Junio de 2004, 14:23:00
Pues yo hice la prueba y si tu mandas directamente un valor entero a través del pin de transmisión del pic, al llegar al visual solo ejecutas el comando Asc y te lo convierte al valor que tu enviaste originalmente. Por ejemplo: mandas el 10 en el pic, entonces el visual recibiría el ascii de ese valor, por lo que tu tendrías que hacer lo siguiente:

dato=Asc(MSComm1.input)

que te estaría guardando ya el valor convertido en entero en la variable dato. Espero no haberte confundido mas.
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: Xa2 en 18 de Junio de 2004, 12:21:00
Muchas Gracias, pero mi duda para poder visualizarlo en el hiperterminal, aunque luego se programaría con Visual BAsic, entonces, si que me valdria tu consejo!!
Gracias de nuevo y saludos!!!
Título: RE: Se puede convertir de ascii a decimal ?
Publicado por: al303576 en 19 de Junio de 2004, 17:30:00
Pues en ralidad es sencillo ... (en asm)
Como sabes los caracteres ascii de los numeros (0 al 9 ) estan codificados en binario ....mmmmm de una foma muy facil paraconbertir a numero
para convertir un caracter ascii a numeor solo limino los 3 bit mas significativos .... esto lo puedes hacer con una operacion AND con los bits menos sinificativos,.....
que enredo...
mejo deja lo escribo
Codigo:

b="1" ;
a=b"00001111"
b =a and b


y listo lla tienes el numero del codigo ascii
el codigo de aribita no esta ni en c ni en asm solo es para ilustrar eh!!
en asm quedaria como sigue
Codigo:

movlw b"00001111"
andwf ascii,f   ;ascii es el dato que queires convertir


saludillos
see you later .... may be je je