TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: UserVic en 03 de Noviembre de 2016, 04:02:56

Título: Manejo de las interrupciones del PIC
Publicado por: UserVic 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:

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
(https://s21.postimg.org/b68l7idz7/Captura.png) (https://postimg.org/image/b68l7idz7/)

Toda ayuda será bien recibida. Un saludo.
Título: Re:Manejo de las interrupciones del PIC
Publicado por: Pinolillo16 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
Título: Re:Manejo de las interrupciones del PIC
Publicado por: KILLERJC 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
Título: Re:Manejo de las interrupciones del PIC
Publicado por: UserVic 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í.
Título: Re:Manejo de las interrupciones del PIC
Publicado por: KILLERJC 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