Podrias dar mas datos? sobre que ADC estamos hablando?
La otra es que si es externo, lo mejor es que uses interrupciones para tomar las medidas. Aunque imagino que vos se las tenes que pedir.
Simule tu codigo pero no volvia a high CS(SS en la simulacion), entonces saque la variable estado del timer1 (esta declarado como global con cero) y despue en el case 2 cambie estado++ por estado=0 y ahi la simulacion dio esto(adjunto imagen):
Lo primero que deberias hacer es calcular cuanto tarda tu SPI en enviar y recibir...................Ya con esto definimos el tiempo minimo del timer.
#include <18f4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL5,CPUDIV1
#use delay(clock=48000000)
#use standard_io(B)
#define CS PIN_B2
int16 contador=0;
int8 estado=0;
int8 flujol,flujoh;
int16 flujo16bits=0;
#int_timer1
void timer1(){
SET_TIMER1(62532);
output_low(CS);
spi_write(220);/* canal 3*/
estado = 0;
}
#int_SSP
void SSP() {
switch(estado)
{
case 0:
spi_write(0); // escribo 0
estado++; // Aumento de estado
break; // salgo
case 1:
flujoh = spi_read() & 0x7F; // Tomo el primer valor
spi_write(0); // Envio otro 0 para recibir lo demas
estado++; // Aumento de estado
break; // Salgo
case 2:
flujol = spi_read(); // Tomo el segundo valor
output_high(CS); // Finalmente apago el CS
flujo16bits = make16(flujoh,flujol); // Creo la variable de 16 bits
flujo16bits >>= 3; // Divido por 8
estado++; // Aumento de estado
break; // Salgo
default:
break; // En caso que estado no sea ninguno de los anteriores
}
}
void main(){
setup_timer_1(T1_INTERNAL |T1_DIV_By_4 );
SET_TIMER1(62532);
enable_interrupts(INT_TIMER1); // Habilitamos la interrupción que deseamos
enable_interrupts(GLOBAL); //Habilita int. general
set_tris_b(0x29); /*configuro el puerto B para que el RB0,RB3 y RB5 como entrada*/
setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16); /* SPI_CLK_DIV_16 SPI_XMIT_L_TO_H */
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
/* output_low(CS);
spi_write(0xbb);// canal 2
flujoh=spi_read(0);
flujol=spi_read(0);
output_high(CS);*/
while(TRUE);
}output_low(CS);
spi_write(0xbb);// canal 2
flujoh=spi_read(0);
flujol=spi_read(0);
output_high(CS);