Autor Tema: Funcion atoi de ccs  (Leído 4265 veces)

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

Desconectado oscarlis

  • PIC10
  • *
  • Mensajes: 5
Funcion atoi de ccs
« en: 04 de Julio de 2015, 18:32:32 »
Amigos, por favor necesito ayuda con lo siguiente.
estoy haciendo un programa par enviar datos de un pic a otro, el primer pic lee una entrada analógica y hace la conversión  ADC con un rango de valores de 0 a 255, estos valores los envía al otro pic por comunicación serial como una arreglo de caracteres.
Una vez en el segundo pic este lee la cadena de caracteres y aqui es donde viene el problema. en CCS no me da ningún error y no es un problema de tipeo (eso creo), al momento en que el segundo pic lee la cadena de caracteres lo convierte e entero con la función atoi y una vez convertido lo manda a una salida  con pwm, el problema es que el primer valor que lee este segundo pic si se convierte  a su respectivo numero entero, pero en la siguiente lectura (en un buble infinito) ya no lee el valor real  sino que lo pone como 0, osea si el valor leido y convertido es 190 en la primera lectura si lo convierte a un entero igual a 190, pero si el segundo valor leido es el mismo aqui ya no se convierte en 190 sino que lo hace cero, la conversión la hago en el bucle infinito que es en donde también leo la cadena que me envía el primer pic.
En pocas palabras el problea es con el itoa que solo me convierte la primera lectura por que el resto los hace cero.
espero puedan ayudarme gracias.


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Funcion atoi de ccs
« Respuesta #1 en: 04 de Julio de 2015, 18:39:19 »
Coloca la parte del codigo donde realizas la conversion atoi, para ver mejor que sucede.

Desconectado oscarlis

  • PIC10
  • *
  • Mensajes: 5
Re: Funcion atoi de ccs
« Respuesta #2 en: 05 de Julio de 2015, 17:51:24 »
#include <stdlib.h>
void main()
{
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,255,1);
char i[4];//variable que leera la cadena que llega
int8 v;//El valor que llega se convierte a entero de 8 bits
delay_ms(500);

while(1){
fgets(i,PORT1);//lee el puerto serie y lo guarda en al arreglo    i

v=atoi(i);//convierte a entero lo leido (Aqui es el problema, el primer valor que llega si lo toma como el valor que es, pero en el siguiente valor que llega y lo convierte lo manda como 0)

fputs(i,PORT1);  //el valor que leo lo mando a imprimir en la terminal para comprobar que si esta llegando datos y si llega y se imprimen los valores que llegan solo que como cadena
set_pwm1_duty(v);//Escribe el ancho de pulso en la salida ccp1



Yo comprobé que después de convertir el primer valor a los demás los hacia cero por que reconvertí el entero nuevamente  a cadena y lo imprimí por el terminal y me daba cero


}

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Funcion atoi de ccs
« Respuesta #3 en: 05 de Julio de 2015, 18:23:09 »
Código: C
  1. estoy haciendo un programa par enviar datos de un pic a otro, el primer pic lee una entrada analógica y hace la conversión  ADC con un rango de valores de 0 a 255, estos valores los envía al otro pic por comunicación serial como una arreglo de caracteres.

Mi pregunta es.... y por que enviarlo como ASCII cuando podes enviar el numero directamente, es decir el valor de 0 a 255?

Desconectado oscarlis

  • PIC10
  • *
  • Mensajes: 5
Re: Funcion atoi de ccs
« Respuesta #4 en: 05 de Julio de 2015, 18:42:03 »
Llevo poco tiempo de manejar CCS así que no tengo mucho conocimiento de todas sus funciones.
Estoy enviando una cadena con la función fputs, vi otra que era para enviar caracteres, pero no vi ninguna para enviar enteros, lo mismo para leer, solo encontré las funciones fgets , fgetc, gets...getc asi que por esa razón convertí lo leído en una cadena para enviarlo y para poder leerlo con esas funciones, si ustedes conocen otra forma de enviar datos por medio de los pines tx y recibir por rx con el pic16f887 les agradecería mucho su ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Funcion atoi de ccs
« Respuesta #5 en: 05 de Julio de 2015, 18:56:10 »
Hubieras usado putc() para enviarlo y getc() para recibirlo si es un solo dato. si son mas datos podrias usar getc() tambien pero esperas hasta juntar todos los datos antes.

PIC1:
Código: C
  1. ADC_Resultado=0xAE
  2. putc(ADC_Resultado);               // Aca si necesitads definir que salidas vas a usar seria con fputc(ADC_Resultado,salida);

PIC2:
Código: C
  1. recepcion= getc();                  //o fgetc(PORT1) si necesitas definir cual es,,, si es uno solo no va a haber problema no hace falta definirlo
  2. set_pwm1_duty(recepcion);

El getc(), espera hasta que algun caracter llegue, asi que tu programa va a dejar de hacer cosas hasta que llegue algo, esto no es problema si lo usas en una interrupcion ya que entraria si es que llega algo, pero si es en el programa principal entonces deberias preguntar si llego algo:

Código: C
  1. if(kbhit()){                             // Aca tambien si necesitas definir que stream vas a usar quedaria kbhit(PORT1);
  2.   recepcion= getc();
  3.   set_pwm1_duty(recepcion);                // O directamente hacer set_pwm1_duty(getc());
  4. }

Todo esto sacado del manual de CCS, esta en ingles y es un PDF, lo buscas en google con "CCS manual" y te aparece. Como dije por ahi, a no ser que uses dos I2C o UART o SPI o lo que sea, podes tranquilamente omitir el identificador ( stream ). ya que tomaria el del ultima directiva #use

Código: C
  1. #use rs232(baud=1200,xmit=pin_b1,rcv=pin_b0,stream=GPS)
  2. #use rs232(baud=9600,xmit=pin_b3,stream=DEBUG)

Por ejemplo ahi tenes 2 y si quisieras enviar por 1 deberias usar el fputc(dato,GPS); por ejemplo, pero si solo tenes 1 solo, entonces va a usar ese unico. y no hace falta definirlo
« Última modificación: 05 de Julio de 2015, 19:00:50 por KILLERJC »

Desconectado oscarlis

  • PIC10
  • *
  • Mensajes: 5
Re: Funcion atoi de ccs
« Respuesta #6 en: 05 de Julio de 2015, 19:40:41 »
Muchas gracias KILLERJC.
tengo una ultima duda, me pide que defina la variable recepcion y no se si tengo que declararla como caracter, entero o arreglo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Funcion atoi de ccs
« Respuesta #7 en: 05 de Julio de 2015, 19:55:22 »
Muchas gracias KILLERJC.
tengo una ultima duda, me pide que defina la variable recepcion y no se si tengo que declararla como caracter, entero o arreglo

es una variable de 8 bits, asi que declarala como int recepcion;
Yo no la declare por que era un ejemplo nomas.


 

anything