• Miércoles 6 de Noviembre de 2024, 02:31

Autor Tema:  Calculos Ccs  (Leído 2110 veces)

Nash7

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Calculos Ccs
« en: Miércoles 7 de Septiembre de 2005, 20:01 »
0
A ver, estoy intentado hacer unos calculos con el Timer 1 de form que necesito saber el tiempo que ha pasado entre cada interrupción. El problema es que:

1) No estoy haciendo bien la mascara y borro el byte más significativo
2) A pesar de poner T1 como integer16, está haciendo la multiplicación como si fuera un solo byte

El caso es que cuando F1 = 9, en vez de darme 1566(61E) me da 30 (1E).
Aqui os mando la función que utilizó a ver que os parece:

unsigned int16 calculos(int F1, unsigned int16 T)    //F1 = nº de overflows
{                                                                        //T valor del Timer1 actual

unsigned int16 T1=0, Tt = 0, j=0;
unsigned int32 T2;


T1 = (F1 * 174);          //174ms overflow del Timer1 con un reloj de 12MHz
T2 = (T * 8);
T2 = (T2 / 3);                //Paso a us el tiempo del timer
j = T2 * 0.001;              //trunco la suma quedándome con ms
a1 = T1&0x00ff;
T1>>=8;                       //máscara para presentar los datos en el winzip800
a2 = T1&0x00ff;
cont++;
write_eeprom(cont,F1);
cont++;
write_eeprom(cont,a2);
cont++;
write_eeprom(cont,a1);
Tt = T1 + j;                   //Sumo los tiempos parciales

return (Tt);

}



AYUDA!!!!!!!
¿Que pasa, que hago?como lo soluciono?, porque me multiplica en un solo byte?GRRRRRRRRRRRRR!!!!!!! :angry:

NakedSnake

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Calculos Ccs
« Respuesta #1 en: Lunes 3 de Octubre de 2005, 17:12 »
0
Nash7:

No conosco mucho el Ccs, pero una vez tuve un problema similar con un compilador en C para microcontroladores, por lo que he podido ver en el código que posteaste T1 es del tipo int16, por el contrario F1 es del tipo int y lo multiplicas por una constante que no tiene un tipo definido y es asumido por el programa como un int. La multiplicacion de estos (F1*174) se guarda tambien en un int, pero el valor de solución es mayor y se produce un desborde, por lo cual te quedas con los 8 bits menos significativos de la solución que luego son transferidos a la variable T1.

Lo mas recomendable es que los valores que vas a multiplicar sean del tipo int16. es decir F1 y el valor 174 castealos a int16, con eso no deberías tener mayores problemas

Saludos
NakedSnake