Autor Tema: Int Externa PIC16F84A  (Leído 1828 veces)

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

Desconectado Guille1708

  • PIC10
  • *
  • Mensajes: 2
Int Externa PIC16F84A
« en: 16 de Junio de 2022, 11:12:14 »
Buenas, estoy haciendo un trabajo para la universidad, el programa se basa en un pulsador de agua inteligente el cual cuando se le pulsa RB0 debe sacar agua durante X tiempo, y con cada pulsación se ira disminuyendo hasta 9 pulsaciones que no saldrá agua. Además, mientras salga agua no puede ocurrir una interrupción, pero si hago una interrupción aunque no vaya a la RSI porque esta desactivada, el flag INTF sigue poniéndose a 1. ¿Saben de alguna solución?
« Última modificación: 16 de Junio de 2022, 11:52:58 por Guille1708 »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Int Externa PIC16F84A
« Respuesta #1 en: 16 de Junio de 2022, 14:35:57 »
Hola, corrigeme si hay alguna de estas presunciones mias equivocada.
  • Programas en assembler
  • Leiste bien cuales interrupciones debes evitar y apagaste todos los bits, es decir el general de interrupciones.

Si eso es correcto, deberías conectarte con un debugger en linea, que permite ver en el momento que ocurre la interrupción, cual es la causa que la determina.
Podria ser un timer programado para ejecutar el programa cíclicamente (muy usado para hacer una actualización programada).

u otra interrupción.
Busca el bit de interrupción global y desactiva todo.
No debería aparecer una nueva interrupción.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Guille1708

  • PIC10
  • *
  • Mensajes: 2
Re:Int Externa PIC16F84A
« Respuesta #2 en: 16 de Junio de 2022, 14:45:34 »
Hola, corrigeme si hay alguna de estas presunciones mias equivocada.
  • Programas en assembler
  • Leiste bien cuales interrupciones debes evitar y apagaste todos los bits, es decir el general de interrupciones.

Si eso es correcto, deberías conectarte con un debugger en linea, que permite ver en el momento que ocurre la interrupción, cual es la causa que la determina.
Podria ser un timer programado para ejecutar el programa cíclicamente (muy usado para hacer una actualización programada).

u otra interrupción.
Busca el bit de interrupción global y desactiva todo.
No debería aparecer una nueva interrupción.




Es correcto, programo en assembler en el pic16f84a, en el programa mplab.

Mas concretamente que a lo mejor no me he explicado bien, es que cuando el usuario pulsa RB0, al tenerlas desactivadas no se genera, pero si que se actualiza su flag (INTF), de manera que al entrar a la RSI, yo compruebo si ha entrado ahi por INTE mediante el flag INTF, pero cuando entre en el caso que es por overflow, lo contara como una interrupcion externa:


¿Sabes de alguna manera en que no se actualice el flag INTF si la interrupción externa esta desactivada aunque el usuario pulse el botón RB0? ¿O es el funcionamiento natural del microcontrolador y debería hacerlo de otra manera?
« Última modificación: 19 de Junio de 2022, 10:38:13 por Guille1708 »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Int Externa PIC16F84A
« Respuesta #3 en: 16 de Junio de 2022, 17:07:15 »
Hola, corrigeme si hay alguna de estas presunciones mias equivocada.
  • Programas en assembler
  • Leiste bien cuales interrupciones debes evitar y apagaste todos los bits, es decir el general de interrupciones.

Si eso es correcto, deberías conectarte con un debugger en linea, que permite ver en el momento que ocurre la interrupción, cual es la causa que la determina.
Podria ser un timer programado para ejecutar el programa cíclicamente (muy usado para hacer una actualización programada).

u otra interrupción.
Busca el bit de interrupción global y desactiva todo.
No debería aparecer una nueva interrupción.




Es correcto, programo en assembler en el pic16f84a, en el programa mplab.

Mas concretamente que a lo mejor no me he explicado bien, es que cuando el usuario pulsa RB0, al tenerlas desactivadas no se genera, pero si que se actualiza su flag (INTF), de manera que al entrar a la RSI, yo compruebo si ha entrado ahi por INTE mediante el flag INTF, pero cuando entre en el caso que es por overflow, lo contara como una interrupcion externa:


Este es el trozo de RSI que lo compruebo:

BTFSC   INTCON,INTF      ;Comprueba si la interrupcion es por pin RB0, si es 0 saltara la siguiente instruccion
goto    ISR          ;en caso de que sea por RB0

Y cuando se haya pulsado va a la ISR:

                btfss    INTCON,INTF            ;Consultamos si es por RB0, si es asi salta el retfie
           retfie                                        ;si INTF es 1 saltara esta instruccion
      BCF INTCON,INTF          ;Limpiamos flag para que no pueda haber int por RB0
      BCF INTE,INTE            ;Desactivamos interrupcion externa
      INCF Contador,F          ;cada vez que sea int por RB0 aumentamos el contador en 1


¿Sabes de alguna manera en que no se actualice el flag INTF si la interrupción externa esta desactivada aunque el usuario pulse el botón RB0? ¿O es el funcionamiento natural del microcontrolador y debería hacerlo de otra manera?

Me parece que es una característica de estos PICs que poseen un único vector de interrupción.

Tendrías que hacer un condicional que verifique tanto si esa interrupción está activa y si su bandera también está en 1 lógico para realizar un proceso.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32