Autor Tema: Consultilla interrupciones  (Leído 4314 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Consultilla interrupciones
« en: 24 de Marzo de 2012, 16:52:10 »
Hola gente!
Estaba intentando controlar un motor para aprender, pero no me funciona. Las interrupciones las activo de esta forma:

Código: [Seleccionar]
BSF INTCON,INTE ;ACTIVAR RB0 COMO INTERRUPCIÓN
BSF INTCON,RBIF ;ACTIVAR RB4-7 COMO INTERRUPCIONES
BSF INTCON,GIE

El asm completo está acá: http://www.todopic.com.ar/foros/index.php?topic=37704.msg314717#msg314717 (no lo quise subir otra vez para no ocupar espacio al vicio)

La simulación en proteus no funcionaba, y pensé que era porque olvidé ponerle los pulsadores a Vdd, pero lo hice y naranja.

Luego quise simular en mplabx y veo que las interrupciones no saltan ni por un pulso ni por un cambio permanente a estado alto, usando stimulus.

Qué podría estar mal? Un abrazo y gracias!!

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Consultilla interrupciones
« Respuesta #1 en: 24 de Marzo de 2012, 17:18:48 »
es INTCON,RBIE no RBIF

Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #2 en: 25 de Marzo de 2012, 02:16:51 »
Uhhhhh perdon y gracias!
De todas maneras no deberia funcionar con rb0? Lo estoy depurando en mplabx y el cambio de estado lo hacía justo en rb0 y corrigiendo lo indicado no veo que salte la interrupción.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Consultilla interrupciones
« Respuesta #3 en: 25 de Marzo de 2012, 06:33:15 »
Se te olvido habilitar INTCON,GIE asi ya te salta la interrupcion por RB0 en flanco ascendente.

Tambien cambie el encabezado, por esto.

list p= 16F877A
INCLUDE   "P16f877a.inc"      ;LIBRERIA PIC16F877A.

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

Como estaba tiraba errores, por lo menos en mi MPLAB que es v8.70

Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #4 en: 25 de Marzo de 2012, 17:08:29 »
 :oops:  Sí le había habilitado INTCON,GIE, pero justo me di cuenta al subir el asm y no lo aclaré, y luego hice la corrección de MerLiNz en RBIE por RBIF.... con 2 esos errores ya repruebo cualquier examen  :?

A mi me compila sin errores en mplabx 1.10. De hecho al depurarlo puedo ver los registros bien cargados una vez corriendo el programa, sólo que no saltan las interrupciones... y lo quería simular de esta forma porque en proteus es un parto porque se me cierra de la nada y aparte tampoco saltan las interrupciones.  :(

Acá lo pego por si acaso,
Código: [Seleccionar]
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

list p= 16F877A
include </opt/microchip/mplabx/mpasmx/P16F877A.INC>


;**********************************************************************
;***** VARIABLE DEFINITIONS
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

N EQU 0X00
PDel0 EQU 0X20
PDel1 EQU 0x21
PDel2 EQU 0x22
NUMERO EQU 0X23

;**********************************************************************
ORG     0x000             ; processor reset vector

nop   ; nop required for icd
  goto    start             ; go to beginning of program

ORG     0x004             ; interrupt vector location

movwf   w_temp            ; save off current W register contents
movf STATUS,w          ; move status register into W register
movwf status_temp       ; save off contents of STATUS register
movf PCLATH,w   ; move pclath register into w register
movwf pclath_temp   ; save off contents of PCLATH register

pagesel man_inter
call man_inter

movf pclath_temp,w   ; retrieve copy of PCLATH register
movwf PCLATH   ; restore pre-isr PCLATH register contents
movf    status_temp,w     ; retrieve copy of STATUS register
movwf STATUS            ; restore pre-isr STATUS register contents
swapf   w_temp,f
swapf   w_temp,w          ; restore pre-isr W register contents
retfie                    ; return from interrupt



start:
BANKSEL  ADCON1 ;OPERACIONES EN BANCO 1
MOVLW    0x06
MOVWF    ADCON1 ;APAGAR A2D
MOVLW    0 ;set PORTC todas salidas
MOVWF    TRISC


MOVLW 0xF1 ;RB0 INT PARA PULSADOR, RB1-4 ENTRADAS PARA RECIBIR DE PINGUINO
MOVWF TRISB

BANKSEL  PORTC ;OPERACIONES EN BANCO 0
CLRF NUMERO
MOVLW    141
MOVWF    PR2

MOVF     CCP1CON,W ;modo PWM
ANDLW    0xF0
IORLW    0x0C
MOVWF    CCP1CON

MOVF     T2CON,W ;prescaler = 16
ANDLW    0xF8
IORLW    0x02
MOVWF    T2CON

CLRF CCPR1L ;PWM en blanco

BCF PORTC,0 ;INICIALIZAR SENTIDO DE GIRO NULO (MOTOR APAGAU)
BCF PORTC,3

BSF INTCON,INTE ;ACTIVAR RB0 COMO INTERRUPCIÓN
BSF INTCON,RBIE ;ACTIVAR RB4-7 COMO INTERRUPCIONES
BSF INTCON,GIE

BSF      T2CON, TMR2ON ;iniciar el timer y el pwm

;-----------
 principal
;-----------
nop
goto principal


;*****************************************************************************
; AVANCE
;*****************************************************************************
AVANCE:
BTFSS PORTC,0
CALL DEMORA5SEG
BANKSEL    CCPR1L
MOVLW    H'F3'
MOVWF    CCPR1L      ;CARGA EL C.T
BCF PORTC,3
BSF PORTC,0
RETURN


;********************************************************************************
; RETROCESO AL 10%
;********************************************************************************
RETROCESO:
CALL DEMORA5SEG
BANKSEL    CCPR1L
MOVLW    H'19'
MOVWF    CCPR1L
BCF PORTC,0
BSF PORTC,3
RETURN


;********************************************************************************
; MEDIA MAQUINA
;********************************************************************************
MEDIAMAQUINA:
BTFSS PORTC,0
CALL DEMORA5SEG
BANKSEL    CCPR1L
MOVLW    H'80'
MOVWF    CCPR1L
BCF PORTC,3
BSF PORTC,0
RETURN


;******************************************************************************
;LENTO
;******************************************************************************
LENTO:
BTFSS PORTC,0
CALL DEMORA5SEG
BANKSEL    CCPR1L
MOVLW    H'19'
MOVWF    CCPR1L
BCF PORTC,3
BSF PORTC,0
RETURN


;******************************************************************************
;STOP
;******************************************************************************
STOP:
BCF PORTC,3
BCF PORTC,0
CLRF CCPR1L
;TODO: UN BREVE BACK para frenar en lugar de poner a cero el duty, o pr2?
RETURN


man_inter:
pagesel DEMORA
call DEMORA     ;20ms
BTFSC INTCON,INTF   ;Se supone que el delay permitió que rb0 se estabilice
GOTO INCRPULSA
BTFSC INTCON,INTF   ;Se supone que el delay permitió que rb4 A 7 se estabiliceN
GOTO DECODENT

INCRPULSA   INCF NUMERO,W   ;Sumo 1, y si llegué a 5 vuelvo a cero.
    BTFSC W,2
    BTFSC W,0
    CLRW
    GOTO CAMBIAMODO

DECODENT    MOVF  PORTB,W   ;Se toma el modo del msb=1 de RB4-RB7
    BTFSC W,7
    GOTO DECOAVANCE
    BTFSC W,6
    GOTO DECOMEDIAMAQ
    BTFSC W,5
    GOTO DECOLENTO
    BTFSC W,4
    GOTO DECORETROCESO
    GOTO DECOSTOP

DECOAVANCE MOVLW 4
GOTO CAMBIAMODO
DECOMEDIAMAQ MOVLW 3
GOTO CAMBIAMODO
DECOLENTO MOVLW 2
GOTO CAMBIAMODO
DECORETROCESO MOVLW 1
GOTO CAMBIAMODO
DECOSTOP CLRW
GOTO CAMBIAMODO


CAMBIAMODO MOVWF NUMERO     ;W tiene los 3 lsb marcando 1 de los 5 estados, guardar en NUMERO

XORLW 4
BTFSC STATUS,Z
 CALL AVANCE

XORLW 3
BTFSC STATUS,Z
 CALL MEDIAMAQUINA

XORLW 2
BTFSC STATUS,Z
 CALL LENTO

XORLW 1
BTFSC STATUS,Z
 CALL RETROCESO
CALL STOP


BCF INTCON,INTF
BCF INTCON,RBIF
RETURN



;Demora 20 ms
DEMORA  movlw     .8        ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop120  movlw     .249      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop220  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop220    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop120    ; 2 no, loop
PDelL120  goto PDelL220         ; 2 ciclos delay
PDelL220  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------


;-------------------------------------------------------------
DEMORA5SEG  movlw     .22       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .134      ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .211      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------

END                       ; directive 'end of program'

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Consultilla interrupciones
« Respuesta #5 en: 26 de Marzo de 2012, 05:25:08 »
Acabo de probar tu programa, solo le cambie el encabezado para que me compile, y salta la interrupcion por RB0 en flanco ascendente sin ningun problema, cuando con el stimulus pongo RB0 a 1 salta aqui:

ORG     0x004             ; interrupt vector location

    movwf   w_temp            ; save off current W register contents


Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #6 en: 27 de Marzo de 2012, 12:12:31 »
Ok yo lo hice también en mplab y la interrupción saltó bien. Pero en mplabx no. Mil gracias, un abrazo!

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Consultilla interrupciones
« Respuesta #7 en: 27 de Marzo de 2012, 13:11:24 »
Pues entonces sera un fallo del MPLABX. ¿Puede ser que como el 16f877A ya esta desclasificado no le prestaron mucha atencion?

Compañeros de aqui del foro hablan bastante mal de el, no de fallos, pero si de que es lento, consume mucha RAM etc, hace algo mas de un mes estuve estuve en un seminario de microchip y lo presentaron, decian que era buenisimo, claro, todo lo que explicaron fue para C para assembler no.

Por lo que lei en el enlace que pones en el primer post quieres aprender a manejar motores, este programa que hiciste para aprender interrupciones puede valer, para controlar motores, a mi parecer, no vas bien. Tienes 5 pulsadores que quieres controlar con interrupciones, ¿verdad? tu programa cuando entra en una interrupcion por RB0 esta ahi un monton de tiempo, por lo que ya no atendera a ninguna otra interrupcion, yo tendria en cuenta estas cosas:

Primero: dentro de la interrupcion tiene que estar el minimo tiempo posible, tu programa esta siempre en ella, salvo casos especiales donde si puede valer.

Segundo: Para controlar pulsadores no son necesarias casi nunca interrupciones, puesto que una persona pulsando es incapaz de pulsar y soltar en menos de 100ms, y tiene que ser alguien muy rapido, por lo tanto en ese tiempo puedes chequear 50,000 veces el pulsador, si son 5 10.000veces cada uno  :lol: a lo mejor exagero un poco. Si le quisieras poner un encoder si seria mejor con interrupcion, porque te dara señal unos us solo.

Tercero: Lo primero que hay que usar son los TIMERs, con o sin interrupcion segun convenga, porque le quitaras casi todo el trabajo al procesador y podras chequear pulsadores y atender PWMs sin mucho problema. Con dos TIMERs e incluso con 1 podras sacarle al 16f877 32 PWMs, si todos los motores son del mismo tipo, si son diferentes...hay que echarle imaginacion. :lol:

Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #8 en: 27 de Marzo de 2012, 22:41:04 »
Impecable tapi8, mil gracias!!

La verdad es que es el primer programa que hago en asm, luego de copiar, pegar e intentar entender cosas, y creo que es el momento justo para leer tus recomendaciones, porque ya metido en la onda te puedo entender mejor y aprovechar mucho más los consejos, así que los valoro muchísimo.

Francamente pensaba ver cómo se hace con los pulsadores, interrupciones, timers y mover como para entender cómo se relacionan internamente algunas partes del micro...

Con respecto al mplabx, yo por fin estoy satisfecho, pero tuve que probar varias cosas. La única configuración que me funciona bien, salvo el tema de las interrupciones (que quizá sea mi error) es mplabx 1.10 con sun jdk (el openjdk me trajo muchos inconvenientes y un consumo de 10 veces de ram que con sun jdk). El pk2cmd anda maravillosamente (todo esto en mi openSUSE 12.1).

Un abrazo y a tus órdenes!


Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #9 en: 28 de Marzo de 2012, 03:11:51 »
Acabo de ver en unos foros de microchip, que el TMR2 tiene problemas en mplabx, y que algunos periféricos directamente no están implementados en el simulador... groso!! simplemente puse "mplabx simulation not working" en google, saludos!!

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Consultilla interrupciones
« Respuesta #10 en: 28 de Marzo de 2012, 04:57:44 »
Te voy a recomendar un par de hilos para empezar con assembler, los que le recomiendo a todos:

Todas las instrucciones explicadas:

http://www.todopic.com.ar/foros/index.php?topic=23623.0

Aqui un curso, tienes ejemplos de los tres TIMERs:

http://www.todopic.com.ar/foros/index.php?topic=24720.0

Aqui un ejemplo de manejo de pulsadores, con y sin TIMER:

http://www.todopic.com.ar/foros/index.php?topic=32966.0

El mplabx lo mejoraran con el tiempo, yo de momento ni lo baje, cuando lo mejoren me pondre con el.

Saludos.

Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #11 en: 05 de Abril de 2012, 12:58:00 »
Hola amigo, gracias... no quiero demorarme más en responderte aunque no tengo todavía pulido el programa porque me estoy mudando.

La cosa es que ya había leído esos hilos, pero ahora los entiendo 100 veces mejor. Hace 6 meses leía materiales de todo tipo y no me entraba nada, pero ahora ya se me pone más divertido.

Quería evitar usar el micro como interruptor o como meras puertas lógicas, y entender que una tarea se puede llevar a cabo 50000 veces por segundo excedía cualquier cosa que se me ocurría (no podía encontrar algo donde realmente necesitara un micro), como leer un sensor o un pulsador. Quise pasarme a muestrear una señal vga y me fui para el otro lado... el micro no me daba. Copié y pegué cosas y prendí leds, pero copiar y pegar no me servía para entender mucho.

Luego estudié un generador de vga muy interesante y lo entendí, pero me di con que no tenía qué mostrar (que no fuera precargado) para lo cual necesitaba interactuar con el exterior, y ahí es donde llegué a hacer mi primer programa que casi se puede decir que lo podría realizar con componentes comunes en lugar de un micro pero me servía para relacionar las partes internas y desburrarme sobre todo.

Te mando un abrazo y estamos en contacto!

Desconectado monitor

  • PIC10
  • *
  • Mensajes: 24
Re: Consultilla interrupciones
« Respuesta #12 en: 16 de Abril de 2012, 17:14:30 »
Buenas, acá está el programa que finalmente me funciona ok en mplab y en proteus. En cuanto a lo que quería, es un éxito, ya que pude desburrarme un poquito y entender interrupciones y otras cosas.

El circuito no funciona porque tiene ruido por todos lados... quizá tenga que rediseñar tanto el soft como el circuito, pero ese es otro cantar.

Gracias por ayudarme, ojalá pueda devolver la gentileza alguna vez. Saludos!


Código: ASM
  1. __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
  2.  
  3. list p= 16F877A
  4. include "P16F877A.INC"
  5.  
  6.  
  7. ;**********************************************************************
  8. ;***** VARIABLE DEFINITIONS
  9. w_temp          EQU     0x71            ; variable used for context saving
  10. status_temp     EQU     0x72            ; variable used for context saving
  11. pclath_temp     EQU     0x73            ; variable used for context saving
  12.  
  13. N EQU 0X00
  14. PDel0 EQU 0X20
  15. PDel1 EQU 0x21
  16. PDel2 EQU 0x22
  17. NUMERO EQU 0X23
  18.  
  19. ;**********************************************************************
  20.         ORG     0x000             ; processor reset vector
  21.  
  22.         nop                       ; nop required for icd
  23.         goto    start             ; go to beginning of program
  24.  
  25.         ORG     0x004             ; interrupt vector location
  26.  
  27.         movwf   w_temp            ; save off current W register contents
  28.         movf    STATUS,w          ; move status register into W register
  29.         movwf   status_temp       ; save off contents of STATUS register
  30.         movf    PCLATH,w          ; move pclath register into w register
  31.         movwf   pclath_temp       ; save off contents of PCLATH register
  32.  
  33.         pagesel man_inter
  34.         goto    man_inter
  35.  
  36.         restaurar_estado
  37.         movf    pclath_temp,w     ; retrieve copy of PCLATH register
  38.         movwf   PCLATH            ; restore pre-isr PCLATH register contents
  39.         movf    status_temp,w     ; retrieve copy of STATUS register
  40.         movwf   STATUS            ; restore pre-isr STATUS register contents
  41.         swapf   w_temp,f
  42.         swapf   w_temp,w          ; restore pre-isr W register contents
  43.         retfie                    ; return from interrupt
  44.  
  45.  
  46.  
  47. start:
  48. BANKSEL  ADCON1 ;OPERACIONES EN BANCO 1
  49. MOVLW    0x06
  50. MOVWF    ADCON1 ;APAGAR A2D
  51. MOVLW    0      ;set PORTC todas salidas
  52. MOVWF    TRISC
  53.  
  54. MOVLW   0xF1    ;RB0 INT PARA PULSADOR, RB1-4 ENTRADAS PARA RECIBIR DE PINGUINO
  55. MOVWF   TRISB
  56.  
  57. BANKSEL  PORTC  ;OPERACIONES EN BANCO 0
  58. CLRF NUMERO
  59. MOVLW    141
  60. MOVWF    PR2
  61.  
  62. MOVF     CCP1CON,W      ;modo PWM
  63. ANDLW    0xF0
  64. IORLW    0x0C
  65. MOVWF    CCP1CON
  66.  
  67. MOVF     T2CON,W        ;prescaler = 16
  68. ANDLW    0xF8
  69. IORLW    0x02
  70. MOVWF    T2CON
  71.  
  72. CLRF    CCPR1L          ;PWM en blanco
  73.  
  74. BCF PORTC,0             ;INICIALIZAR SENTIDO DE GIRO NULO (MOTOR APAGAU)
  75. BCF PORTC,3
  76.  
  77. BSF INTCON,INTE ;ACTIVAR RB0 COMO INTERRUPCIÓN
  78. BSF INTCON,RBIE ;ACTIVAR RB4-7 COMO INTERRUPCIONES
  79. BSF INTCON,GIE
  80.  
  81. BSF      T2CON, TMR2ON  ;iniciar el timer y el pwm
  82.  
  83. ;-----------
  84.  principal
  85. ;-----------
  86. nop
  87. goto principal
  88.  
  89. AVANCE:
  90. BTFSS PORTC,0
  91. CALL DEMORA5SEG
  92. BANKSEL    CCPR1L
  93. MOVLW    H'F3'
  94. MOVWF    CCPR1L
  95. BCF     PORTC,3
  96. BSF     PORTC,0
  97. goto clrflags
  98.  
  99.  
  100. RETROCESO
  101. CALL    DEMORA5SEG
  102. BANKSEL    CCPR1L
  103. MOVLW    H'19'
  104. MOVWF    CCPR1L
  105. BCF     PORTC,0
  106. BSF     PORTC,3
  107. goto clrflags
  108.  
  109.  
  110. MEDIAMAQUINA
  111. BTFSS PORTC,0
  112. CALL DEMORA5SEG
  113. BANKSEL    CCPR1L
  114. MOVLW    H'80'
  115. MOVWF    CCPR1L
  116. BCF     PORTC,3
  117. BSF     PORTC,0
  118. goto clrflags
  119.  
  120.  
  121. LENTO
  122. BTFSS PORTC,0
  123. CALL DEMORA5SEG
  124. BANKSEL    CCPR1L
  125. MOVLW    H'19'
  126. MOVWF    CCPR1L
  127. BCF     PORTC,3
  128. BSF     PORTC,0
  129. goto clrflags
  130.  
  131.  
  132. STOP
  133. BCF     PORTC,3
  134. BCF     PORTC,0
  135. CLRF CCPR1L
  136. ;TODO: UN BREVE BACK para frenar en lugar de poner a cero el duty, o pr2?
  137. goto clrflags
  138.  
  139.  
  140. man_inter
  141. pagesel DEMORA
  142. call DEMORA         ;20ms
  143. BTFSC INTCON,INTF   ;Se supone que el delay permitió que rb0 se estabilice
  144. GOTO INCRPULSA
  145. BTFSC INTCON,RBIF   ;Se supone que el delay permitió que rb4 A 7 se estabiliceN
  146. GOTO DECODENT
  147.  
  148. INCRPULSA   INCF NUMERO   ;Sumo 1, y si llegué a 5 vuelvo a cero
  149.                 MOVFW NUMERO
  150.                 XORLW 5
  151.                 BTFSC STATUS,Z
  152.             CLRF NUMERO
  153.                 MOVFW NUMERO
  154.             GOTO CAMBIAMODO
  155.  
  156. DECODENT       ;Se toma el modo del msb=1 de RB4-RB7
  157.             BTFSC PORTB,7
  158.             GOTO DECOAVANCE
  159.             BTFSC PORTB,6
  160.             GOTO DECOMEDIAMAQ
  161.             BTFSC PORTB,5
  162.             GOTO DECOLENTO
  163.             BTFSC PORTB,4
  164.             GOTO DECORETROCESO
  165.             GOTO DECOSTOP
  166. DECOAVANCE      MOVLW 1
  167.                 GOTO PRECARGAMODO
  168. DECOMEDIAMAQ    MOVLW 2
  169.                 GOTO PRECARGAMODO
  170. DECOLENTO       MOVLW 3
  171.                 GOTO PRECARGAMODO
  172. DECORETROCESO   MOVLW 4
  173.                 GOTO PRECARGAMODO
  174. DECOSTOP        CLRW
  175.                 GOTO PRECARGAMODO
  176.  
  177. PRECARGAMODO MOVWF      NUMERO
  178.  
  179. CAMBIAMODO      MOVFW   NUMERO     ;W tiene los 3 lsb marcando 1 de los 5 estados, guardar en NUMERO
  180.  
  181. XORLW   1
  182. BTFSC STATUS,Z
  183.  goto AVANCE
  184.  
  185. MOVFW NUMERO
  186. XORLW   2
  187. BTFSC STATUS,Z
  188.  goto MEDIAMAQUINA
  189.  
  190. MOVFW NUMERO
  191. XORLW   3
  192. BTFSC STATUS,Z
  193.  goto LENTO
  194.  
  195. MOVFW NUMERO
  196. XORLW   4
  197. BTFSC STATUS,Z
  198.  goto RETROCESO
  199. goto STOP
  200.  
  201. clrflags
  202. BCF INTCON,INTF
  203. BCF INTCON,RBIF
  204. goto restaurar_estado
  205.  
  206.  
  207.  
  208. ;Demora 20 ms
  209. DEMORA  movlw     .8        ; 1 set numero de repeticion  (B)
  210.         movwf     PDel0     ; 1 |
  211. PLoop120  movlw     .249      ; 1 set numero de repeticion  (A)
  212.         movwf     PDel1     ; 1 |
  213. PLoop220  clrwdt              ; 1 clear watchdog
  214.         clrwdt              ; 1 ciclo delay
  215.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  216.         goto      PLoop220    ; 2 no, loop
  217.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  218.         goto      PLoop120    ; 2 no, loop
  219. PDelL120  goto PDelL220         ; 2 ciclos delay
  220. PDelL220  clrwdt              ; 1 ciclo delay
  221.         return              ; 2+2 Fin.
  222. ;-------------------------------------------------------------
  223.  
  224.  
  225. ;-------------------------------------------------------------
  226. DEMORA5SEG  movlw     .22       ; 1 set numero de repeticion  (C)
  227.         movwf     PDel0     ; 1 |
  228. PLoop0  movlw     .134      ; 1 set numero de repeticion  (B)
  229.         movwf     PDel1     ; 1 |
  230. PLoop1  movlw     .211      ; 1 set numero de repeticion  (A)
  231.         movwf     PDel2     ; 1 |
  232. PLoop2  clrwdt              ; 1 clear watchdog
  233.         decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
  234.         goto      PLoop2    ; 2 no, loop
  235.         decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
  236.         goto      PLoop1    ; 2 no, loop
  237.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
  238.         goto      PLoop0    ; 2 no, loop
  239. PDelL1  goto PDelL2         ; 2 ciclos delay
  240. PDelL2  clrwdt              ; 1 ciclo delay
  241.         return              ; 2+2 Fin.
  242. ;-------------------------------------------------------------
  243.  
  244.  
  245. END

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Consultilla interrupciones
« Respuesta #13 en: 18 de Abril de 2012, 06:48:04 »
Citar
En cuanto a lo que quería, es un éxito, ya que pude desburrarme un poquito y entender interrupciones y otras cosas.

No te has desburrado tanto como crees, esa interrupcion esta mal, probablemente no te funciona bien por eso.

Código: [Seleccionar]
ORG     0x004             ; interrupt vector location
 
  movwf   w_temp            ; save off current W register contents
        movf    STATUS,w          ; move status register into W register
        movwf   status_temp       ; save off contents of STATUS register
        movf    PCLATH,w          ; move pclath register into w register
        movwf   pclath_temp       ; save off contents of PCLATH register
 
       pagesel man_inter
       goto    man_inter
 
      restaurar_estado
        movf    pclath_temp,w     ; retrieve copy of PCLATH register
    movwf   PCLATH            ; restore pre-isr PCLATH register contents
    movf    status_temp,w     ; retrieve copy of STATUS register
    movwf   STATUS            ; restore pre-isr STATUS register contents
    swapf   w_temp,f
        swapf   w_temp,w          ; restore pre-isr W register contents
 retfie         

Guardas mal los registros, te sales en medio de la interrupcion sin restablecer los registros, no ejecutas el RETFIE por lo cual se te quedan desactivadas las interrupciones y ademas como no sacas la direccion del STACK se van acumulando hasta que se desborda y ya te funciona mal todo.

Hace unas semanas me paso lo mismo con otro compañero, hacia lo mismo que tu, mirate este hilo ya que lo que te voy a explicar es lo mismo que le explique a el, si despues tienes dudas, pregunta:


http://www.todopic.com.ar/foros/index.php?topic=37451.0



 

anything