Forever loop in ADCON0bits.GO_nDONE durante ADC

0

Estoy usando PIC16F1704 para recibir una señal LED usando un diodo fotográfico. Sin embargo, encontré que el ADC no puede terminar y siempre se puede conectar en bucle mientras que (ADCON0bits.GO_nDONE), ¿hay alguna solución?

Aquí está mi adc.c:

#include <xc.h>
#include "adc.h"
#include "mcc.h"

#define ACQ_US_DELAY 5

void ADC_Initialize(void) {
// set the ADC to the options selected in the User Interface

// GO_nDONE stop; ADON enabled; CHS AN0; 
ADCON0 = 0x01;

// ADPREF VDD; ADFM left; ADCS FOSC/2; 
ADCON1 = 0x00;

// TRIGSEL no_auto_trigger; 
ADCON2 = 0x00;

// ADRESL 0x0; 
ADRESL = 0x00;

// ADRESH 0x0; 
ADRESH = 0x00;

// Enabling ADC interrupt.
PIE1bits.ADIE = 1;
}

void ADC_StartConversion(adc_channel_t channel) {
// select the A/D channel
ADCON0bits.CHS = channel;

// Turn on the ADC module
ADCON0bits.ADON = 1;

// Acquisition time delay
__delay_us(ACQ_US_DELAY);

// Start the conversion
ADCON0bits.GO_nDONE = 1;
}

bool ADC_IsConversionDone() {
// Start the conversion
return (!ADCON0bits.GO_nDONE);
}

adc_result_t ADC_GetConversionResult(void) {
// Conversion finished, return the result
return ((ADRESH << 8) + ADRESL);
}

adc_result_t ADC_GetConversion(adc_channel_t channel) {
// Select the A/D channel
ADCON0bits.CHS = channel;

// Turn on the ADC module
ADCON0bits.ADON = 1;

// Acquisition time delay
__delay_us(ACQ_US_DELAY);

// Start the conversion
ADCON0bits.GO = 1;

**// Wait for the conversion to finish
while (ADCON0bits.GO) {
}**

// Conversion finished, return the result
return ((ADRESH << 8) + ADRESL);
}

void ADC_ISR(void) {
// Clear the ADC interrupt flag
PIR1bits.ADIF = 0;
}

Aquí está mi función principal:

void main() 
{    
SYSTEM_Initialize(); // initialize the device

unsigned int ADC_Result1=0;
TRISA=0; //Set PortA as output
TRISC=1; //Set PortC as input



GIE=1; //Enable Global Interrupt
PEIE=1; //Enable Peripheral Interrupt

while (1) {
    ADC_Result1 = ADC_GetConversion(channel_AN5);

    if(ADC_Result1>0){
    RA2=0xFF;  //Turn on LED
    __delay_us(250);
    RA2=0x00;  //Turn off LED
    __delay_us(250);


}
}
}

Si el pin ADC funciona (ADC_Result1! = 0), el otro LED parpadeará con la frecuencia con la que recibió el fotodiodo.

Enlace a la hoja de datos PIC16F1704: enlace

    
pregunta andyleekp

0 respuestas

Lea otras preguntas en las etiquetas