Si claramente ahi deberia estar el error... Ademas espero que todas las variables sean con signo.
variable = make16(read_eeprom(27),read_eeprom(28));
El make16 hace esto (segun manual de CCS):
i16 = (int16)(varhigh&0xff)*0x100+(varlow&0xff)
Lo que me preocupa es ese cast a int16, que sin nada se asume unsigned, segun el manual de CCS)
Parece como si descompone la cifra en dos para sacar una mantisa y ahorrarse un float , a saber, luego le preguntaré.
Estas trabajando con enteros, lo unico que hace ahi es tratar de separar el numero para guardarlo (mostrarlo,etc), pero lo hace mal. Es como si tratara de separar las unidades de las decenas, pero un numero de 16 bits tiene muchos mas digitos.
Para mi lo mas simple va a ser crearle una union (para que no trabaje con punteros). Para que tu compañero lo pueda entender y manejarse, el tema es que luego va a necesitar cambiar donde lo use, pero con un Replace All, se ahorra el tema. Si tu compañero se maneja bien con punteros entonces todo lo que va a continuacion se simplifica mas.
struct myStruct {
int8 b1;
int8 b2;
}
union myUnion {
signed int16 w
struct myStruct separado;
}
union myUnion variable;
Entonces:
// Previo inicializamos variable antes de leer por cualquier cosa:
variable.w = 0;
write_eeprom(27,variable.separado.b1);
write_eeprom(28,variable.separado.b2);
variable.separado.b1 = read_eeprom(27);
variable.separado.b2 = read_eeprom(28);
Y de usarlo completo los 16 bits, entonces usar variable.w
La pregunta ahora es.... Si planteo algo como separar la decena y la unidad, no creo que plantee mas de 99 y -99, Por lo tanto, ¿por que irse a un numero de 16 bits?
Gracias Killer.
Efectivamente lo que trataba era de separar la ultima cifra solamente, pero tratar el resto como otra cifra. Es decir, si por ejemplo la variable vale 14327, lo que él quería es quedarse con el 1432 por un lado y el 7 en otra variable y luego representarla por ejemplo haciendo printf("El numero es: %Lu,%u",variable,variable_dec"); y que le aparezca que " El numero es 1432,7". por eso usa 16 bits
Dice que siempre lo ha hecho así, pero es la primera vez que se le da el caso de necesitar usar negativos y claro, con números negativos eso no puede funcionarle por que cuando el programa fija por ejemplo un "-1" en la variable grande, si luego para guardarla tu la multiplicas por 10 (-1) * 10 = -10; así sin problema.
Pero cuando le añade esa mantisa, por ejemplo "7", la operación que está haciendo es ((-1) * 10) + 7 = -3;
Luego estaría grabando en la eeprom un -3.
Cuando luego lee la eeprom y hace la division para separarlas de nuevo lo que hace es:
(-3) / 10
y eso da -0,3, es decir, cero.
Luego para la unidad separada hace (-3) % 10 = -3 y como esa variable no está signada, si no que es un entero normal de 8 bits lo que a esa variable se le asigna es 253.
Por eso se le va a cero el valor grande cuando hace la rutina de grabación/lectura con una cifra negativa.
Pues nada, si estoy en lo cierto a explicarselo y que lo rediseñe.