Hoy día tengo un poco más de tiempo para continuar.
Respecto a que la interrupción externa INT2, debe reiniciar al temporizador TMR4, creo que puedo hacer esto:
void ManejarInterrupcionExterna (EXTERNAL_INT_PIN pin, uintptr_t context)
{
TMR4_Stop(); // Detengo a TMR4:
TMR4 = 0x0000; // Limpio/reinicio el conteo
ADC_ConversionStart(); // inicia la conversión
TMR4_Start(); // inicia a funcionar el temporizador 4
/** Cambio de buffer **/
appsamplingData.punteroABuffer++; // apunto al siguiente Buffer
if (appsamplingData.punteroABuffer > 0x01)
{
appsamplingData.punteroABuffer = 0x00;
}
appsamplingData.estructuraADC[appsamplingData.punteroABuffer].muestra = 0x00; //limpio puntero (muestra) del buffer
}
En cuanto al evento de la interrupción externa sucede cuando aun el ADC está adquiriendo/convirtiendo, aun no sé, es como determinar si el ADC está en cualquiera de esos estados.
El bit SAMP del registro AD1CON1, cuando está cero puede significar dos cosas, no está adquiriendo datos, o el ADC está en modo conversión.
Mientras que en el mismo registro, el bit DONE, sólo se pone a uno para informar que la conversión ADC a finalizado.
Podría recurrir a una bandera para conocer que el ADC está en cualquiera de los dos modos, algo así:
TMR4_Stop(); // Detengo a TMR4:
TMR4 = 0x0000; // Limpio/reinicio el conteo
ADC_ConversionStart(); // inicia la conversión
bandera = true; // ADC inicia proceso
TMR4_Start(); // inicia a funcionar el temporizador 4
void ManejarInterrupcionADC(uintptr_t context)
{
bandera = false; // ADC finaliza proceso
appsamplingData.estructuraADC[appsamplingData.punteroABuffer].bufferADC[appsamplingData.estructuraADC[appsamplingData.punteroABuffer].muestra] = ADC_ResultGet(ADC_RESULT_BUFFER_0);
appsamplingData.estructuraADC[appsamplingData.punteroABuffer].muestra++;
}
Si no encuentro alguna otra opción, deberé hacerlo de esa manera.
Otra duda que tengo, es que el ejemplo que estoy tomando como referencia, tiene el muestreado en modo automático.
Según las hoja de datos, en ese modo, cuando finaliza una conversión, de manera automática, entra en modo de muestreo:

Pero en mi caso yo debo esperar hasta que el temporizador produzca una interrupción, entonces, lo que entiendo, es que cuando hayan pasado los 100 us, y ejecute la línea ADC_ConversionStart, lo que voy a obtener es la muestra de 100 us atrás, no la de ese momento. Obviamente en una señal de muy baja frecuencia, o DC, no tendría mucha importancia.
O tal vez no sea tan crítico, que mi señal muestreada, sea de hace 100 us en el pasado.Tal vez deba utilizar el modo manual de activar el muestreado, y también creo que debería manualmente, activar la conversión.
Otra duda que tenía, era con el nivel de prioridad de las interrupciones, y que sucede cuando dos ocurren al mismo tiempo.
La interrupción externa es la que tiene la prioridad más alta, 7, las otras dos tienen prioridad de 1.
Pienso que la interrupción del ADC, debe ser la de más alta que INT2, y la del TMR4, debe ser la más baja.
ADC > INT2 > TMR4.
Hay dos escenarios
1. Sucede la interrupción externa y la del TMR4 al mismo tiempo
En este caso, la interrupción de INT2, bloquea a la interrupción del TMR4, y INT2, lo que hace es inicializar al temporizador, conmuta de buffer y arranca al ADC, luego la interrupción del temporizador no tendría que ser, ya que el ADC ya está funcionando, la bandera antes mencionada sería útil para tal caso.
2. Sucede la interrupción externa y la del ADC al mismo tiempo
La muestra ADC se guarda en el buffer actual y cuando se reanuda la interrupción externa, se reinicia al temporizador y se cambia de buffer.
La interrupción del TMR4 y del ADC al mismo tiempo, no es posible, ya que el temporizador, es quien inicializa al ADC, y su interrupción sucede luego.