Por ejemplo, definición de registros:
#byte OPTION_REG=0x95
#bit WPUEN=OPTION_REG.7
#byte WPUA=0x20C //habilita PULLUPS porta
#byte WPUC=0x20E //habilita PULLUPS portc
#byte CPSCON0=0x01E //deshabilita capacitive touch
#byte SRCON0=0x11A //deshabilita SR LATCH
#byte DACCON0=0x118 //deshabilita DAC
#byte FVRCON=0x117 //habilita ref tension interna, deshabilita indicador de temperatura
#byte ADCON0=0x9D
#bit GO_DONE=ADCON0.1
#byte ADCON1=0x9E
#byte ADRESL=0x9B
#byte ADRESH=0x9C
#byte ANSELA=0x18C
#byte ANSELC=0x18E
Configuración de algunos periféricos
WPUEN=0; //habilito poder seleccionar independientemente las pull-ups
WPUA=0b000100; //habilito PULL-UPS puerto A
WPUC=0b011000; //habilito PULL-UPS puerto C
CPSCON0=0x00; //deshabilita capacitive touch
SRCON0=0x00; //deshabilita SR LATCH
DACCON0=0x00; //deshabilita DAC
FVRCON=0b11000011; //habilita ref tension interna, deshabilita indicador de temperatura
ADCON0=0b00011001; //canal 6, AD habilitado
ADCON1=0b01000011; //justificado derecha, Fosc/4 = 1us, FVR ON
ADRESH=0;
ANSELC=0b00000100; //sólo RC2/AN6 como AD
ANSELA=0b00000000;
La función para leer el A/D (en este caso solamente se lee un canal que se configura al principio, se podría mejorar muuuucho)
void captura_valor_ad()
{
GO_DONE=1;
do
{}
while(GO_DONE==1);
captura_valor=ADRESH;
}
El retardo ahora que lo veo lo hice mediante la interrupción del timer, donde tengo la base de tiempos. Pero se pueden hacer tantos delay_us(500) como haga falta. Espero que te sea útil.
Saludos
NOTA: es un programa medio cutrillo... y algunas cosas no están hechas de la forma más elegante precisamente