Problema con PIC32 al usar pines JTAG como entradas analógicas

0

Estoy intentando leer un valor utilizando unos pocos pines analógicos en un PIC32 (MX775F512H), incluido RB12: parte de los pines JTAG en el dispositivo. El dispositivo del que está leyendo el tablero funciona muy bien, pero el tablero en sí no puede leer el pin.

Puedo establecer el pin alto usando este código:

    DDPCONbits.JTAGEN = 0;
    TRISBbits.TRISB12 = 1;
    AD1PCFGbits.PCFG12 = 0;

Tengo la intención de deshabilitar JTAG y luego escribir todos los pines en alto. RB0 a RB7 funcionan como se esperaba, pero RB8 a RB15 flotan a unos pocos milivoltios.

¿Cómo puedo obtener mi funcionalidad esperada de estos pines? Cualquier búsqueda aquí y en Google no ha llevado a mucho, y la documentación no es clara sobre qué hacer aparte de deshabilitar JTAG.

    
pregunta alextoombs

1 respuesta

1

Así que tuve que volver a leer el documento de ADC y pedir ayuda, pero creo que encontré el camino.

Mi iteración anterior usaba un método para definir ciertos parámetros, pero finalmente terminé haciendo una asignación directa a los registros.

Para cualquier otra persona con el mismo problema, el siguiente es mi código:

Configuración para analógico:

DDPCONbits.JTAGEN = 0;
TRISB = 0x1111;

IFS1CLR = 2; //clear ADC conversion interrupt
IEC1SET = 2; //enable ADC interrupt
AD1PCFG = 0x0000; //Configure all input pins to Analog
AD1CON1 = 0b00000000000000001000000011100110; //Configure Sample clock source
AD1CON2 = 0b0000010000100000; //Configure ADC voltage reference

AD1CON3 = 0x0000; //Configure ADC conversion clock
AD1CON3bits.SAMC = 0b00001;    //auto sample at 2TAD
AD1CON3bits.ADCS = 0b00000001; //TAD = 4TPB
AD1CHS = 0x00000000; //Configure input channels- CH0+ input,

AD1CON2bits.CSCNA=1;
AD1CSSL = 0b0001001111111100;
AD1CON1SET = 0x8000; //Turn on the ADC module

Luego, para la adquisición, llamo a este método dentro de un ISR en un temporizador de ~ medio segundo:

void getAnalog() {
while( ! IFS1bits.AD1IF); //wait until buffers contain new samples
    AD1CON1bits.ASAM = 0;     //stop automatic sampling (shut down ADC basically)

    vt1 = ADC1BUF0*.003185;
    vt2 = ADC1BUF1*.003185;
    vt3 = ADC1BUF2*.003185;
    vt4 = ADC1BUF3*.003185;
    mosVolt = ADC1BUF4*.003185;
    Battery_volt = ADC1BUF5*.003185;
    vt5 = ADC1BUF6*.006125;
    vt6 = ADC1BUF7*.006125;
    Csensor_volt = ADC1BUF8*.006125;


    IFS1bits.AD1IF = 0;
    AD1CON1bits.ASAM = 1;  //restart ADC and sampling
}

Los nombres de las variables y los escaladores en cada uno pueden variar.

    
respondido por el alextoombs

Lea otras preguntas en las etiquetas