Estoy intentando leer la señal analógica para una especie de mouse con un controlador pic18f14k50. Aquí el circuito simple: enlace . Tengo que leer la señal analógica del puerto del circuito AN9. La función principal lee desde el puerto y parpadea 30 veces si se alcanza el umbral:
void main(void)
{
InitializeSystem();
#if defined(USB_INTERRUPT)
USBDeviceAttach();
#endif
while(1) {
if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) continue;
if (!HIDTxHandleBusy(lastTransmission)) {
int readed = myReadADC2(); //Here i tried both myReadADC2() or myReadADC1()
if (readed > 40) { //If read threshold > 40, blink led 30 times
int i;
for (i = 0; i < 30; i++) {
Delay1KTCYx(0);
mLED_1_On();
Delay1KTCYx(0);
mLED_1_Off();
}
}
lastTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);
} /* [Ed: added] */
}//end while
}//end main
Usé dos métodos para leer desde el puerto AN9, myReadADC () que usa el método de API OpenADC ():
int myReadADC(void)
{
#define ADC_REF_VDD_VDD_X 0b11110011
OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_12_TAD,
ADC_CH9 & ADC_INT_OFF,
ADC_REF_VDD_VDD_X & ADC_REF_VDD_VSS,
0b00000010); // channel 9
SetChanADC(ADC_CH9);
ConvertADC(); // Start conversion
while (BusyADC()); // Wait for completion
return ReadADC(); // Read result
}
y myReadADC2 (), que implementa la lectura manual desde el puerto.
int myReadADC2()
{
int iRet;
OSCCON = 0x70; // Select 16 MHz internal clock
ANSEL = 0b00000010; // Set PORT AN9 to analog input
ANSELH = 0; // Set other PORTS as Digital I/O
/* Init ADC */
ADCON0 = 0b00100101; // ADC port channel 9 (AN9), Enable ADC
ADCON1 = 0b00000000; // Use Internal Voltage Reference (Vdd and Vss)
ADCON2 = 0b10101011; // Right justify result, 12 TAD, Select the FRC for 16 MHz
iRet = 100;
ADCON0bits.GO = 1;
while (ADCON0bits.GO); // Wait conversion done
iRet = ADRESL; // Get the 8 bit LSB result
iRet += (ADRESH << 8); // Get the 2 bit MSB result
return iRet;
}
Ambos casos no funcionan, toco (enviando señal analógica) el puerto AN9, pero cuando configuro el umbral alto (~ 50) el led no parpadea, con el umbral bajo (~ 0) parpadea inmediatamente cuando doy energía a la foto. Tal vez estoy usando el puerto equivocado? ¿Estoy pasando AN9 como puerto de lectura? O tal vez el umbral es incorrecto? ¿Cómo puedo encontrar el valor correcto? Gracias
Aquí está el MPLAB C18 Apis enlace .