Autor Tema: No funcionan la interrupciones en la pagina1 del pic16f877A  (Leído 2894 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DARPE777

  • PIC10
  • *
  • Mensajes: 6
No funcionan la interrupciones en la pagina1 del pic16f877A
« en: 13 de Noviembre de 2017, 10:20:02 »
Ante todo, hola a todos.
He leído mucho pero no encuentro la solución.
Estoy realizando un programa que se me esta haciendo extenso. Necesito otra pagina mas para seguir programando. Pero me doy cuenta que en la página 0 del pic si funcionan las interrupciones pero en la pag 1 no. ( Programo en ASM)
Antes cuando llego a la interrupción guardo w,fsr,pclach ,status y los devuelvo a su estado antes de rtfie y borro las banderas, lo he mirado con el debug y un Icd3 .
 En la pag1 se encuentra Intcon = 11010011: Activado GIE, INTE, INTF en PIE2 00000001 Activado CCP2IE y la bandera activada en CCP2IF. Con todo esto mirando en un bucle en la PAG1 el micro no activa la interrupción.
 Me estoy volviendo loco , ¿en què fallo?.
 Me direcciono a las páginas siempre pclach antes y después de la intrucción CALL.
Una mano por favor y si no al cuello  :oops: :oops:
Si se necesita tengo el programa en.asm
Un saludo y gracias de antemano. Cualquier ayuda sera muy agradecida.

Perdonar creo que este no es foro donde tiene que estar, ruego a los moderadores que lo muevan a su sitio, disculpen mi torpeza.
« Última modificación: 13 de Noviembre de 2017, 10:33:09 por DARPE777 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #1 en: 13 de Noviembre de 2017, 13:36:53 »
Proba creando un codigo de ejemplo..

En ves de usar tu programa, asi evitas cualquier problema del otro codigo. Crea un codigo que el CCP en modo comparacion cambie el estado de una salida y nada mas. El programa que te quede asi:

Código: ASM
  1. ORG 0x00
  2.         GOTO INICIO
  3.         ORG 0x04
  4.         GOTO INTERRUPCION
  5.  
  6. INTERRUPCION:
  7.         ;Aca codigo de guardar contexto
  8.         ;Codigo de interrupcion
  9.         ;Codigo de restauracion de contexto
  10.         RETFIE
  11.  
  12. INICIO:
  13.         ;Aca codigo de configuracion de puertos y CCP
  14.         GOTO LOOP
  15.  
  16.         ORG 0x800
  17. LOOP:
  18.         GOTO LOOP

Si eso funciona entonces seguramente este algo mal en el programa. Ya que estariamos en la pagina 1, y si estaria funcionando.

Cuando ocurre una interrupcion se pone en el PC 0x004 asi que no hay forma por mas que estes en otra pagina, ya que no influye el PCLATH, en los RETURN y RETFIE tampoco importa el PCLATH ya que se toma desde el PC los 13bits y pasan al PC. La unica duda que tengo es si al llamarse la interrupcion la direccion guardada tiene en cuenta el PCLATH, pero me parece que no deberia.

Por ultimo revisa si no estas pasandote en llamadas anidadas y estes provocando un overflow del stack.
« Última modificación: 13 de Noviembre de 2017, 13:54:26 por KILLERJC »

Desconectado DARPE777

  • PIC10
  • *
  • Mensajes: 6
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #2 en: 13 de Noviembre de 2017, 14:50:59 »
Gracias por responder. Esta noche miraré a ver si me he sobrepasado en el stack. Lo otro lo hice con mi programa y no funciona así q lo haré como tú dices para probar.
Gracias de nuevo y te tendré informado.

Desconectado DARPE777

  • PIC10
  • *
  • Mensajes: 6
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #3 en: 13 de Noviembre de 2017, 20:40:48 »
Imposible mirar el stack en modo debug con el Icd3, en el mplab8.9 y en mplabX4.0.
Muchas gracias de todas formas,seguro que será una tontería pero me esta dando uno de los mayores rompederos de cabeza por hobby de vida.  :D :D :D
Me tiro por la segunda opción.
Volver a escribirlo pero primero probando desde las 4pag del micro.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #4 en: 13 de Noviembre de 2017, 22:51:41 »
Es que el stack no es accesible, y es por hardware. Probaste realizar un codigo como dije ?

Desconectado DARPE777

  • PIC10
  • *
  • Mensajes: 6
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #5 en: 14 de Noviembre de 2017, 05:50:30 »
No he tenido tiempo. Tengo dos rutinas de 4 años y de 1 año q comen todo el tiempo del mundo así q son las noches donde saco mi tiempo. El stack lo conseguí ver en modo simulado en mplab X y lo q vi es q tenía anidado 6 pero en otra sección del programa. Así que esta noche estaré otra vez para probar. Te tengo informado y gracias por las molestias q te estás tomando

Desconectado DARPE777

  • PIC10
  • *
  • Mensajes: 6
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #6 en: 15 de Noviembre de 2017, 06:38:44 »
Solucionado.
Ahora si alguien me lo puede explicar se lo agradezco.
¿Qué diferencia existe entre estas dos cosas?
ORG 0x00
GOTO INICIÓ
ORG 0x04
GOTO INTERRUPCIÓN
 
INTERRUPCIÓN


ORG 0x00
GOTO INICIO
ORG 0x04

INTERRUPCIÓN

Con esta última funciona.

Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #7 en: 15 de Noviembre de 2017, 08:24:47 »
Es que el GOTO utiliza el PCLATH...  :D

Y en el otro no tenes un GOTO, sino que entra directamente a la interrupcion.

Ahora veo el problema, ni siquiera se me habia ocurrido jeje, si queres usar el goto, deberias guardar el PCLATH, ponerlo a 0 y luego si ir al GOTO, todo eso sin modificar los registros STATUS/W
En resumen deberias tener la rutina de guardado de contexto ubicado en ORG 0x04 y recien alli ubicar el GOTO a tu rutina de interrupcion.

Por si no quedo claro... En el primer programa tu memoria queda:

0x0000 GOTO INICIO
0x0001 ADDLW 0xFF  ; Creo que esto esta por default que es el valor 0xFF
0x0002 ADDLW 0xFF
0x0003 ADDLW 0xFF
0x0004 GOTO   0x0005   ; Si es que tenes tu rutina asi como esta en el primer codigo
0x0005 MOVF   xxx         ; Primera instruccion de INTERRUPCION

vs 2do programa

0x0000 GOTO INICIO
0x0001 ADDLW 0xFF  ; Creo que esto esta por default que es el valor 0xFF
0x0002 ADDLW 0xFF
0x0003 ADDLW 0xFF
0x0004 MOVF   xxx         ; Primera instruccion de INTERRUPCION


En si el micro va a ir a 0x0004 y ejecutar esa instruccion primero, el resultado es identico si observas. Excepto que con mas paginas el GOTO se ve afectado por el PCLATH
« Última modificación: 15 de Noviembre de 2017, 08:28:00 por KILLERJC »

Desconectado DARPE777

  • PIC10
  • *
  • Mensajes: 6
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #8 en: 15 de Noviembre de 2017, 10:31:35 »
Muchas gracias, lo he comprendido, ya decía yo que tenía que ser un fallo tonto. Al final estoy aprendiendo más con los fallos que leiendo.  :D
Ahora ya si puedo acabar el proyecto, tengo ganas de probar otros micros y no se con cuál empezar.
Bueno muchas gracias por todo.
Te debo un favor.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No funcionan la interrupciones en la pagina1 del pic16f877A
« Respuesta #9 en: 15 de Noviembre de 2017, 11:51:43 »
Citar
Muchas gracias, lo he comprendido, ya decía yo que tenía que ser un fallo tonto. Al final estoy aprendiendo más con los fallos que leiendo.  :D

Es asi normalmente.. de todas formas no desmerece a leer.

Citar
Ahora ya si puedo acabar el proyecto, tengo ganas de probar otros micros y no se con cuál empezar.

En si la arquitectura del PIC16 se comparte con toda esa familia. Por lo que usar este micro u otro la diferencia va a ser los modulos. Y en el caso de los ultimos PIC16 ( Uno no tan ultimo es el PIC16F1707) poseen un par mas de funcionalidades, otro FSR, nuevas instrucciones para el direccionamiento indirecto, W es un registro accesible, registro aparte para indicar el banco, etc, pero siempre respetando la misma arquitectura.

La otra es irte a PIC18, ya alli cambia la arquitectura, y va a ser distinto programar en ASM, algunas similitudes y otras no. Pero va a ser algo nuevo. Y por supuesto mientras mas nuevos, seguramente tengan alguna mejora respecto de los viejitos.



 

anything