¿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.
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?
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.
Campos EM
usuario49894
brahans
gbulmer
olin lathrop