Gracias KILLERJC por la idea. Yo comenzaba por la escala más alta (0~500V) hasta llegar a la más baja (0~5V).
Éste es un copy/paste de un ejemplo de un libro. En el libro lo hace con una sola escala de 0~15V: el divisor de tensión está formado por dos resistencias, una de 20K y la otra de 10K que es la que va a tierra.
Ya lo había logrado hacer funcionar bien para las tres escalas, con el único inconveniente que para las escalas bajas me lo mostraba en notación científica. Pero de tanto quererlo modificar y no lo guardé, ahora veo que la única escala que funciona es la más alta. Para los switchs anlógicos uso el IC DG417 que conmuta los diferentes valores del divisor de acuerdo a la escala:
//AD_1.c
// Lcd pinout settings for LCD connection.
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction.
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
//Fin de la configuración de los puertos.
int temp_res;
float voltaje;
char txt[15];
void main(){
OSCCON=0x40; // Oscilador interno a 1Mhz (TCI=4uS).
while (OSCCON.IOFS==0); //Esperar mientras el oscilador se estabiliza.
PORTA=0x00; //Inicialización.
ANSEL=0x04; //Bit AN2 como entrada analógica.
TRISA=0x04; //RA2 entrada; R4, R3 y R1 salidas.
RA1_bit=1;
RA3_bit=1;
RA4_bit=0;
RA5_bit=1;
Lcd_Init(); //Inicializa el LCD.
Lcd_Cmd(_LCD_CLEAR); //Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF);//Apaga el cursor.
Lcd_Out(1,2, "VDCM 500V máx");
Lcd_Out(2,15, "V");
do {
temp_res=ADC_Read(2); //Obtiene 10 bits de la conversión del canal 2.
voltaje=(float)(temp_res*0.0048828125); // Lo convierte en voltaje de 0 a 5V.
if (voltaje>5.0){ //Si voltaje real es mayor que 500V,
Lcd_Cmd(_LCD_CLEAR); //Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF);//Apaga el cursor.
Lcd_Out(1,5, "WARNING!"); //envía mensaje de alarma.
Delay_ms(500); }
else if (voltaje>0.5) //Si voltaje real es mayor que 50V,
voltaje*=100.0; //voltaje de 0 a 5V lo convierte a voltaje real.
else if (voltaje>0.05) { //Si voltaje real es mayor que 5V,
RA4_bit=1; //desconecta switchs de escala 0 a 500V,
RA3_bit=0; } //conecta switchs de escala 0 a 50V.
else if(voltaje>0.5) //Si voltaje real es mayor que 5V,
voltaje*=10.0; //voltaje de 0 a 5V lo convierte a voltaje real.
else { //Si no:
RA4_bit=1; //Desconecta switch de escala 0 a 500V,
RA3_bit=1; //desconecta switch de escala 0 a 50V,
RA1_bit=0; } // y conecta switch de escala 0 a 5V.
voltaje*=1.0;
FloatToStr(voltaje,txt); //Convierte a voltaje real.
Lcd_Out(2,2, txt);
} while(1);
}
Cualquier observación se agradece. Saludos.