Estoy programando un PIC16F1934 y estoy usando dos canales ADC, a saber, AN0 y AN1.
Tomo el máximo de un puñado de lecturas para la lectura AN0 y luego solo una muestra para AN1.
Aquí está mi código:
ADCON0 = 0b00000001; // Source: AN0, Enable ADC
for (uint8_t i = 0; i < 46; i++) {
ADCON0bits.GO_nDONE = 1; // start conversion
while (!ADCON0bits.GO_nDONE); // wait for result
rawADCResult = *((uint16_t*) & ADRESL);
ADCResult = ((uint32_t) rawADCResult * 500ul) >> 10; // Scale it to 100x volts
if (maxADCResult < ADCResult) // Check if value has changed
maxADCResult = ADCResult; // and update last value
__delay_us(50);
}
ADCON0 = 0b00000100; // Source: AN1, Disable ADC
__delay_ms(500);
ADCON0 = 0b00000101; // Enable ADC
__delay_ms(500);
ADCON0bits.GO_nDONE = 1; // start conversion
while (!ADCON0bits.GO_nDONE); // wait for result
rawADCResult = *((uint16_t*) & ADRESL);
ADCPORTA1 = ((uint32_t) rawADCResult * 500ul) >> 10; // Scale it to 100x volts
El maxADCResult del canal AN0 está bien. Pero el valor de ADCPORTA1 siempre coincide con el valor del canal AN1.
Estoy imprimiendo estos valores en la pantalla LCD y me he asegurado de que no estoy copiando la misma variable dos veces:
lcdSetCursor(1, 1);
sprintf(msg, "AN0: %d ", ADCResult);
lcdWriteString(msg);
lcdSetCursor(2, 1);
sprintf(msg, "AN1: %d ", ADCPORTA1);
lcdWriteString(msg);
Una cosa más, si cambio el orden de la lectura del canal (primero AN1, luego AN0). La situación se invierte. Ahora el resultado de AN1 se copia a AN0.
Probé estas cosas, pero no sirve de nada:
- Deshabilitando la habilitación del ADC en b / w cada cambio de canal.
- Presentamos grandes retrasos para permitir que el MUX cambie el canal o que el ADC se encienda.
- Escribir registros completos en cada comando para asegurarse de que todos los bits estén de acuerdo con la necesidad.
- Cambiando completamente los nombres de las variables utilizadas con AN0 y AN1.
¿Puede alguien ayudarme con una visión de este problema?