Problemas na conversão A/D (preciso de velocidade...)

Eu necessito fazer um coletor de dados, ele deve efetuar leituras periódicas de todos os canais do A/D do PIC 16F877A, porem eu necessito que essas leituras tenham o menor temo possível entre elas, estou programando em C (CCS) e pensei em utilizar a interrupção de final de conversão mas acho que estou "comendo bola", não sei onde estou errando e acho que estou me perdendo em algum conceito simples, vejam estes trechos do programa:
Rotina que efetua a leitura dos canais do AD´s, sendo que ela é disparada por um relógio interno via Timer0:
void efetuar_leitura() // Realiza 8 leituras e armazena num vetor leitura_canais[]
{
int canal_AD;
enable_interrupts(INT_AD);
for (canal_AD=0; canal_AD<=7; canal_AD++)
{
set_adc_channel (canal_AD);
delay_us(10); // Garante a carga do capacitor de amostragem
leitura_canais [canal_AD+1] = read_adc();
controle_leitura=1;
while(controle_leitura) // Trava na rotina até terminar a conversão do A/D
{
}
}
disable_interrupts(INT_AD);
}
Dai minha rotina de tratamento da interrupção é a seguinte:
#inline
void trata_AD()
{
controle_leitura = 0;
ADIF = 0;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tratamento da Interrupção Global *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#int_global
void trata_int()
{
#asm
timer: movwf w_tmp //
swapf status,w //
clrf status //
movwf stt_tmp // Salva os registradores especiais (salva o Pclath,
movf pclath,w // necessário para trabalhar em bancos de memória de
movwf pclath_tmp // programa diferentes).
clrf pclath //
#endasm
if (t0if) trata_t0(); // Gera base de tempo interna
if (ADIF) trata_AD(); // Avisa quando foi finalizada a conversão
#asm
movf pclath_tmp,w //
movwf pclath //
swapf stt_tmp,w //
movwf status // Recupera os registradores especias
swapf w_tmp,f //
swapf w_tmp,w //
bcf intcon,2 //
#endasm
}
Mas não funcionou...
Eu não sei se em C o proprio código read_adc() automaticamente já faz isso, eu queria uma rotina que eu gastasse o mínimo tempo possível entre leituras, a idéia era ler todos os canais ao mesmo tempo pois esse conjunto de leituras representa um estado de uma grandeza a ser medida, um grupo de 8 canais deve ser lido de 1 em um minuto aproximadamente.
Agradeço quem souber e puder ajudar!!!
Rotina que efetua a leitura dos canais do AD´s, sendo que ela é disparada por um relógio interno via Timer0:
void efetuar_leitura() // Realiza 8 leituras e armazena num vetor leitura_canais[]
{
int canal_AD;
enable_interrupts(INT_AD);
for (canal_AD=0; canal_AD<=7; canal_AD++)
{
set_adc_channel (canal_AD);
delay_us(10); // Garante a carga do capacitor de amostragem
leitura_canais [canal_AD+1] = read_adc();
controle_leitura=1;
while(controle_leitura) // Trava na rotina até terminar a conversão do A/D
{
}
}
disable_interrupts(INT_AD);
}
Dai minha rotina de tratamento da interrupção é a seguinte:
#inline
void trata_AD()
{
controle_leitura = 0;
ADIF = 0;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tratamento da Interrupção Global *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#int_global
void trata_int()
{
#asm
timer: movwf w_tmp //
swapf status,w //
clrf status //
movwf stt_tmp // Salva os registradores especiais (salva o Pclath,
movf pclath,w // necessário para trabalhar em bancos de memória de
movwf pclath_tmp // programa diferentes).
clrf pclath //
#endasm
if (t0if) trata_t0(); // Gera base de tempo interna
if (ADIF) trata_AD(); // Avisa quando foi finalizada a conversão
#asm
movf pclath_tmp,w //
movwf pclath //
swapf stt_tmp,w //
movwf status // Recupera os registradores especias
swapf w_tmp,f //
swapf w_tmp,w //
bcf intcon,2 //
#endasm
}
Mas não funcionou...
Eu não sei se em C o proprio código read_adc() automaticamente já faz isso, eu queria uma rotina que eu gastasse o mínimo tempo possível entre leituras, a idéia era ler todos os canais ao mesmo tempo pois esse conjunto de leituras representa um estado de uma grandeza a ser medida, um grupo de 8 canais deve ser lido de 1 em um minuto aproximadamente.
Agradeço quem souber e puder ajudar!!!