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