Regresando de interrupciones en una ubicación diferente de donde ocurre la interrupción. (FOTO16F877A)

¿Hay alguna forma de regresar de las interrupciones en una ubicación diferente de donde ocurrió la interrupción en Microchip PIC16F877A?

Tengo un problema donde necesito que mi código se reinicie en un punto específico siempre que ocurre una interrupción externa y el ISR acaba de terminar.

Estoy pensando en usar instrucciones de ensamblaje en línea en mi código C para obtener la dirección que quiero devolver y cambiar la parte superior de la pila a esa dirección, pero supongo que el PIC16F877A no es compatible con eso.

¿Por qué no tener la próxima instrucción después de que el ISR te envíe a donde quieres ir?
Porque no sé cuál es la siguiente instrucción después del ISR. Depende de dónde estaba el contador de programa en el momento de la interrupción.
Desafortunadamente, la serie PIC16 no le da acceso a los registros de la pila, por lo que no hay forma de manipular la dirección de retorno. Si realmente necesita esta funcionalidad, deberá actualizar a un PIC18.
¿Qué, exactamente estás tratando de hacer?
No puede hacer lo que pide en ese PIC, pero esto suena como un detalle de implementación que ha imaginado en lugar de su verdadero problema. También suena como una arquitectura de software torpe si quieres hacer esto.

Respuestas (2)

Tienes razón, los PIC anteriores a PIC18 no permitían cambiar la parte superior de la pila.

Estás haciendo una de las preguntas clásicas que me han llevado a evitar los PIC, y especialmente todo lo anterior a PIC18 como la plaga proverbial. pila de PIC de wikipedia

Es algo perfectamente normal, siempre que comprenda lo que está haciendo, y no ilógico. Es un mecanismo central para sistemas operativos multitarea o multiproceso.

La razón normal para hacer algo así es hacer un cambio de contexto del sistema operativo (SO). Esto permitiría que el software creara la ilusión de muchos procesos concurrentes. Cuando se ha atendido una interrupción, es posible que el sistema operativo no desee volver al proceso interrumpido, pero es posible que deba ejecutar una pieza de código diferente. Parte del mecanismo es cambiar el puntero de la pila a la pila de un proceso diferente y luego ejecutar el retorno de la interrupción.

Consulte AN818 Manipulación de la pila del microcontrolador PIC18 para saber cómo cambiar la dirección de retorno. Tenga en cuenta que es un documento PIC18.

Tristemente, ASUNTO es que PIC no es capaz de hacer eso.

Una técnica alternativa inferior es hacer que su bucle de control principal verifique una variable para detectar cuándo debe salir y ejecutar ese otro código.

¿Hay alguna forma de forzar un RESET?

¡Hola, Gbulmer! Estaba tratando de encontrar una manera de cambiar la parte superior de la pila exactamente para evitar esa alternativa inferior que mencionaste. Pero si no hay forma de manipular la pila, no tendré otra opción.
@ stdio.h - Simpatizo mucho. Es una cosa perfectamente razonable querer hacer. Hace muchos años, un amigo mío escribió algo así como el cambio de tareas principal para un sistema operativo en tiempo real en C++, con solo unas 4 líneas de ensamblador para manipular el puntero de pila y hacer ese intercambio de pila. Era solo una biblioteca, que se ejecutaba dentro de un proceso ordinario. Supongo que no hay forma de actualizar la MCU.
Es un trabajo de pregrado. Supongo que mi maestro me dirá que es mejor escribir un código inferior que actualizar la MCU en situaciones de la vida real. Pero soy muy propenso a actualizar la MCU, porque odio verificar las banderas en todo mi código. Parece una solución rápida.

No, lo que pides es imposible e ilógico.

Sería como cambiar de carril en una autopista y luego volver al primer carril pero querer estar a 25 millas de distancia viajando en la otra dirección. Simplemente no va a suceder a menos que cambies las leyes de la física o crees un agujero de gusano, y créeme, no quieres hacer eso.

Una interrupción es exactamente lo que parece: interrumpe el flujo normal del programa para realizar algunas operaciones, luego se reanuda el flujo normal del programa. La interrupción no tiene control directo sobre el flujo de ese programa; todo lo que puede hacer es modificar las variables que su programa principal podría examinar para ver si se requiere un reinicio.

Otra analogía sería que estás trabajando en tu escritorio escribiendo una carta. El teléfono suena y te interrumpe. Tú responde. Cuando cuelgas el teléfono, todavía estás en tu escritorio con tu carta frente a ti. Bajar el teléfono no puede teletransportarte al baño.

Para obtener más aclaraciones, una lectura rápida de la hoja de datos proporciona todas las pruebas que necesita para saber que es imposible:

La familia PIC16F87XA tiene una pila de hardware de 8 niveles de profundidad x 13 bits de ancho. El espacio de la pila no forma parte del programa ni del espacio de datos y el puntero de la pila no se puede leer ni escribir. La PC se coloca en la pila cuando se ejecuta una instrucción CALL o una interrupción provoca una bifurcación. La pila es POP en caso de ejecución de una instrucción RETURN, RETLW o RETFIE. PCLATH no se ve afectado por una operación PUSH o POP.