Buenas gente, les comento que he tenido unos problemas utilizando un pic16f876a programado con ccs puntualmente con el ADC. Copio parte del código y paso a comentar mis problemas:
Este es un pic que lee una señal analógica y de superar ciertos rangos me da un 1 en una pata, la cosa es que en un principio definí el set_adc_channel(0) para leer la pata RA_0 del pic y en el proteus andaba todo perfecto pero cuando lo voy a probar en la placa no leia nada, basandome en prueba y error llegue a que para poder leer una señal analógica en la pata RA_0 debo poner set_adc_channel(1) y anda perfecto... El tema es que no entiendo porque,¿ a alguien se le ocurre algo?
"Este es el main en donde configuro entre otras cosas el ADC"
//------------------------------------------------------------------------------
void main(void)
{
trisA = 0b11111111;
trisB = 0b10111101;
trisC = 0b00000000;
setup_timer_1 ( T1_INTERNAL|T1_DIV_BY_4 );
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER1);
setup_adc(ADC_CLOCK_DIV_8);
setup_adc_ports( ALL_ANALOG );
out = 0;
set_adc_channel(1);
delay_ms(100);
do
{
if(interrupcion_rb == 1)
{
disable_interrupts(INT_RB);
while(superior == 0)
{
if( arriba == 0 && escritura == 1 )
{
modif(&ref_sup, 1);
}
else
if( abajo == 0 && escritura == 1 )
{
modif(&ref_sup, -1);
}
imp_nro(ref_sup);
}
while(inferior == 0)
{
if( arriba == 0 && escritura == 1 )
{
modif(&ref_inf, 1);
}
else
if( abajo == 0 && escritura == 1 )
{
modif(&ref_inf, -1);
}
imp_nro(ref_inf);
}
interrupcion_rb = 0;
enable_interrupts(INT_RB);
}
}
while(TRUE);
}
//-------------------------------------------------------------------------------------------------
"Y esta es la parte donde se hace la lectura para el conversor"
//------------------------------------------------------------------------------
#INT_RB
void int_rb_change()
{
if(piezo == 0)
{
while((aux = (read_adc() / 2.56)) > lectura)
{
lectura = aux;
}
if((int) lectura > ref_sup || (int) lectura < ref_inf )
{
out = 1;
delay_ms(1000);
}
imp_nro(lectura);
enable_interrupts(INT_RB);
aux = lectura = 0;
}
else
if(superior == 0 || inferior == 0)
{
disable_interrupts(INT_RB);
interrupcion_rb = 1;
enable_interrupts(INT_RB);
}
}
//------------------------------------------------------------------------------
Desde ya muchas gracias, saludos.