Autor Tema: Numeros int32 que no suman mas de 65536 SOLUCIONADO!!!  (Leído 1674 veces)

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

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Numeros int32 que no suman mas de 65536 SOLUCIONADO!!!
« 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


« Última modificación: 22 de Enero de 2018, 20:59:02 por rafaelrg06 »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Numeros int32 que no suman mas de 65536
« Respuesta #1 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.
"
« Última modificación: 27 de Diciembre de 2017, 19:23:54 por planeta9999 »

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re:Numeros int32 que no suman mas de 65536
« Respuesta #2 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?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Numeros int32 que no suman mas de 65536
« Respuesta #3 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.

http://www.todopic.com.ar/foros/index.php?topic=28455.msg234512#msg234512


Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Numeros int32 que no suman mas de 65536
« Respuesta #4 en: 28 de Diciembre de 2017, 09:05:45 »
Probaste declarando las variables como "unsigned int32"?

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re:Numeros int32 que no suman mas de 65536
« Respuesta #5 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.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Numeros int32 que no suman mas de 65536
« Respuesta #6 en: 31 de Diciembre de 2017, 21:29:36 »
Código: C
  1. vtemp6 = Acum_Tim1 + vtemp5; //vtemp6 da 8, y debería dar 65.544, AQUÍ ESTÁ EL ERROR
  2. Acum_Tim1 = vtemp6;

  Esta operación la puedes sustituir por:

Código: C
  1. 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.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re:Numeros int32 que no suman mas de 65536
« Respuesta #7 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...
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re:Numeros int32 que no suman mas de 65536
« Respuesta #8 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.


 

anything