Hace unos días publiqué un par de funciones que escribí para hacer ADC de 10 bits. El problema es que no pude averiguar qué estaba mal con mi código, así que escribí una función simple mucho más simple que realiza una conversión de 12 bits para una solución de problemas más sencilla del código original. Así que mi código ahora funciona en su mayor parte, pero tengo un pequeño problema que no puedo resolver por mi cuenta. Configuré 2 leds para que se iluminen cuando el voltaje de entrada es superior a 2.5 voltios y solo uno se enciende cuando está por debajo. El problema es que cuando el voltaje está por debajo de 1v, los dos leds siguen encendidos. pero además de que todo funciona como se esperaba, tan pronto como supere 1 v, el único LED se encenderá. Cuando suba por encima de los 2,5 voltios, los otros 2 LED se encenderán como se esperaba. Realmente agradecería cualquier sugerencia Gracias por su ayuda. Estoy usando PIC16f1788
#include <xc.h>
// Config word
#define _XTAL_FREQ 2000000 // set it to match internal oscillator
/*config1 and config2 settings*/
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT disabled) (turned on!)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) (turned off)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable bit (Vcap functionality is disabled on RA6.)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF // Low Power Brown-Out Reset Enable Bit (Low power brown-out is disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled) (turned off)
unsigned int analog_reading;
unsigned int i;
unsigned int bit_val;
void main(void)
{
//SET UP
ADCON1= 0b00000000; //format setup see page 182 of datasheet
TRISA= 0b11111111; //sets PORTA as all inputs
TRISC= 0b00000000; //sets PORTB as all outputs
PORTC= 0b00000000; //sets all outputs of PORTB off to begin with
ADCON0 =0b00000101;
// bit0: ADC enabled
//bit6-2: AN1 enabled for analog input
//bit7: set for a 12-bit result
//
while (1)
{
__delay_ms(10);
ADCON0bits.GO_nDONE=1; //do A/D measurement
while(ADCON0bits.GO_nDONE==1);
bit_val= ADRESH; // store upper 8 bits in a 16bit variable
analog_reading = ((bit_val << 4) | ADRESL); //shift it up by 4 bits then store ADRESL in the bottom 4bits
// According to page 184 of datasheet when ADFM=0 ADRESH has the
// upper 8 bits of 12bit conversion results and the lower 4 bits are in ADRESL
if(analog_reading>512){ // when the voltage is passed 2.5 volts these two LEDS should come on.
/*Turn these 2 LED on*/
PORTCbits.RC2 = 1;
PORTCbits.RC3 = 1;
PORTCbits.RC4 = 0;
}
else{
/*turn one LED on*/
PORTCbits.RC2 = 0;
PORTCbits.RC3 = 0;
PORTCbits.RC4 = 1;
}
}
}