TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Rodricity en 28 de Diciembre de 2007, 17:01:27
-
Pues eso, tengo un problema:
Haciendo una funcion para traspasar numeros, a "BCD" o mas bien a cadenas de numeros de la tabla ASCII, me doy cuenta, que por mas que intento, no puedo pasar un numero mayor que 39.999, aca les dejo el codigo, y cada vez que lo simulo en proteus al intentar convertir un numero igual o mayor que 40.000 me salen caracteres extraños...
//************************************************************
entero = valor / 100000;
if(entero == 0 & nulos == 1)
{
escribir_lcd(entero+48);
}
if(entero!=0)
{
escribir_lcd(entero+48);
nulos = 1;
}
valor = valor - (entero*100000);
//************************************************************
entero = valor / 10000;
if(entero == 0 & nulos == 1)
{
escribir_lcd(entero+48);
}
if(entero!=0)
{
escribir_lcd(entero+48);
nulos = 1;
}
valor = valor - (entero*10000);
//************************************************************
entero = valor / 1000;
if(entero == 0 & nulos == 1)
{
escribir_lcd(entero+48);
}
if(entero!=0)
{
escribir_lcd(entero+48);
nulos = 1;
}
valor = valor - (entero*1000);
//************************************************************
entero = valor / 100;
if(entero == 0 & nulos == 1)
{
escribir_lcd(entero+48);
}
if(entero!=0)
{
escribir_lcd(entero+48);
nulos = 1;
}
valor = valor - (entero*100);
//************************************************************
entero = valor / 10;
if(entero == 0 & nulos == 1)
{
escribir_lcd(entero+48);
}
if(entero!=0)
{
escribir_lcd(entero+48);
nulos = 1;
}
valor = valor - (entero*10);
escribir_lcd(valor+48);
}
Pues eso, no se me ocurre cual podria ser el error, se me ahce que con el numero 40.0000 hace una operacion matematica que excede la "cantidad" de "numeros" que puede manejar el pic...
-
Se me olvido agregar, el "nulos" es simplemente para definir si quiero que los caracteres nulos aparescan o no, es decir
Colocando nulos = 1
la transformacion del numero 625 seria "00625".
Por otro lado con nulos = 0 seria simplemente 625.
-
Asegurate que las variables "entero" y "valor" sean de 32bits sin punto flotante(¿int32?).
-
Es probable que estés usando enteros de 16 bits con signo, cuyo límite superior es 32.768.
Como te recomienda Bruno, prueba con "unsigned int32"
-
Correcto, el problema era claramente ese, y de hecho, tenia sentido:
Ya que al ser con signo el valor maximo que podia alcanzar era 32.000
al ser 39999 tomaba el valor 30.000, y en 40.000 tomaba un valor que excedia el maximo para un entero con signo.
Esop, muchas gracias, ya lo corregi y ahora puedo convertir hasta el numero 4999999999 :D