Autor Tema: Necesito ayuda con una interrupcion  (Leído 1991 veces)

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

Desconectado Battic

  • PIC10
  • *
  • Mensajes: 6
Necesito ayuda con una interrupcion
« en: 03 de Mayo de 2009, 14:21:56 »
Hola a todos, estoy utilizando un PIC18f4680, lo que pasa es que tengo un problema con una interrupcion. No se muy bien que es lo que le pasa pero se traba al entrar a la rutina de interrupcion. Ya no regresa al codigo ni nada.
Este es el codigo:

Código: ASM
  1. LIST P=18F4680, F=INHX32   ;directive to define processor
  2. #include <P18F4680.INC>   ;processor specific variable definitions
  3.  
  4. org 0x800 ;reset vector
  5. goto Main
  6.  
  7. org 0x808
  8. goto ISR
  9.  
  10. Main:
  11.  
  12. bsf      RCON,7         ;Enable priority interrupts
  13. bcf      INTCON,RBIF      ;RBIF limpiar bandera
  14. bsf      INTCON,RBIE      ;RBIE enables PORTB interrupt
  15. bsf      INTCON,7      ;Activador General de Interrupciones
  16.  
  17. inicio
  18. bsf      PORTA,0
  19. btfsc    PORTB,3
  20. goto     inicio
  21. setf      PORTA
  22. goto     supci
  23.  
  24. supci
  25. movf    0x40,W              ;0x40=1
  26. decfsz   0x50,F
  27. goto     cicloA
  28. bcf      INTCON,0      ;apago bandera de interrupcion
  29. goto      fin
  30.  
  31. cicloA
  32. btg      PORTA,0
  33. movlw    0x0B
  34. movwf    TMR0H
  35. movlw    0xDC
  36. movwf    TMR0L
  37. cicloB
  38. btfss    INTCON,2
  39. goto     cicloB  
  40. bcf       INTCON,2
  41. goto     supci
  42.  
  43. ISR
  44. btfsc           INTCON,0
  45. retfie
  46. bcf      PORTA, 1
  47. clrf        WREG
  48. movf    0x40,W       ;W=1
  49. addwf   0x43,F      ;0x43=1+0x43
  50. movf    0x43,W      ;W=valor en 0x43
  51. cpfseq   0x49              ;lo comparas con un 2, si no, se regresa a cicloPrin
  52. retfie
  53. movlw   0x01       ;W=1
  54. addwf   0x45,F      ;0x45=1+0x45
  55. movf     0x41,W
  56. addwf   0x49,F
  57. retfie  
  58.  
  59. END

Yo se que le faltan muchas cosas, pero solo puse lo de la interrupcion aqui.
Todo lo que hace el codigo es que esta esperando a que presione un boton, ya que esta presionado se va al timer de 1 segundo y lo cuenta cuantas veces le pongo que cuente en el registro 0x50.
Pero a la vez quiero que la interrupcion sirva para contar las veces que uno de los switches <RB7:RB4> es oprimido.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Necesito ayuda con una interrupcion
« Respuesta #1 en: 03 de Mayo de 2009, 15:47:12 »
No debes testear si esta en “1” la bandera de interrupción?
Seria:
Código: ASM
  1. btfss INTCON,0
  2. retfie
  3. .
  4. .
  5. .
Al salir de la interrupción debes borrar la bandera por software. Además la interrupción por RB4-RB7 necesita de una lectura/escritura del puerto. Leer el datasheet.
No contesto mensajes privados, las consultas en el foro

Desconectado Battic

  • PIC10
  • *
  • Mensajes: 6
Re: Necesito ayuda con una interrupcion
« Respuesta #2 en: 03 de Mayo de 2009, 16:27:20 »
Ohh, ok, deja pruebo eso, gracias  :)

Desconectado Battic

  • PIC10
  • *
  • Mensajes: 6
Re: Necesito ayuda con una interrupcion
« Respuesta #3 en: 04 de Mayo de 2009, 14:13:04 »
Hola de nuevo, ya corregi lo de la interrupcion, ya funciona muy bien, pero lo malo es que la rutina dura demasiado tiempo activada, ya me asegure de apagar la bandera cada que entre y salga de la interrupcion pero se tarda mucho dentro de la rutina. Aqui posteo el pedazo de codigo de la rutina para ver si me pueden ayudar.

Código: ASM
  1. ISR
  2. btfss   INTCON,0
  3. goto    finalito
  4.  
  5. clrf    WREG
  6. movf    0x40,W          ;W=1
  7. addwf   0x43,F          ;0x43=1+0x43
  8. movf    0x43,W          ;W=valor en 0x43
  9. cpfseq  0x49            ;lo comparas con un 2, si es igual, se guarda en 0x110, si no, se regresa a cicloPrin
  10. goto    dns
  11. goto    nds
  12.  
  13. dns
  14. bcf             INTCON,0        ;apago bandera de interrupcion
  15. retfie
  16.  
  17. nds
  18. movlw   0x01            ;W=1
  19. addwf   0x45,F          ;0x45=1+0x45
  20. movf    0x41,W
  21. addwf   0x49,F
  22. bcf             INTCON,0        ;apago bandera de interrupcion
  23. retfie
  24.  
  25. finalito
  26. retfie

Segun yo, lo que hace es que cada que este prendido uno de los pines, cuente uno al registro 0x43, si este es un multiplo de dos, entonces aumenta el 0x45. (contador de carros)

Desconectado Battic

  • PIC10
  • *
  • Mensajes: 6
Re: Necesito ayuda con una interrupcion
« Respuesta #4 en: 04 de Mayo de 2009, 22:37:02 »
Ya lo corregi, jeje, solo le agregue un delay de 250mseg para que al presionar el boton no se contaran mas interrupciones.
Gracias por la ayuda  :mrgreen:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Necesito ayuda con una interrupcion
« Respuesta #5 en: 05 de Mayo de 2009, 02:29:46 »
Me alegro que hayas solucionado tus problemas, Cualquier cosa ya sabes donde encontrarnos....  :mrgreen:
No contesto mensajes privados, las consultas en el foro


 

anything