¿Una interrupción externa interrumpe el ADC o el ADC se interrumpe?

4

Estoy trabajando en una aplicación RTC con un reloj de 1Hz conectado al pin de interrupción externo en un PIC16f887. También tengo operaciones continuas de ADC junto con el reloj de 1Hz.

Mi pregunta es si el ADC o la interrupción obtendrían prioridad si ambos ocurren al mismo tiempo. ¿Qué pasa si la interrupción ocurre durante una operación ADC? ¿Se detuvo la operación para permitir la ejecución de la interrupción? Esto obviamente invalidaría la lectura. ¿O la interrupción espera a que el ADC termine?

    
pregunta Shubham

4 respuestas

5

No, la interrupción que se produce no tiene ningún efecto en el A / D. El A / D se ejecuta desde el reloj de instrucciones o su propio reloj, dependiendo de cómo lo configure. Ambos continúan durante una interrupción a menos que ejecutes deliberadamente una instrucción SLEEP para detener el reloj del procesador.

A lo sumo, la interrupción de 1 Hz podría retrasar la rutina de interrupción procesando la conversión A / D realizada, si está haciendo esto utilizando interrupciones. No hay ningún requisito de que los resultados de A / D se manejen utilizando interrupciones. Incluso si es así, el A / D realizará su conversión y escribirá el resultado en ADRESH: ADRESL independientemente de si el procesador está tomando una interrupción o no. De hecho, el procesador en sí no está realmente "en" una interrupción. Eso es sólo una abstracción de software. Cuando se cumplen las condiciones adecuadas para una interrupción, el procesador ejecuta una llamada a la ubicación 4 y desactiva el bit GIE en INTCON. Eso es todo. El resto depende del firmware.

Una vez que A / D haya finalizado una conversión, el resultado estará disponible en ADRESH: ADRESL. Depende del firmware qué hacer con eso. El valor permanecerá allí hasta que se complete una nueva conversión. Si el firmware no inicia una nueva conversión hasta que lee el resultado del anterior, no se puede perder nada. Si una nueva conversión se inicia automáticamente, es posible que los datos anteriores se pierdan si el firmware no logra leer ADRESH: ADRESL a tiempo. Observe el tiempo de adquisición y conversión del A / D y la tasa de instrucción, y verá que generalmente hay muchos ciclos de instrucción para obtener un resultado de conversión, incluso si el evento especial de un CCP inicia automáticamente una nueva conversión. módulo. Solo asegúrese de que el código de interrupción de la marca del reloj no sea tan largo como para que el A / D tarde más tiempo en obtener un nuevo resultado. Esto debería ser fácil. Cualquier procesamiento prolongado se maneja mejor estableciendo una bandera y permitiendo que el código de primer plano llegue a él cuando lo haga. El código de interrupción debe manejar solo el servicio inmediato del dispositivo.

    
respondido por el Olin Lathrop
4

No tuve mucha experiencia práctica con la familia PIC, pero puedo decirte lo que sucedería en un chip AVR. Sospecho que son muy similares. El módulo ADC en su microprocesador funciona en paralelo a su rutina de programa. El ADC actualizará su lectura después de la conversión. En caso de que ocurra una interrupción entre la inicialización del ADC y la actualización de la salida, ocurrirá la siguiente secuencia:

  1. En su función main() , la lectura de ADC se inicializa.
  2. comienza la conversión de ADC
  3. En paralelo:
    1. La interrupción se llama
    2. Finaliza la conversión de ADC, el resultado se almacena en un registro especial
  4. La interrupción finalmente termina, su procesador regresa a main() y lee el resultado de lectura del ADC.

Este no es el uso más apropiado para los diagramas de formas de onda, pero espero que muestre esta secuencia lo suficientemente bien para usted:

    
respondido por el Jonny B Good
3

El PIC que usa solo tiene una interrupción, que es efectivamente el OR de varias fuentes de interrupción. Cuando se producen dos fuentes de interrupción simultáneamente, el efecto es que se produce un ataque introvertido. Depende de su rutina de interrupción manejar Y BORRAR las fuentes de interrupción que desea manejar. Si una de las fuentes de interrupción aún está activa cuando finaliza la rutina de interrupción, se producirá una nueva interrupción y se llamará una y otra vez, hasta que se borren todas las fuentes de interrupción (habilitadas).

    
respondido por el Wouter van Ooijen
1

En la situación general, es responsabilidad del diseñador priorizar las interrupciones

En su caso específico, si tiene algo más importante que el ADC es para usted, puede optar por abandonar la lectura del ADC. Pero generalmente una actualización de reloj de 1 Hz tolerará que se ignore por un período variable mientras se completa el ADC.

    
respondido por el Russell McMahon

Lea otras preguntas en las etiquetas