Es raro que un bit no te lo cargue en la variable, o mejor entenderlo como que no llegue al spi.
Ya que tenes un LCD para mostrar los valores e ir determinando que es lo que falla.
Al Mostrar el valor que llega al SPI, es decir lo que se recibe, si este esta mal, entonces es algo del ADC o algo en el SPI esta mal. En especial si lo haces por software.. Ya que podrias usar el SPI en hardware del PIC.
Si esta bien lo que llega no quedaria otra que mirar la multiplicacion en C y que no sea un problema de tipos de variables, pero darte justo la mitad suena algo mal en la conexcion SPI.
uso el SPI por hardware este es el codigo:
#include <18f4550.h>
#fuses XT,NOWDT /* HS pra un crystal > 4Mhz */
#use delay(clock=4000000)
#include "lcd.c"
#define CS PIN_B2
//#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7, bits=8, parity=N)
int Templ=0;
int Temph=0;
int tension2=0;
int16 Temp16Bits=0;
float temperatura=0,tension=0,valor=0;
void main(){
set_tris_b(0x1); /*configuro el puerto C para el spi*/
setup_spi(spi_master|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16); /* SPI_CLK_DIV_16 SPI_XMIT_L_TO_H */
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"PROYECTO FINAL");
delay_ms(500);
printf(lcd_putc,"\f"); //borrar lcd
while(TRUE)
{
/*CONFIGURACION CANAL 0 CON 8 BITS*/
output_low(CS);
spi_write(159);
Temph=spi_read(0);//obtenemos el Temp alto del registro de temperatura
//Templ=spi_read(0);//obtenemos el Temp bajo del registro de temperatura
output_high(CS);
//Temp16Bits=make16(Temph,Templ);//convertimos a un registro de 16Bits
//Temp16Bits=Temp16Bits>>4;//descartamos los 4 bits menos significativos y nos queda 12 bits
//temperatura=Temp16Bits*0.122; /* FACTOR DE CONVERSION=(5*100/4096) */
//CANAL 1
output_low(CS);
spi_write(223);
tension2=spi_read(0);//obtenemos el Temp alto del registro de temperatura
//Templ=spi_read(0);//obtenemos el Temp bajo del registro de temperatura
output_high(CS);
tension2=tension2<<1;
Temph=Temph<<1;
valor=tension2*0.0210;
tension=Temph*0.0210;
lcd_gotoxy(1,1);
//printf(lcd_putc,"Temp=%3.1f C \n",temperatura);
//lcd_gotoxy(1,2);
printf(lcd_putc,"Tension=%3.2f V \n",tension);
lcd_gotoxy(1,2);
printf(lcd_putc,"tension2=%3.2f \n",valor);
delay_ms(20);
}
}
con 12 bit pasa algo parecido, cuando tengo una variable de 16bit y debo correr 4 bit para obtener 12 tambien me da la mitad pero si hago un corrimiento de 3 anda bien..