Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/07/2016 #1


Problema al concatenar en PIC C de CCS
Hola a todos. Estoy teniendo un problema en el compilador de CCS con el PIC16F877A.
Estoy usando este código para concatenar enteros en C y no funciona bien.
Sólo funciona cuando los números a concatenar son de 1 dígito, pero si son de dos o más, ya no.
Lo curioso es que lo pruebo con otros compiladores de C (no de PIC) y me funciona.

Muchas gracias.

Código PHP:
int concat(int xint y) {
     
int temp y;
    
// while (y != 0) {
         
x*10;
        
=y/10;
     
//}
     
return temp;
 }
 
int aux=0
 
int x=8;
 
int y9;
 
auxconcat(x,y);
    
     
       
lcd_gotoxy(1,2);          
       
printf(lcd_putc,"%u";,aux); 
29/07/2016 #2
Moderador

Avatar de Ratmayor

Prueba cambiando el tamaño de las variables...

Código PHP:
int8 concat(int8 xint8 y) {

int8 temp y;
// while (y != 0) {
x*10;
=y/10;
//}
return temp;
}
int8 aux=0
int8 x=8;
int8 y9;
auxconcat(x,y);


lcd_gotoxy(1,2); 
print8f(lcd_putc,"%u",aux); 
30/07/2016 #3

Avatar de TRILO-BYTE

no se que quieres hacer
digo tienes un etenero que contiene un 5
y tienes un segundo entero que tiene 8

y cuando los quieres concatenar que se conviertan en 58

es simple

char numero1;
char numero2;
char *cadena;
char valor;

numero1=4;
numero2=5;


sprintf(cadena,"%d,%d",numero1,numero2); //ahora cadena contiene la cadena 45

printf(putc_lcd,"%s",cadena); //imprimira 45 como string
valor=atoi(cadena); //valor obtendra el valor de cadena

printf(putc_lcd,"%d",valor);//imprimira el valor numerico de la convercion del string a numerico.


si no le entendiste

¡pongase a estudiar!
31/07/2016 #4


Yo para concatenar utilizo una funcion parecida a esta:

int16 cf16(int16 r){
if(r>99){ return 1000; } //mayor d 99
else { if(r>9){ return 100; } //mayor d 9..... de 10 a 99 se multiplica 100
else { if(r>0){ return 10; } else return 1; } }

dato1=103
data2=56

resultado=(data2*cf16(dato1))+dato1;

similar ira bien pero fallara con un numero mayor a 999

Saludos
31/07/2016 #5


muchas gracias a todos por sus respuestas pero no funcionan, les recuerdo que el problema es con numero de dos o mas cifras . Gracias

---------- Actualizado después de 25 minutos ----------

Muchas gracias Albert0 , he podido gracias a tu respuesta.
02/08/2016 #6


Me alegro eugy pero una cosa el ultimo "if(r>0){ + todo contenido }" Me parece que esta mal. Todo debe acabar en un "else { return 10 } //minimo " el cero tan bien es un digito.

Yo realmente utilizo una funcion para que me devuelva el nº de digitos a intencion de manejar el X de lcd_gotoxy(X,y); para poner un numero tras otro en el LCD
02/08/2016 #7


Albert0, estoy teniendo problemas con el 0 es verdad. Por ejemplo cuando quiero formar el 1034 me forma el 1340. Pero no entendí tu ultima respuesta. Ademas que si pongo tres números iguales seguidos me da cualquier numero . Gracias.
02/08/2016 #8
Moderador

Avatar de D@rkbytes

Realiza la concatenación de la siguiente forma:
Código PHP:
#include <16f877a.h>
#use     delay(crystal = 4MHz)
#include <lcd.c>
#include <stdlib.h>

int16 numero1;
int16 numero2;
int8 cadena[10];
int32 valor;

void main (void)
{
   
numero1 123;
   
numero2 456;

   
lcd_init();

   
sprintf(cadena,"%lu%lu",numero1,numero2); // Concatenar los números dentro del arreglo "cadena[]"

   
printf(lcd_putc,"\f%s",cadena);           // Imprimir la cadena concatenada.
   
valor atof(cadena);                     // Convertir la cadena a entero. (Importante usar ATOF aunque no coincidan los tipos)
   
lcd_gotoxy(1,2);
   
printf(lcd_putc,"%lu",valor);             // Imprimir el resultado como entero.
   
   
while (true);

02/08/2016 #9


D@rkbytes, muchas gracias . Mi problema es que quiero que los numeros ingresen por el puerto serial y eso complica las cosas. Como quedaría la función para mas de dos nuemros?
02/08/2016 #10
Moderador

Avatar de D@rkbytes

Esa rutina es para más de dos dígitos, posiblemente 4 y 4.
Si los quieres ingresar por el puerto serial, debes recibir la cadena con "gets(string)" y usando la interrupción RDA.
10/08/2016 #11


problemas con el 0
No esto es raro sigue abiendo un problema con el 0 pero a partir de 1 todo deberia funcionar as probado a hacer esto:

dato1=1034
data2=56

resultado=(data2*cf16(dato1))+dato1;


Código:
int16 cf16(int16 r){ 
if(r>999){ retrun 10000; }//esto deberia baler para 1034 //4-ceros 4-digitos 
//ten en cuenta que 1034 es el nº de la derecha y 56 X 10000 el de la izquierda
//deberia quedar 561034


if(r>99){ return 1000; } //mayor d 99
else { if(r>9){ return 100; } //mayor d 9..... de 10 a 99 se multiplica 100
else { if(r>0){ return 10; } else return 1; } }//quizas no sea mala idea que debuelba un 1 en caso de 0
//no se si no lo arreglas aqui tiene que ser antes o despues, a mi ahora no se me ocurre otra cosa y //ultimamente no e hecho nada pero recuerda a Bart Simson "multiplicate X 0" no puede funcionar
y todo es sucesivo if(r>99999) //para cifras de 5 digitos
Ahora hacerlo a si puede ser lento si las cifras tienden a ser menores a 100 pero pueden llegar a mas de 6 cifras-digitos Mejor empezar a preguntar desde menores
if(r<9){ retrun 10; }//aqui vuelve a cascar algo devolver 0 por si solo no va a valer a menos que el //resto del programa tenga en cuenta esto
else if(r<99){ retrun 100; }
else if(r<999){ retrun 1000; .......sucesivo

---------- Actualizado después de 16 minutos ----------

Este metodo es muy sencillo y parece valer para un numero de 9 cifras int8 cadena[10];

sprintf(cadena,"%lu%lu",numero1,numero2); // Concatenar los números dentro del arreglo "cadena[]"
valor = atof(cadena); // Convertir la cadena a entero.
//si fuese el caso me quedaria con el

pero pregunta a parte que es "gets(string)" puede pasar una cadena de caracteres con el SPI de comunicacion serie es lo unico que e utilizado y solo numeros. Yo si paso numeros mayores a int8
utilizo make8 o make16 en lo mas sencillo
¿Con gets(string) Tiene en cuenta la comunicacion serie los caracteres vacios o 0 "los que no son necesario pasar"?
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.