Autor Tema: Consulta interrupcion RB4-7 en 16f873a  (Leído 146 veces)

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

Desconectado bluesboy

  • PIC12
  • **
  • Mensajes: 64
Consulta interrupcion RB4-7 en 16f873a
« en: 29 de Agosto de 2018, 12:32:39 »
Buenas tardes

Tengo configurado una interrupción por RB4-7. Tengo una entrada de int en RB4 y otra distinta en RB7, cada una con un pulsador NA, además de estar RB5-6 dispuestas como salidas.

¿Qué se les ocurre que puedo hacer para diferenciar por soft cuando se activó la 4 o la 7? Lo que estoy haciendo es: ni bien entra en la interrupción, deshabilitar todas las ints, leer el puertoB  y diferencio ...o eso debería hacer. Lo cierto es que no funca y hace el mismo proceso para RB4 y RB7, es como si no pudiera diferenciar.

Deshabilito ints y leo el puertoB porque apuesto a que el pulsador se mantiene en contacto mas de unos pocos microsegundos que tarda el pic en hacer todo el proceso. Pero si alguien me dice como hago para que el estado del pulsador, que son NA, se mantenga en el puerto...creo que me soluciona el problema :-)


Estoy programando en assembler, acepto cualquier sugerencia.

Gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6850
Re:Consulta interrupcion RB4-7 en 16f873a
« Respuesta #1 en: 29 de Agosto de 2018, 12:54:30 »
Citar
Lo que estoy haciendo es: ni bien entra en la interrupción, deshabilitar todas las ints, leer el puertoB  y diferencio ...o eso debería hacer. Lo cierto es que no funca y hace el mismo proceso para RB4 y RB7, es como si no pudiera diferenciar.

Deshabilito ints y leo el puertoB porque apuesto a que el pulsador se mantiene en contacto mas de unos pocos microsegundos que tarda el pic en hacer todo el proceso. Pero si alguien me dice como hago para que el estado del pulsador, que son NA, se mantenga en el puerto...creo que me soluciona el problema :-)

Al entrar a la interrupcion se deshabilita por si sola las interrupciones, no necesitas deshabilitarlas de nuevo. El RETFIE las activa nuevamente.

Para descriminar cual es necesitas leer si cambio la entrada. El tema es que esa interrupcion va a entrar cuando cambie de nivel cualquiera de RB4 a RB7, entre estos:

- Las salidas RB5 y RB6 cambien de estado, va a entrar a la interrupcion.
- Las entradas cuando presiones el boton
- Las entradas cuando soltes el boton.

Vos tenes que discriminar cuando se presione el boton. Como lo haces?, Suponiendo que tengas los pull-ups activos y el switch los lleve a 0:

Código: ASM
  1. SUB_INTERRUPCION_RBI:
  2.    BTFSS   PORTB, 4
  3.    CALL     DETECTADO_RB4
  4.    BTFSS   PORTB, 7
  5.    CALL     DETECTADO_RB7
  6.    ;Si llego aca es que ocurrio cualquier otra de las demas acciones ( cambio de salidas, o soltar el boton)
  7. SALIR_RBI:
  8.    MOVF    PORTB, W         ; Leo el PORTB para poder limpiar el flag
  9.    BCF      INTCON, RBIF    ; Limpio flag
  10.    RETURN                       ; Salgo

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3202
Re:Consulta interrupcion RB4-7 en 16f873a
« Respuesta #2 en: 29 de Agosto de 2018, 13:22:21 »
Código: [Seleccionar]
[quote author=KILLERJC link=topic=48969.msg406631#msg406631 date=1535558070]

SALIR_RBI:
   MOVF    PORTB, W         ; Leo el PORTB para poder limpiar el flag
   BCF      INTCON, RBIF    ; Limpio flag
   RETURN                       ; Salgo
[/quote]

Una pregunta KILLER ¿al salir de la interrupción la instrucción no debe ser RETFIE en vez de RETURN?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6850
Re:Consulta interrupcion RB4-7 en 16f873a
« Respuesta #3 en: 29 de Agosto de 2018, 13:47:19 »
Si Fer..

Pero el codigo que pase es solo una subrutina a llamar desde la interrupcion, sino deberia haber puesto todo el codigo para salvar el contexto ( W, STATUS y PCLATH) es decir la funcion de interupcion seria algo asi:

Código: ASM
  1.   ORG 0x04
  2.   GOTO  INTERRUPCION
  3.  
  4.  
  5.  
  6. ; .... codigo
  7.  
  8.  
  9. INTERRUPCION:
  10.     ;Aca debo guardar W y STATUS como minimo
  11.  
  12.     ;Pregunto por la bandera de la interrupcion
  13.     BTFSC INTCON, RBIF
  14.     CALL   SUB_INTERRUPCION_RBI
  15.  
  16.     ; Aca pongo otras interrupciones si tengo, de la misma forma que la anterior
  17.  
  18.     ; Aca debo devolver el valor de W y STATUS a sus estados originales
  19.     RETFIE

O se puede hacer con GOTO, y poner una etiqueta antes de restaurar W y STATUS, para poder salir.
Lo que permite usarlo con CALL es no re-entrar en caso de que varias interrupciones ocurrieron al mismo tiempo. Obviamente puede existir la posibilidad que ocurra de todas formas.

Desconectado bluesboy

  • PIC12
  • **
  • Mensajes: 64
Re:Consulta interrupcion RB4-7 en 16f873a
« Respuesta #4 en: 30 de Agosto de 2018, 09:27:43 »
Muchas gracias
Tengo algo similar, voy a revisar a ver si no es que me está jorobando algún cambio en RB5 yRB6.

Gracias.