Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: rafaelrg06 en 27 de Diciembre de 2017, 17:26:37
Título: Numeros int32 que no suman mas de 65536 SOLUCIONADO!!!
Publicado por: rafaelrg06 en 27 de Diciembre de 2017, 17:26:37
Hola amigos: Tengo un importante problema que necesito saber si alguien tiene solución. El asunto es que necesito hacer una resta y algunas sumas con números int32, todos están declarados de esta manera, pero en la simulación paso a paso en proteus y siguiendo cada variable no logro que las misma sumen ningún número por encima de 65536, en realidad suma, pero me pone un número inferior, como si hubiera sumado, llegado al borde del int16 y vuelto a contar, es decir, al parecer el compilador CCS está limitando las variables a int16 cuando son int32. Es bueno saber que estas operaciones están dentro de una función que se usa dentro de la interrupción por el módulo CCP1, es decir, la pila (o Stack) está en el nivel 3. Descargué la última versión de CCS 5.070 y el problema sigue igual. Les pongo el código: vtemp4 = 65536 - T1_temp; //vtemp4 da 3.550, y está OK vtemp5 = T2_Temp + vtemp4; //vtemp5 da 3.558, y está OK vtemp6 = Acum_Tim1 + vtemp5; //vtemp6 da 8, y debería dar 65.544, AQUÍ ESTÁ EL ERROR Acum_Tim1 = vtemp6; //Por supuesto, aquí se transmite el error, seteando Acum_Tim1 con 8.
Los valores iniciales de las variables antes de entrar a este bloque son: T1_temp: 61986; T2_temp: 8; vtemp4: 74; Acum_Tim1: 61986.
Todos los valores están configurados como int32: int32 vtemp4 = 0; int32 vtemp5 = 0; int32 vtemp6 = 0;
Espero que alguien me ayude a encontrar la solución, o me digan si es un error de CCS
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: planeta9999 en 27 de Diciembre de 2017, 19:12:38
Tal vez Acum_Tim1 es de 16bit, en ese caso prueba a hacerle un cast en la operación. vtemp6 = (int32)Acum_Tim1 + vtemp5;
En el resto de operaciones intermediarias, si han intervenido campos de 8 o 16 bit, igual les tienes también que aplicar un cast. Por probar no cuesta nada.
Googleando:
" So, where most C compilers would look at the whole statement, and propogate to the highest type used in the whole statement, the CCS compiler, will keep the types to the smaller sizes, by default. the advantage, is that it helps to ensure that larger/slower maths operations are not used unnecessarily, but the downside, is that when some operations are performed data will be lost. There have been many posts in the past advising that when explicit use of a larger arithmetic type is required, you should allways cast. "
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: rafaelrg06 en 27 de Diciembre de 2017, 21:36:33
Hola amigo: La variable Acum_Tim1 tambi'en es un int32, todas son int32. No se porque me da ese error!!!
Alguien mas tiene alguna solucion?
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: KILLERJC en 27 de Diciembre de 2017, 22:43:13
Tu problema es que crees que Proteus tiene toda la verdad y por ende solo te queda creer que es el compilador. Pero proteus puede fallar mucho mas que el compilador.
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: luismh en 28 de Diciembre de 2017, 09:05:45
Probaste declarando las variables como "unsigned int32"?
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: Duende_Azul en 28 de Diciembre de 2017, 21:02:57
Que versión de Proteus tienes? probé una suma en 32bits y funciona bien en Proteus 8.6 sp3 y ccs 5.074.
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: remi04 en 31 de Diciembre de 2017, 21:29:36
Código: C
vtemp6 = Acum_Tim1 + vtemp5;//vtemp6 da 8, y debería dar 65.544, AQUÍ ESTÁ EL ERROR
Acum_Tim1 = vtemp6;
Esta operación la puedes sustituir por:
Código: C
Acum_Tim1+= vtemp5;
Asi te sobra vtemp6.
Yo coincido con killer en que damos por sentado que proteus es impepinable. Por eso para mi la placa de desarrollo es el mejor simulador.
Prueba al poner como float Acum_Tim1 que es la que te falla a ver que opina proteus.
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: SavageChicken en 02 de Enero de 2018, 14:31:51
Feliz año para todos.
Opino lo mismo que remi04 y Killer, Proteus tiene muchos errores como simulador, cosas que funcionan en Proteus no andan en los circuitos reales y viceversa...
Título: Re:Numeros int32 que no suman mas de 65536
Publicado por: rafaelrg06 en 22 de Enero de 2018, 20:57:40
Hola amigos del foro: Les pido disculpas pero no he podido entrar a internet hace varios días y por eso no había podido darles la respuesta. El error estaba en el Proteus. Yo usaba la versión 7.8 SP2 build 10468. El problema es que el programa leia incorrectamente los números long long. Me di cuenta simulando paso a paso y leyendo los valores que debían tener las localizaciones en la RAM del PIC y estaban correctos, es decir, CCS hizo bien su trabajo, pero el Proteus me daba los resultados de los primeros 2 bytes en vez de los 4 que tiene un long long (o int32). La solución fue cambiar a la versión 8.6 de Proteus y todo funciono perfectamente. Saludos cordiales a todos.