Autor Tema: Duda: No consigo salir de una interrupción :(  (Leído 3953 veces)

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

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Duda: No consigo salir de una interrupción :(
« en: 25 de Enero de 2010, 14:21:50 »
Hola, he hecho un programa en ASM para controlar un servo según se pulse un botón. Pulsando una vez el servo va hacia un lado y pulsando otra se va hacia el otro y así sucesivamente.
Al simularlo con el ISIS, arranca bien y el servo se posiciona a un lado, pero al apretar el botón el PIC se queda bloqueado, cosa que debugeando he visto que no sale de la interrupción aunque he probado de cambiar todo el registro INTCON y hacer un bit clear del RBIF pero no consigo modificar este registro de ninguna manera, ni manualmente en el MPLAB se me cambia de valor, solo se queda en: '00001001' y no hay manera de sacarlo de ahí. Alguna ayuda por favor??????

A continuación pongo el programa entero:

Código: [Seleccionar]
;**************************************************************
;*          Control de un servo por PWM                       *
;**************************************************************

;-------------CABAECERA--------------

list p=16F84A3
#include P16F84A.inc
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;------------VARIABLES---------------

Boton EQU 0
Motor EQU 0
Estado EQU 0x20
Contador1         EQU 0x21

;-----------PROGRAMA-----------------

RESET: org 0x00
goto         INICIO
org 0x04
goto         INTER


INICIO:          bsf STATUS,RP0
movlw b'11110'
movwf TRISA
movlw b'11111111'
movwf TRISB
bcf STATUS,RP0
movlw b'10001000'
movwf INTCON
bcf INTCON,RBIF
bcf Estado,0
goto         CONTROL

CONTROL:  btfsc         Estado,0
goto GIRO1
goto GIRO2

GIRO1: bsf PORTA,0
call RETA_1
bcf PORTA,0
call RETA_1
goto CONTROL

GIRO2: bsf PORTA,0
call RETA_2
bcf PORTA,0
call RETA_2
goto CONTROL

RETA_1: movlw d'249'
movwf Contador1
BUCLE1: nop
decfsz Contador1
goto BUCLE1
return

RETA_2: movlw d'199'
movwf Contador1
BUCLE: nop
nop
nop
nop
nop
nop
nop
decfsz Contador1
goto BUCLE
return


INTER: btfsc Estado,0
goto CAMBIO0
movlw 0x01
movwf Estado
bcf INTCON,RBIF
retfie

CAMBIO0: movlw 0x00
movwf Estado
bcf INTCON,RBIF
retfie
End

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #1 en: 25 de Enero de 2010, 14:25:15 »
Hay que leer el datasheet a fondo...

La interrupcion por cambio en el puertob, requiere que lo leas para que se actualice el latch.  Intenta limpiar el RBIF y hacer un movf portb,f aunque sea antes de salir de la interrupción.

Saludos.
« Última modificación: 25 de Enero de 2010, 14:28:14 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #2 en: 25 de Enero de 2010, 14:34:53 »
Perfecto, muchas gracias. Nunca se me habría ocurrido hacer eso :)   ;-)

Qué utilidad tiene leer el puerto para poder midificar el registro INTCON? En este caso ninguna pero supongo que será por si tienes varias teclas saber cual se pulsó no? Pasaria algo si no uso un return o un retfie para volver de la interrupción y simplemente modifico el registro INTCON y hago un goto?

Saludos

--EDITO--

Otra cosa. Haciendo debugg con el MPLAB el programa funciona como esperaba, pero si lo simulo con el ISIS, el motor se queda a un lado con el botón sin apretar y solo va al otro lado si mantengo apretado el botón, cosa que no está programado para eso. La idea era que apretando una vez fuese a un lado y apretando otra se fuese hacia el otro.
La opción "toogle" del MPLAB es para solo apretar 1 vez no?
« Última modificación: 25 de Enero de 2010, 14:54:23 por Chuk »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #3 en: 25 de Enero de 2010, 15:32:31 »
Hola. No se si entendi bien, pero si te estas refiriendo a qué utilidad tiene leer el puerto B:

Técnicamente no modifica el registro INTCON de ninguna manera la lectura. Lo que hace es actualizar el latch. El latch es un registro donde se mantiene, en este caso, el valor del PORTB actual. La interrupcion por cambio de puerto B hace una "copia" del valor de los pines RB4-RB7, y los somete a un circuito de comparacion con el estado actual del puerto. Si configuras la interr del puertoB, en cuanto aparece una diferencia entre el valor guardado del puerto, y el actual, se levanta la bandera RBIF y se produce la interrupcion en caso de estar habilitada.

El registro INTCON(ni ningún otro) ofrece ningún tipo de informacion de qué pin o pines del puerto B cambiaron de estado. A eso debes hacerlo vos, por ejemplo, apoyandote en un registro auxiliar para copiar el ultimo estado conocido del puerto B y poder compararlo con el actual.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #4 en: 25 de Enero de 2010, 16:03:39 »
Gracias Brunof. De lo que te comentaba del problema de la simulación con Proteus tienes alguna idea de porqué puede pasarme eso??? No encuentro el fallo por ningún sitio y simulando con MPLAB funciona bien. Si pudiese abrir el Proteus Viewer igual lo solucionaba, pero no lo consigo ya que me salta un error.

Saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #5 en: 25 de Enero de 2010, 16:21:45 »
No se realmente. Pero veo que tenes un problema. Cuando ingresas al vector de interrupcion, debes guardar, minimamemte para el programa actual, en variables temporales el registro W y el STATUS, y recuperarlos antes de salir de la interrupción.

En el datasheet hay una seccion que se llama "Context Saving During Interrupts" que trae un codigo de ejemplo para que veas a lo que me refiero.

Tal vez sea eso.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #6 en: 25 de Enero de 2010, 16:24:31 »
Ya vi en otros ejemplos que se suele hacer eso pero para esta aplicación no lo creí necesario ya que no me afectan los registros esos, pero de todas formas probaré a ver. Por lo de "no volver" de una interrupción hay algún problema? O sea en lugar de tener un return o un retfie poner un goto?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #7 en: 25 de Enero de 2010, 16:45:37 »
Sí hace falta en tu ejemplo guardar mínimamente W.

Sí que hay problemas por no volver de una interrupción. El return o retfie liberan el STACK. Así como está esa parte me parece bien.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #8 en: 25 de Enero de 2010, 17:18:28 »
Había cambiado el retfie por el goto ya que al terminar la interrupción, si no había terminado de hacer un ciclo del PWM anterior lo acababa antes de cambiar el ancho del pulso y así sería más preciso pero bueno, físicamente ni se notará la diferencia. Ya he hecho lo de guardar los registros W y STATUS y sigo en las mismas. Lo que se me ha ocurrido es que las interrupciones las interprete como estados altos o bajos o cambios de estado, y no como apretar y soltar un botón no? Supongo que serán así. Como puedo configurar las interrupciones para que solo tenga en cuenta una interrupción al presionar y soltar un botón en lugar de que las reconozca por cambios de estado?

saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #9 en: 25 de Enero de 2010, 17:21:09 »
Hola. O bien utilizas la interrupcion INT, asociada al pin RB0 que permite configurar el flanco que produzca la interrupcion, o bien tenes que hacer por software la detección. Por ejemplo, sólo considerás cuando se presiona un pulsador, pero obvias si se suelta.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #10 en: 25 de Enero de 2010, 17:31:43 »
Vale, pues ese era el fallo  :) Como se puede configurar el tipo de interrupción de RB0? Solo encontré el registro INTCON para configurar interrupciones


saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #11 en: 25 de Enero de 2010, 17:54:37 »
Podes encontrar la informacion necesaria sobre esa interrupcion, en el apartado "RB0/INT INTERRUPT" del datasheet correspondiente a tu PIC.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #12 en: 25 de Enero de 2010, 19:38:43 »
Este hilo te va a ser de utilidad, como bien dijo Bruno solo falta leer un poco más  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Chuk

  • PIC10
  • *
  • Mensajes: 23
Re: Duda: No consigo salir de una interrupción :(
« Respuesta #13 en: 26 de Enero de 2010, 05:08:18 »
Gracias Suky pero ya tengo siempre abierto es hilo que lo voy leyendo poco a poco lo que no me había fijado en lo del OPRION_REG en concreto. Sobre el convertidor A/D del pic no hay ningun ejemplo?