TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pibe en 13 de Enero de 2009, 06:40:37
-
Hola!
Seguramente tengais alguna solución a mi inquietud.
El programa hace interrupciones por TMR0. Al volver al punto del programa principal donde se ha interrumpido me interesaría que volviese a un punto en concreto.
Por ejemplo:
org 004
; Interrupciones cada x tiempo
repongo TMR0
cuento piedritas
me hago un café
me tomo una cervecita
blah blah
retfie
Principal
1-btfss Pibe,0
2-bsf ppp
3-btfss Pibe,1
4-bsf aaa
5-btfss Pibe,3
6-bsf bbb
goto Principal
Dependiendo de donde desborde TMR0 me interrumpirá cuando esté en la linea 1, o 3 o donde sea. A mi me interesaría que interrumpa en la linea 1, o al menos que al volver de interrupciones vuelva a linea 1.
Cómo se podría hacer?
-
que interrumpa en la linea 1 es imposible... interrumpirá donde esté en ese momento. Que vuelva siempre en el mismo sitio igual si es posible con los comandos push y pop. No se si está en todos los micros mira en tu documentación.
Dentro de la interrupción antes del retfie pones
pop -> para descartar el TOS que apunta al sitio donde se interrumpió (es necesario o se llenaria el stack).
push dirección de la linea1 -> para insertar en el TOS esa dirección y que sea ahí donde vuelva.
comprueba también si salvas el contexto que esto no te pueda afectar al programa por esta modificación.
-
Gracias Elma
Yo tengo estas macros
; Macros de grabado de registros para interrupciones
push MACRO
movwf temp_WREG ;save copy w register
movf STATUS,w
bcf STATUS,RP0 ;set bank to 0
movwf temp_STATUS ;save status
movf FSR,w ;
movwf temp_FSR ;save copy of FSR
movf __WImage,w ;
movwf temp_WImage ;save copy of __WImage
ENDM
pop MACRO
bcf STATUS,RP0 ;ensure bank is set to 0
movf temp_WImage,w ;
movwf __WImage ;restore __WImage
movf temp_FSR,w ;
movwf FSR ;restore FSR
movf temp_STATUS,w
movwf STATUS ;restore status and bank information
swapf temp_WREG,f ;
swapf temp_WREG,w ;restore working register
ENDM
Cual debo modificar ?
A que te refieres con TOS? Ya he visto que es Top of the Stack
-
Igual no me va a servir de nada, porque hay saltos a otras subrutinas en el programa principal y si modifico el puntero al volver me dejará dicha subrutina por la mitad.
-
y si usas un banderin que activas al entrar en la interrupcion y luego cuando regresa al programa principal y preguntas por aquel banderin haces que te mande a la direccion deseada y lo borras?
-
hmm.. puede ser.