Autor Tema: pasar cadena a float o int  (Leído 6821 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: pasar cadena a float o int
« Respuesta #15 en: 16 de Febrero de 2011, 14:17:16 »
Te debiera de funcionar. Revisa conexiones, cristal de 20Mhz, 9600 baudios...

Si lo que quieres es recibir 15 caracteres por ejemplo, porque no los vas guardando e incrementando en la interrupción y en el while haces: si x==15 hacer tal y tal, seguido del borrado del buffer.

O también en el while si lectura==CR hacer tal y tal.

No es necesario que borres el CR, tan solo guarda la cadena que va delante del CR.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #16 en: 16 de Febrero de 2011, 15:09:28 »
hola pocher, nose en que me equivoco pero el punto es que no me quiere salir en la pantalla lo que llega al bufer, lo unico que logro es tener una variacion de 12 a 255, arrojando este ultimo como lectura maxima, siendo que deveria tener una variacion de 0 a 765, he recontra revisado el codigo, en conjunto con el debug y nada todo anda bien en conjunto con proteus, nose que anda mal, lo que pienso es que le estoy mandando mal el dato a la LCD. incluso modifique nuevamente el codigo.

Código: [Seleccionar]
#INCLUDE <16F877a.h>
#FUSES NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#USE delay (clock=4000000)         //clock=20Mhz
#USE rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7,bits=8) //Configuracion del puerto serie....
#DEFINE use_portd_lcd TRUE //definir portb lcd
#INCLUDE<LCD420puertD.c>  //libreria manejo lcd de 20x4 modificada por suky para el puerto D
#INCLUDE <stdlib.h>
#include <string.h>


int lectura=0x00,destino[8],dato[8];
//char convert[8];
int x=0,w=0,z=0;

#int_RDA
void  RDA_isr(void)
{
lectura=getc();                             //leo el puerto serie del pic
dato[x++]=lectura;                          //almaceno en variable dato el caracter ingresado....
                                            //he incremento en 1 para guardar le siguiente ddato....
if(lectura==0x52){                          //a llegado el caracter R...Sí... entonces....
                  dato[0]=0x00;                               //el primer caracter de la se borra del string...
                  x=0;                                        //y buelvo a posicion cero del string..
}
else if(lectura==0x0D || x==4){                     //llego el retorno de carro.. (caracter 0x13)...sí..

                              if(lectura==0x0D){
                                                z=x-1;
                                                dato[z]='\0';                               //borro el caracter de retorno de carro y lo reemplazo por..                                      //caracter nulo..
                                                strcpy( destino,dato );                     //copio el dato de recepcion serial a otra variable...
}

                    for(w=0;w<x;w++){                           //borro el buff de recepcion de dato, "dato"....
                                      dato[w]=0x00;
                                    }
x=0;                                        //pongo en la posicon cero el dato de recepcion nuevo..
   }
}

void main() {
 
////////////////////////////////////////// INICIALIZACIONES GENERALES
   lcd_init();                              //inicializa pantalla LCD
   enable_interrupts(INT_RDA);              //avilito interrupcion de resepcion serial   
   enable_interrupts(GLOBAL);               // avilito todo lo necesario...

   output_low(PIN_C0);                      //pone en cero el sensor2
   output_low(PIN_C1);                      //pone en uno el sensor1

While(TRUE){                                //infinito..........

   

   lcd_gotoxy( 1, 1);
   printf(lcd_putc,"%C%C%C",dato[0],dato[1]dato[2]);           //imprimo en LCD los datos del puerto serie.....
                                            //sin contar con la R y el retorno de carro....
   lcd_gotoxy( 1, 3);
   printf(lcd_putc,"%S",destino);
   lcd_gotoxy( 1, 4);
   printf(lcd_putc,"%i",x);
}}

saludos y espero que me puedan ayudar ya que no se que pasa

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #17 en: 16 de Febrero de 2011, 15:54:59 »
bueno despues de una tarde de estar con el debugg llege a la conclucion que es problema de transformar un numero en hex  a decimal, para que se vea por la lcd, alguien save como hacer esto, ya que los numeros que trabajo estan en hexa como digo y quiero pasarlo a la lcd en decimal ???'
« Última modificación: 16 de Febrero de 2011, 18:14:39 por japifer_22 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #18 en: 16 de Febrero de 2011, 22:31:30 »
hola les comento wue despues de una tremenda lucha para poder imprimir los datos que trabajaba en un string en forma de hex y acsii pude comprender he implementar como podia yo imprimir estos datos en la pantaalla LCD del pic, y es por medio de del prefijo %U, que sirve para imprimir enteros sin signos, y buala aparesio mi solucion. ahora solo me queda arreglar un poc mas el codigo pero para mi lo mas dificil esta hecho. gracias a todos por la ayuda otorgada, pero despues pongo el codigo cuando lo termine para que lo lean y comenten aver si voy bn.

saludos

« Última modificación: 01 de Marzo de 2011, 09:51:52 por japifer_22 »

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: pasar cadena a float o int
« Respuesta #19 en: 17 de Febrero de 2011, 03:27:14 »
Bien, me alegro que consigas avanzar.

Intenta no escribir tanto codigo en la interrupcion, es mejor (aunque funcione) que lo transportes todo al while(1).

He simulado el programa que te dije que debia de funcionar y sí que imprime en la LCD correctamente.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #20 en: 18 de Febrero de 2011, 18:46:56 »
gola gracias. pero ahora tengo otra duda y es por que me di cuenta que voy a tener activar y desactivar la resepcion, para que pueda trabajar los datos bien, es por esto que queria preguntat como puedo activar y desactivar la RDA a medida que voy obteniedo los datos que quiero ??

saludos y gracias por lo ya ayudado

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #21 en: 18 de Febrero de 2011, 21:12:25 »
hola de nuevo, les comento que me siento frustrado con lo que estoy asiendo, ya que he intentado hacer todo y no me resulta, he probado todos mis codigos en proteus y me funcionan bien, lo he debugiado y anda todo bien, pero le pongo el sensor que tiene que controlar y arroja cualquier cosa y no se por que. es por esto que les pido que me ayuden nuevamente con sus conosimientos.

como he dicho en reiteradas veces, intento de controlar 2 sensores ultrasonicos por medio de la interrupcion RDA del puerto serie del pic 16f877a, estos sensores tiran un buff de datos de 5 caracteres, los cuales el primero correspondo a una R mayuscula, seguido de tres diguitos en acsii que equivalen a la medicion del sensor, y por ultimo un retorno de carro = a 0x0D, pero lo raro es que mi codigo que lo he echo de muchas formas no me toma los valores reales que tira el sensor, que en este caso va de 0 a 765, y esto no se por que, lo que pienso ahora esque el sensor satura el puerto con tanto datos, ya que tira el buff y espera un poco y vuelve a tirar el siguiente buff con la nueva medida. reitero que todo funciona bien, incluso conecto el circuito al pc para mandar los datos y tambien funciona, pero no al conectar el sensor. esp or esto que les pido ideas para ver que puede estar pasando, y que puedo estar pasandoen alto.

saludos y espero ayuda de ustedes, cualquier idea que se les ocurra seran bienvenida.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #22 en: 18 de Febrero de 2011, 22:10:55 »
  ¿Cómo es el sensor? ¿Tiene algún pin de habilitación, o algún comando para habilitarlo o que quede en modo sleep? ¿Tenés el datasheet?

  Si te envía constantemente la información es posible que se esté llenando el registro RCREG (que es donde el PIC almacena lo que llega por el UART) y cuando quiera llegar otro dato se genere un error de overflow.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: pasar cadena a float o int
« Respuesta #23 en: 19 de Febrero de 2011, 03:24:14 »
También añadiria que pusieses el código para revisarlo.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #24 en: 19 de Febrero de 2011, 10:16:16 »
hola, bueno el sensor tieneun pin el cual sirve para que quede en estado sleep. pero me tinca que sucede lo que dice angelGris:

Citar
Si te envía constantemente la información es posible que se esté llenando el registro RCREG (que es donde el PIC almacena lo que llega por el UART) y cuando quiera llegar otro dato se genere un error de overflow.

como digo lo he probado con todo y funciona bien menos con el sensor.
les dejo el codigo y el data del sensor:

http://www.maxbotix.com/uploads/LV-MaxSonar-WR1-Datasheet.pdf

es por eso que estoy pensando en abilitat y desabilitar la interrupcion cuando me aya llegado el buffer del sensor, esto para ambos sensores,seracorrecto esto ??? y como l podria hacer ??

Código: [Seleccionar]
#INCLUDE <16F877a.h>
#FUSES NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#USE delay (clock=4000000)         //clock=20Mhz
#USE rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7,bits=8) //Configuracion del puerto serie....
#DEFINE use_portb_lcd TRUE //definir portb lcd
#INCLUDE<LCD420.c> 
#INCLUDE <stdlib.h>
#include <string.h>


char escritura=0x00,dato[8],sensor1[8];
int x=0,w=0;
float convert=0;

void copia_de_string(void){
strcpy( dato , sensor1 );
}

#int_RDA
void  RDA_isr(void)
{
escritura=getc();
if(escritura==0x52){
x=1;
}
else if(escritura==0x0D && x==1){
w=0;
x=0;
copia_de_string();
}
else if((escritura!=0x52 || escritura!=0x0D) && x==1){
dato[w]=escritura;
w++;
dato[w]='\0';
}
}

void main() { 
 lcd_init();                              //inicializa pantalla LCD
 
output_low(PIN_D1);
delay_ms(500);
////////////////////////////////////////// INICIALIZACIONES GENERALES

   enable_interrupts(INT_RDA);              //avilito interrupcion de resepcion serial   
   enable_interrupts(GLOBAL);               // avilito todo lo necesario...
   
output_high(PIN_D1);

While(TRUE){                                //infinito..........
convert=atof(sensor1);
lcd_gotoxy(1,1);
printf(lcd_putc,"%s",sensor1);
lcd_gotoxy(1,3);
printf(lcd_putc,"sensor 1 portb_LCD");
}}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #25 en: 19 de Febrero de 2011, 12:00:51 »
  Estoy leyendo el datasheet del sensor, y me parece que habría que prestarle atención a la descripción del pin 4.

"Pin 4 - (RX) This pin is internally pulled high. The MB7001 will continually measure range and output if the pin is left unconnected or held high. If held low the MB7001 will stop ranging. Bring high 20uS or more for range reading."

  Por lo que parece, si dicho pin se mantiene en estado bajo, no tomaría la medición y posiblemente no emita nada. Luego se lo vuelve a poner en estado alto por 20uS o mas y allí te envían nuevamente la medición.

  Entonces podrías dejar el loop del programa para que haga lo siguiente

hacer 1 el pin 4 del dispositivo (para activar la medición)
esperar unos 30us
hacer lectura de uart hasta que aparezca la R
hacer lectura de uart y almacenar lo leído hasta que aparezca el 13 (0x0D) (este último caracter no almacenarlo)
hacer 0 el pin 4 del dispositivo (para desactivar la medición)
imprimir la medición en el LCD

 y obviamente se vuelven a repetir todos los pasos.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #26 en: 19 de Febrero de 2011, 21:15:34 »
yo tenia pensado activar y desactivar la RDA, pero como lo planteas tu suena mejor angelGris, gracias, ahora otra pregunta el por que de que no arroja valores raros nen la lcd es por que entonces se producia un error en la uart del pic en este caso ???. saludos y gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #27 en: 19 de Febrero de 2011, 23:29:13 »
  No sabría decirte el porque arroja valores raros en el LCD.

  Yo soy muy poco práctico para las cosas, así que si tuvieras otro PIC a mano te propondría hacer pruebas interconectando ambos PIC para ver si lo que es enviado por uno de ellos es bien recibido por el otro y mostrado en el LCD.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #28 en: 21 de Febrero de 2011, 22:11:53 »
hola, bueno he encontrado el problema de mi situacion, y es que el datasheet se contradice en una parte segun yo, y es por que dice que mice de 0 a 765cm, pero en otra parte, mejor dicho en el encabazado dice que mide en pulgada, y bueno, me di cuenta que las mediciones que yo obtenia de este codigo estaba bien, ya que me arrojava los vales en pulgadas y no en cm como especifica, en una parte. uff alivio por eso, asi que ya funciona un sensor, pero ahora me pasa otra cosa y es que al energizar el pic se queda pegado y no toma lectura del sensor, luego lo reseteo y hay empiesa bn, he intentado con desavilitar la interrupcion al principio del main mas unos delay de 300ms, pero aun asi sigue sin efecto, como podre desavilitar la interrupcion o algo para que la uart no tome registro alguno de lo que le llega al pic??. otra pregunta con respecto a la ejecucion del programa, cuanto se demora en poner el pic los pines de la forma que se le dice adentro del main?? abra otra forma para que al energizar el pic, los pines que quiero ya esten un el esto que le indico??
o el pic parte inicialmente con los pines en alta impedancia ?????

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #29 en: 21 de Febrero de 2011, 23:08:45 »
........, pero ahora me pasa otra cosa y es que al energizar el pic se queda pegado y no toma lectura del sensor, luego lo reseteo y hay empiesa bn, he intentado con desavilitar la interrupcion al principio del main mas unos delay de 300ms, pero aun asi sigue sin efecto, como podre desavilitar la interrupcion o algo para que la uart no tome registro alguno de lo que le llega al pic??. otra pregunta con respecto a la ejecucion del programa, cuanto se demora en poner el pic los pines de la forma que se le dice adentro del main?? abra otra forma para que al energizar el pic, los pines que quiero ya esten un el esto que le indico??
o el pic parte inicialmente con los pines en alta impedancia ?????

  En el datasheet indica cual es el estado de los pines en un PowerOnReset, con los pocos PICs que trabajé, el estado luego de un PowerOnReset es alta impedancia.
  Una forma de que el PIC no reciba nada de lo que supuestamente le llegaría por el UART es que no esté habilitado el UART. Deberías buscar en el Manual de CCS como se puede hacer eso.

  Otra forma que se me ocurre es que no esté habilitada la interrupción por UART (RDA), pero hay que tener en cuenta que si un dispositivo envió datos y fueron almacenados en el registro RCREG (ya que la interrupción sucede cuando dicho registro está lleno) y a su vez siguió mandando datos se produce un error. El PIC tiene el bit OERR que indica justamente un error de overflow. También tendrías que ver en el manual de CCS como eliminar dicho error. Según el datasheet del PIC se consigue limpiar el bit de error al deshabilitar y volver a habilitar la recepción.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas