Página 1 de 1

int timer 1 e AD

MensagemEnviado: 29 Mar 2010 17:10
por rebelk
preciso ler o valor do AD a cada 50ms ( interrupção do timer 1 )
, posso ler o valor do AD dentro da int ?
isso pode me gerar algum problema ? existe ou metodo ?
estou programando em C com o ccs o pic ultilizado é o pic18f452.

MensagemEnviado: 29 Mar 2010 17:21
por rebelk
peguei isso do forum

lellis escreveu
http://asm51.eng.br/phpBB/viewtopic.php ... rup%E7%E3o


o que sai da função readadc()? experimente pegar DIRETO o resultado dos registradores:
result=ADRESH*256+ADRESL;

um ex pra pegar média de 10 leituras
Código:
unsigned int adc_read(unsigned char ref)
{
unsigned char i;
unsigned int ad;
ad=0;
for (i=0;i<10;i++)
{
ADCON0 = ref; // ref=VREF ou VDD, enable ADC, fosc/64
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");// alguns nops resolvem.
A única coisa útil do assembler é o "nop". rs
GODONE=1;
while(GODONE) continue; // wait for conversion complete
ad+=(ADRESH*256 + ADRESL);
}
return ad/10;
}

substitua ref por "0x81| (canal a ser medido)<<2" pro caso de ser 16f676.
verifique o dataxit de seu uC como escolher os canais. Aliás prefira lê-lo ao
invés de usar rotinas prontas e mastigadas. Verifique se alguma interrupt está a
atrapalhar o resultado.

abç
_________________
ninguém é tão tolo que não tem nada a ensinar e nem tão sábio que não tem a aprender.
É mais fácil mudar o mundo pra melhor se você tomar posse do Código Fonte.


lellis me esplica isso

GODONE=1;
while(GODONE) continue; // wait for conversion complete
ad+=(ADRESH*256 + ADRESL); de onde saiu o 256 ?

MensagemEnviado: 30 Mar 2010 10:58
por ze
ad é uma variável tipo int portanto usa 2 bytes. *256 é pra compor o MSB. (o mesmo que (int)ADRESH<<8 (????))
o tempo de leitura do ad é bem inferior a 50mS. portanto não vejo impedimento [crono]lógico mesmo lendo todos os canais. tomara que teu compilador otimize o cod. mas eu preferiria ler um canal a cada passada para haver um "descanso" entre uma leitura e outra. mas depende da aplicação, óbvio.
abç

MensagemEnviado: 03 Abr 2010 12:56
por rebelk
deu certo , valeu !!!!!!!!!!!!!!!!!!!!!!!!!

MensagemEnviado: 03 Abr 2010 20:23
por BolhaDigital
Acrescentando,


Uma dica muito útil é vc sempre deixar um delay entre uma leitura e outra, esse delay pode ser algo em torno de 30 a 50us, esse recurso é valido para quando vc fizer a leitura de varios potenciometros em sequencia, isso evita que uma leitura interfira na próxima...