Autor Tema: Manejo de las interrupciones del PIC  (Leído 3707 veces)

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

Desconectado UserVic

  • PIC10
  • *
  • Mensajes: 4
Manejo de las interrupciones del PIC
« en: 03 de Noviembre de 2016, 04:02:56 »
Hola amigos del foro Todo Pic, la verdad soy completamente nuevo en el foro así que solo espero aclarar algunas dudas:

  • Al realizar una interrupción con un PIC16F628A, se que hay disponibles varias opciones para realizar dicha interrupción, pero quisiera saber como poder usar mas de una interrupción en el mismo código. He buscado en libros y en distintos foros, pero solo hablan de identificar la bandera (flag) de la respectiva interrupción, pero no tengo idea como hacer eso, intenté varias veces pero realmente no me funciona, me ayudaría mucho un ejemplo aplicado de varias interrupciones aplicadas en un mismo código.
  • Y la siguiente es mi duda con respecto a un código mas simple, en el siguiente código solo uso la interrupción por RB0 (INTE), y al activar la interrupción dos LEDs se prenden, hasta ahi todo funciona bien, sin embargo, al querer volver a desactivar la interrupción los LEDs se mantienen prendidos. Mi duda es que esta fallando en el código que no permite salir de la interrupción o, en su caso, desactivar los LEDs para que la interrupción pueda funcionar. Adjunto el código abajo, y la imagen de la simulación en Proteus (como va conectado todo). PD: Se que también hay que respaldar W y STATUS, pero ya no incluí esa parte en el código.
Código: [Seleccionar]
LIST P=16F628A
INCLUDE P16F628A.inc

__CONFIG 0x2150

W_TEMP EQU 0x20
ST_TEMP EQU 0x21

ORG 0x00
GOTO CONF_BITS

ORG 0x04
GOTO INTERRUPT
RETFIE

;Configuration Bits
CONF_BITS
MOVLW .7
MOVWF CMCON
BSF     STATUS,RP0
CLRF TRISA
MOVLW B'11111111'
MOVWF TRISB
MOVLW B'01000111'
MOVWF OPTION_REG
BCF     STATUS,RP0
BSF INTCON,7
BCF INTCON,6
BCF INTCON,5
BSF INTCON,4
BCF INTCON,3
BCF INTCON,2
BCF INTCON,1
BCF INTCON,0

;Interrupt Start
INTERRUPT
BTFSC INTCON,INTF
GOTO LED_1
GOTO END_INT
LED_1
MOVLW B'00000011'
MOVWF PORTA
GOTO END_INT
END_INT
BSF INTCON,GIE
BCF INTCON,INTF
END


Toda ayuda será bien recibida. Un saludo.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Manejo de las interrupciones del PIC
« Respuesta #1 en: 03 de Noviembre de 2016, 04:42:12 »
Hola UserVic, bienvenido al foro. Bien respecto a tu segunda pregunta te comento. Si esta ejecutando la interrupcion, pero resulta que tu nunca los apagas, es decir analiza tu codigo. Cuando terminas de configurar el PIC inmediatamente te vas a interrupcion, nunca creas un loop donde se quede tu programa, donde deberias tambien apagar los leds.

Y respecto a la primera pregunta, exactamente con las banderas, ya lo tienes:

Código: ASM
  1. Interrupt
  2.         BTFSC INTCON,INTF
  3.         GOTO  INTERRUPCION_RB0
  4.         BTFSC INTCON,T0IF
  5.        GOTO    INTERRUPCION_TIMER
  6.        RETFIE

Bien, en este pequeño ejemplo tienes activas anteriormente dos interrupciones, y el el vector 0x04 tu preguntas por los dos para saber cual fue la interrupcion que entro.

Espero haber sido un poco claro.

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Manejo de las interrupciones del PIC
« Respuesta #2 en: 03 de Noviembre de 2016, 10:23:20 »
Para agregar a lo que dijo Pinolillo16.

Tu codigo quedaria asi:

Código: ASM
  1. LIST            P=16F628A
  2.         INCLUDE         P16F628A.inc
  3.        
  4. __CONFIG        0x2150
  5.  
  6.         CBLOCK 0x20
  7.         W_TEMP
  8.         STATUS_TEMP
  9.         d1
  10.         d2
  11.         d3
  12.         ENDC
  13.  
  14.         ; Vector de reset
  15.         ORG             0x00
  16.         GOTO    CONF_BITS
  17.  
  18.         ;Vector de interrupcion
  19.         ORG             0x04
  20.         GOTO    INTERRUPT
  21.  
  22.  
  23. ;Configuration Bits
  24. CONF_BITS
  25.         MOVLW   .7
  26.         MOVWF   CMCON                   ; Todos los pines digitales
  27.         BSF     STATUS,RP0
  28.         CLRF    TRISA                   ; Puerto A como salida
  29.         MOVLW   B'11111111'
  30.         MOVWF   TRISB                   ; Puerto B como entradas
  31.         MOVLW   B'01000111'             ; ...
  32.         MOVWF   OPTION_REG
  33.         BCF     STATUS,RP0
  34.         MOVLW   B'10010000'             ; Activo interrupciones
  35.         MOVWF   INTCON
  36.  
  37. MAIN
  38.         ; Aca el programa principal, pongo un ejemplo
  39.  
  40.         BSF             PORTA, 0                ; Activo RA0
  41.         CALL    DELAY500ms              ; Llamo a un delay, 0.5s
  42.         BCF             PORTA, 0                ; Apago RA0
  43.         CALL    DELAY500ms              ; Espero 0.5s
  44.         GOTO    MAIN
  45.  
  46.  
  47. ;Interrupt Start
  48. INTERRUPT
  49.  
  50.         ;Aca guardo W y STATUS ( sacado del datasheet )
  51.         MOVWF   W_TEMP
  52.         SWAPF   STATUS, W
  53.         BCF             STATUS, RP0
  54.         MOVWF   STATUS_TEMP
  55.  
  56.         ;Codigo de interrupcion
  57.         BTFSC   INTCON,INTF
  58.         CALL    LED_1
  59.        
  60.         ;Aca codigo para restaurar W y STATUS ( sacado del datasheet )
  61.         SWAPF   STATUS_TEMP, W
  62.         MOVWF   STATUS
  63.         SWAPF   W_TEMP, F
  64.         SWAPF   W_TEMP, W
  65.  
  66. LED_1
  67.         MOVLW   B'00000010'
  68.         XORWF   PORTA, F                ; Invierto RA1 solamente
  69.         RETURN
  70.  
  71. ; Delay de 0.5s para 4Mhz
  72.  
  73. DELAY500ms     
  74.                         ;499994 cycles
  75.         movlw   0x03
  76.         movwf   d1
  77.         movlw   0x18
  78.         movwf   d2
  79.         movlw   0x02
  80.         movwf   d3
  81. DELAY500ms_0
  82.         decfsz  d1, f
  83.         goto    $+2
  84.         decfsz  d2, f
  85.         goto    $+2
  86.         decfsz  d3, f
  87.         goto    DELAY500ms_0
  88.  
  89.                         ;2 cycles
  90.         goto    $+1
  91.  
  92.                         ;4 cycles (including call)
  93.         return
  94.  
  95. END

Desconectado UserVic

  • PIC10
  • *
  • Mensajes: 4
Re:Manejo de las interrupciones del PIC
« Respuesta #3 en: 03 de Noviembre de 2016, 15:23:37 »
Cuando terminas de configurar el PIC inmediatamente te vas a interrupcion, nunca creas un loop donde se quede tu programa, donde deberias tambien apagar los leds.
Entiendo Pinolillo16, entonces sería agregar algo así como otra rutina, o sería adicionar otro BTFSC, eso es lo que entiendo, ¿o lo entendí mal?

Igual también gracias a ti y a KILLERJC por la explicacion de las flags, esa parte si la entendí.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Manejo de las interrupciones del PIC
« Respuesta #4 en: 03 de Noviembre de 2016, 22:44:54 »
Una cosa mas... no hagas el circuito que tenes en una placa o protoboard, a los leds les falta las resistencias. Sino podria llegar a quemar el puerto del PIC