La notificación de cambio de entrada no se interrumpe después de la suspensión ()

0

Tengo una base de código bastante grande que se ejecuta en un PIC24F (PIC24FJ128GB106) y tengo un controlador de IRQ de notificación de cambios que administra las entradas externas del usuario. Todo ha estado funcionando bien durante bastante tiempo, hasta que cambié un poco la sincronización para reducir la velocidad de la CPU a su oscilador FRC durante el modo de espera.

El problema que estoy encontrando es que una sola fuente de interrupción de CN ya no está activando la interrupción correctamente (el indicador CNIF no se está configurando), pero sigue activando el sistema desde el modo de suspensión ().

Todas las otras fuentes externas que estoy ejecutando a través de este controlador están configurando el bit CNIF del registro IFS1 y luego inmediatamente ingresando el controlador IRQ después de dormir () y se procesarán como esperaba.

La fuente problemática es despertar al sistema de la suspensión () y luego ejecutar las siguientes 10 o más líneas de código después de la suspensión (), ENTONCES activando el CNIF e ingresando a la interrupción. Cuando finalmente pasa por la interrupción, las condiciones de inicio han cambiado y es redundante.

Todo lo demás está funcionando como antes, por lo que estoy perdido. Que yo sepa, nada serio fue cambiado.

La prioridad CN es a las 7, he habilitado todos los bits CNEN para cada fuente individual, he comprobado todas las demás fuentes y todas ellas activan el indicador CNIF y se establece el bit de habilitación de interrupción CN. La fuente real que estoy monitoreando definitivamente está alternando entre 0 y 1 (es una línea de activación de 12v) cuando está apagado / encendido.

¿Hay alguna cosa evidente que no haya marcado aquí?

Editar:

Vale la pena mencionar que esta única fuente externa también hace que MPLABX se rompa en un punto de interrupción imaginario después de dormir ().

...
Sleep();
/* Woken up! */
}

Los puntos de interrupción del código EN la llave de cierre. No puedo evitar que esto suceda en esta fuente, pero no parece haber una razón clara para ello. No se han establecido puntos de interrupción, trampas, RCON parece estar bien, etc.

Todas las demás fuentes (hay otras 3 fuentes habilitadas para CN) funcionan correctamente ...

    
pregunta njt

1 respuesta

1

Esto no explica exactamente lo que describe, pero podría ser relevante. Recuerde que en la mayoría de los PIC (no recuerde si el PIC 24 hace esto específicamente) la instrucción que sigue a SLEEP se recupera y está en proceso, por lo tanto, siempre se ejecuta como la primera instrucción después de que el procesador se activa. Esto es cierto ya sea que la condición de activación cause una interrupción o no. A menudo, esta instrucción adicional es inofensiva, pero no si se mete con el estado de interrupción. Para estar seguro, puede poner un NOP inmediatamente después de SLEEP.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas