Autor Tema: Interrupcion RBI junto control LCD en PIC16F84A (ASM)  (Leído 128 veces)

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

Desconectado jurgen

  • PIC10
  • *
  • Mensajes: 5
Interrupcion RBI junto control LCD en PIC16F84A (ASM)
« en: 22 de Julio de 2018, 13:56:03 »
Buenas tardes a todos;
Antes de nada pedir perdón si este tema ya se resolvió, pero yo no lo ví.

A la hora de simular en PROTEUS y en el propio MPLAB X IDE 4.10 un ejercicio de control de interrupciones junto al gobierno de una pantalla LCD mediante 4 bits, teniendo dos pulsadores conectados en RB0 y RB4 y utilizando las siguientes librerias:
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>


Me salta una interrupción de tipo RBI cuando inicializo el LCD en la línea 20. El ejercicio es el siguiente:
Código: ASM
  1. ; ZONA DE DATOS **********************************************************************
  2.  
  3.         __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
  4.         LIST       P=16F84A
  5.         INCLUDE <P16F84A.INC>
  6.        
  7.         CBLOCK  0x0C
  8.         ENDC
  9.        
  10. #DEFINE EntradaRB0  PORTB,0
  11. #DEFINE EntradaRB4  PORTB,4
  12.        
  13. ; ZONA DE CÓDIGOS ********************************************************************
  14.         ORG     0
  15.         goto    Inicio
  16.         ORG     4
  17.         goto    Interrupcion
  18.        
  19. Inicio
  20.         call    LCD_Inicializa
  21.         bsf     STATUS,RP0              ;Acceso al Banco 1 <---- [b]Ya en esta línea tengo el BIT a 1 del RBIF del registro INTCON;[/b]
  22.         bsf     EntradaRB0              ;RB0 como Entrada
  23.         bsf     EntradaRB4              ;RB4 como Entrada
  24.         bcf     OPTION_REG,NOT_RBPU     ;Activa las resistencias PULL-UP del Puerto B
  25.         bcf     OPTION_REG,INTEDG       ;Interrp INT se activa por flanco de bajada
  26.         bcf     STATUS,RP0              ;Acceso al Banco 0
  27.         movlw   b'11111000'             ;Habilita todas las interrupciones
  28.         movwf   INTCON
  29.  
  30. Principal  
  31.         sleep                           ;Modo bajo consumo
  32.         goto    Principal
  33.  
  34. ;Subrutina Interrupcion
  35.         CBLOCK 
  36.         var_W
  37.         var_STATUS
  38.         var_RegistroA
  39.         var_RegistroB
  40.         ENDC
  41.        
  42. Interrupcion
  43.         movwf   var_W                   ;Guarda W en la variable
  44.         swapf   STATUS,W                ;No "movf STATUS,W" corrompe Bit Z
  45.         movwf   var_STATUS              ;Solución Guardar STATUS con SWAPF
  46.         movf    PORTA,W                 ;Guarda el contenido del registro A
  47.         movwf   var_RegistroA
  48.         movf    PORTB,W                 ;Guarda el contenido del registro B
  49.         movwf   var_RegistroB
  50.         bcf     STATUS,RP0              ;Asegurarse que trabaja en el Banco 0
  51.  
  52. CausaInterrupcion
  53.         call    Retardo_20ms            ;Espera se estabilicen niveles.
  54.         btfsc   INTCON,INTF             ;¿Interupcion por activación RB0/INT?
  55.         call    Interrupcion_INT        ;Ejecuta Interrupcion INT
  56.         btfsc   INTCON,RBIF             ;¿Interupcion por cambio PUERTO B?
  57.         call    Interrupcion_RBI        ;Ejecuta Interrupcion RBI
  58.         btfsc   EECON1,EEIF             ;¿Interupcion por escritura EEPROM?
  59.         call    Interrupcion_EEI        ;Ejecuta Interrupcion EEI
  60.         btfsc   INTCON,T0IF             ;¿Interupcion por desbordamiento TMR0?
  61.         call    Interrupcion_T0I        ;Ejecuta Interrupcion T0I
  62.  
  63. RestaurarValoresInterrupcion
  64.         movf    var_RegistroB,W         ;Restaura el contenido del Registro B
  65.         movwf   PORTB
  66.         movf    var_RegistroA,W         ;Restaura el contenido del Registro A
  67.         movwf   PORTA
  68.         swapf   var_STATUS,W            ;Restaura el contenido del Registro Status
  69.         movwf   STATUS
  70.         swapf   var_W,F                 ;Restaura el contenido del Registro W
  71.         swapf   var_W,W
  72.         bcf     INTCON,INTF             ;Limpia el flag de reconocimiento INTF
  73.         bcf     INTCON,RBIF             ;Limpia el flag de reconocimiento RBIF
  74.         bcf     INTCON,EEIF             ;Limpia el flag de reconocimiento EEIF
  75.         bcf     INTCON,T0IF             ;Limpia el flag de reconocimiento T0IF
  76.         retfie                          ;Retorna y habilita la interrupción   
  77.        
  78. ;Subsutina Interrupcion_INT
  79. Interrupcion_INT
  80.         call    LCD_Borra
  81.         movlw   MensajeINT              ; Visualiza el mensaje para INT.
  82.         call    LCD_Mensaje
  83.         return
  84.        
  85. ;Subsutina Interrupcion_RBI
  86. Interrupcion_RBI
  87.         call    LCD_Borra
  88.         movlw   MensajeRBI              ; Visualiza el mensaje para RBI.
  89.         call    LCD_Mensaje
  90.         return
  91.  
  92. ;Subsutina Interrupcion_EEI
  93. Interrupcion_EEI
  94.         call    LCD_Borra
  95.         movlw   MensajeEEI              ; Visualiza el mensaje para EEI.
  96.         call    LCD_Mensaje
  97.         return
  98.        
  99. ;Subsutina Interrupcion_EEIF
  100. Interrupcion_T0I
  101.         call    LCD_Borra
  102.         movlw   MensajeT0I              ; Visualiza el mensaje para T0I.
  103.         call    LCD_Mensaje
  104.         return
  105.  
  106. ; "Mensajes" ----------------------------------------------------------------------------
  107. ;
  108. Mensajes
  109.         addwf   PCL,F
  110. MensajeINT
  111.         DT "INTERRUPCION INT", 0x00
  112. MensajeRBI
  113.         DT "INTERRUPCION RBI", 0x00
  114. MensajeEEI
  115.         DT "INTERRUPCION EEI", 0x00
  116. MensajeT0I
  117.         DT "INTERRUPCION T0I", 0x00
  118.        
  119.         INCLUDE   <LCD_4BIT.INC>
  120.         INCLUDE   <LCD_MENS.INC>
  121.         INCLUDE   <RETARDOS.INC>
  122.         END
  123.  

Y es que siguiendo el rastro en la librería LCD_4BIT.INC en la línea 102 es cuando pone a 1 el bit RBIF del registro RBIF:
Código: ASM
  1. movwf   PORTB                   ; Realmente es TRISB.
  2.  

de esta librería:
Código: ASM
  1. ;**************************** Librería "LCD_4BIT.INC" ***********************************
  2. ;
  3. ;       ===================================================================
  4. ;         Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  5. ;         E. Palacios, F. Remiro y L. López.
  6. ;         Editorial Ra-Ma.  www.ra-ma.es
  7. ;       ===================================================================
  8. ;
  9. ; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2
  10. ; líneas por 16 caracteres, compatible con el modelo LM016L.
  11. ;
  12. ; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
  13. ; conexiones son:
  14. ;    -  Las 4 líneas superiores del módulo LCD, pines <DB7:DB4>  se conectan a las 4
  15. ;       líneas superiores del Puerto B del PIC, pines <RB7:RB4>.
  16. ;    -  Pin RS del LCD a la línea RA0 del PIC.
  17. ;    -  Pin R/W del LCD a la línea RA1 del PIC, o a masa.
  18. ;    -  Pin Enable del LCD a la línea RA2 del PIC.
  19. ;
  20. ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería RETARDOS.INC.
  21. ;
  22. ; ZONA DE DATOS *********************************************************************
  23.  
  24.         CBLOCK
  25.         LCD_Dato
  26.         LCD_GuardaDato
  27.         LCD_GuardaTRISB
  28.         LCD_Auxiliar1
  29.         LCD_Auxiliar2
  30.         ENDC
  31.  
  32. LCD_CaracteresPorLinea  EQU     .16     ; Número de caracteres por línea de la pantalla.
  33.  
  34. #DEFINE  LCD_PinRS      PORTA,0
  35. #DEFINE  LCD_PinRW      PORTA,1
  36. #DEFINE  LCD_PinEnable  PORTA,2
  37. #DEFINE  LCD_BusDatos   PORTB
  38.  
  39. ; Subrutina "LCD_Inicializa" ------------------------------------------------------------
  40. ;
  41. ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
  42. ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
  43. ; configuración inicial hay que hacerla como sigue:
  44. ;
  45. LCD_Inicializa
  46.         bsf     STATUS,RP0              ; Configura las líneas conectadas al pines RS,
  47.         bcf     LCD_PinRS               ; R/W y E.
  48.         bcf     LCD_PinEnable
  49.         bcf     LCD_PinRW
  50.         bcf     STATUS,RP0
  51.         bcf     LCD_PinRW               ; En caso de que esté conectado le indica
  52.                                         ; que se va a escribir en el LCD.
  53.         bcf     LCD_PinEnable           ; Impide funcionamiento del LCD poniendo E=0.
  54.         bcf     LCD_PinRS               ; Activa el Modo Comando poniendo RS=0.
  55.         call    Retardo_20ms
  56.         movlw   b'00110000'    
  57.         call    LCD_EscribeLCD          ; Escribe el dato en el LCD.
  58.         call    Retardo_5ms    
  59.         movlw   b'00110000'    
  60.         call    LCD_EscribeLCD
  61.         call    Retardo_200micros
  62.         movlw   b'00110000'    
  63.         call    LCD_EscribeLCD
  64.         movlw   b'00100000'             ; Interface de 4 bits.
  65.         call    LCD_EscribeLCD
  66.  
  67. ; Ahora configura el resto de los parámetros:
  68.  
  69.         call    LCD_2Lineas4Bits5x7     ; LCD de 2 líneas y caracteres de 5x7 puntos.
  70.         call    LCD_Borra               ; Pantalla encendida y limpia. Cursor al principio
  71.         call    LCD_CursorOFF           ; de la línea 1. Cursor apagado.
  72.         call    LCD_CursorIncr          ; Cursor en modo incrementar.
  73.         return
  74.  
  75. ; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
  76. ;
  77. ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
  78. ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
  79. ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
  80. ; vuelve a enviar este dato sin cambiarlo.
  81.  
  82. LCD_EscribeLCD
  83.         andlw   b'11110000'             ; Se queda con el nibble alto del dato que es el
  84.         movwf   LCD_Dato                ; que hay que enviar y lo guarda.
  85.         movf    LCD_BusDatos,W          ; Lee la información actual de la parte baja
  86.         andlw   b'00001111'             ; del Puerto B, que no se debe alterar.
  87.         iorwf   LCD_Dato,F              ; Enviará la parte alta del dato de entrada
  88.                                         ; y en la parte baja lo que había antes.
  89.         bsf     STATUS,RP0              ; Acceso al Banco 1.
  90.         movf    TRISB,W         ; Guarda la configuración que tenía antes TRISB.
  91.         movwf   LCD_GuardaTRISB
  92.         movlw   b'00001111'             ; Las 4 líneas inferiores del Puerto B se dejan
  93.         andwf   PORTB,F                 ; como estaban y las 4 superiores como salida.
  94.         bcf     STATUS,RP0              ; Acceso al Banco 0.
  95. ;
  96.         movf    LCD_Dato,W              ; Recupera el dato a enviar.
  97.         movwf   LCD_BusDatos            ; Envía el dato al módulo LCD.
  98.         bsf     LCD_PinEnable           ; Permite funcionamiento del LCD mediante un pequeño
  99.         bcf     LCD_PinEnable           ; pulso y termina impidiendo el funcionamiento del LCD.
  100.         bsf     STATUS,RP0              ; Acceso al Banco 1. Restaura el antiguo valor en
  101.         movf    LCD_GuardaTRISB,W       ; la configuración del Puerto B.
  102.         movwf   PORTB                   ; Realmente es TRISB.
  103.         bcf     STATUS,RP0              ; Acceso al Banco 0.
  104.         return
  105.  
  106. ; Subrutinas variadas para el control del módulo LCD -----------------------------------------
  107. ;
  108. ;Los comandos que pueden ser ejecutados son:
  109. ;
  110. LCD_CursorIncr                          ; Cursor en modo incrementar.
  111.         movlw   b'00000110'
  112.         goto    LCD_EnviaComando
  113. LCD_Linea1                              ; Cursor al principio de la Línea 1.
  114.         movlw   b'10000000'             ; Dirección 00h de la DDRAM
  115.         goto    LCD_EnviaComando
  116. LCD_Linea2                              ; Cursor al principio de la Línea 2.
  117.         movlw   b'11000000'             ; Dirección 40h de la DDRAM
  118.         goto    LCD_EnviaComando
  119. LCD_PosicionLinea1                      ; Cursor a posición de la Línea 1, a partir de la
  120.         iorlw   b'10000000'             ; dirección 00h de la DDRAM más el valor del
  121.         goto    LCD_EnviaComando        ; registro W.
  122. LCD_PosicionLinea2                      ; Cursor a posición de la Línea 2, a partir de la
  123.         iorlw   b'11000000'             ; dirección 40h de la DDRAM más el valor del
  124.         goto    LCD_EnviaComando        ; registro W.
  125. LCD_OFF                         ; Pantalla apagada.
  126.         movlw   b'00001000'
  127.         goto    LCD_EnviaComando
  128. LCD_CursorON                            ; Pantalla encendida y cursor encendido.
  129.         movlw   b'00001110'
  130.         goto    LCD_EnviaComando
  131. LCD_CursorOFF                           ; Pantalla encendida y cursor apagado.
  132.         movlw   b'00001100'
  133.         goto    LCD_EnviaComando
  134. LCD_Borra                               ; Borra toda la pantalla, memoria DDRAM y pone el
  135.         movlw   b'00000001'             ; cursor a principio de la línea 1.
  136.         goto    LCD_EnviaComando
  137. LCD_2Lineas4Bits5x7                     ; Define la pantalla de 2 líneas, con caracteres
  138.         movlw   b'00101000'             ; de 5x7 puntos y conexión al PIC mediante bus de
  139. ;       goto    LCD_EnviaComando        ; 4 bits.
  140.  
  141. ; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
  142. ;
  143. ; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
  144. ; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
  145. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
  146. ; a través del registro W. Trabaja en Modo Dato.
  147. ;
  148. LCD_EnviaComando
  149.         bcf     LCD_PinRS               ; Activa el Modo Comando, poniendo RS=0.
  150.         goto    LCD_Envia
  151. LCD_Caracter
  152.         bsf     LCD_PinRS               ; Activa el "Modo Dato", poniendo RS=1.
  153.         call    LCD_CodigoCGROM ; Obtiene el código para correcta visualización.
  154. LCD_Envia
  155.         movwf   LCD_GuardaDato          ; Guarda el dato a enviar.
  156.         call    LCD_EscribeLCD          ; Primero envía el nibble alto.
  157.         swapf   LCD_GuardaDato,W        ; Ahora envía el nibble bajo. Para ello pasa el
  158.                                         ; nibble bajo del dato a enviar a parte alta del byte.
  159.         call    LCD_EscribeLCD          ; Se envía al visualizador LCD.
  160.         btfss   LCD_PinRS               ; Debe garantizar una correcta escritura manteniendo
  161.         call    Retardo_2ms             ; 2 ms en modo comando y 50 µs en modo cáracter.
  162.         call    Retardo_50micros
  163.         return 
  164.  
  165. ; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
  166. ;
  167. ; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
  168. ; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
  169. ; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
  170. ;
  171. ; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
  172. ; que puedan ser visualizado en el módulo LM016L.
  173. ;
  174. ; Entrada:      En (W) el código ASCII del carácter que se desea visualizar.
  175. ; Salida:       En (W) el código definido en la tabla CGROM.
  176.  
  177. LCD_CodigoCGROM
  178.         movwf   LCD_Dato                ; Guarda el valor del carácter y comprueba si es
  179. LCD_EnheMinuscula                       ; un carácter especial.
  180.         sublw   'ñ'                    ; ¿Es la "ñ"?
  181.         btfss   STATUS,Z
  182.         goto    LCD_EnheMayuscula       ; No es "ñ".
  183.         movlw   b'11101110'             ; Código CGROM de la "ñ".
  184.         movwf   LCD_Dato
  185.         goto    LCD_FinCGROM
  186. LCD_EnheMayuscula
  187.         movf    LCD_Dato,W              ; Recupera el código ASCII de entrada.
  188.         sublw   'Ñ'                    ; ¿Es la "Ñ"?
  189.         btfss   STATUS,Z
  190.         goto    LCD_Grado               ; No es "Ñ".
  191.         movlw   b'11101110'             ; Código CGROM de la "ñ". (No hay símbolo para
  192.         movwf   LCD_Dato                ; la "Ñ" mayúscula en la CGROM).
  193.         goto    LCD_FinCGROM   
  194. LCD_Grado
  195.         movf    LCD_Dato,W              ; Recupera el código ASCII de entrada.
  196.         sublw   'º'                    ; ¿Es el símbolo "º"?
  197.         btfss   STATUS,Z
  198.         goto    LCD_FinCGROM            ; No es "º".
  199.         movlw   b'11011111'             ; Código CGROM del símbolo "º".
  200.         movwf   LCD_Dato
  201. LCD_FinCGROM
  202.         movf    LCD_Dato,W              ; En (W) el código buscado.
  203.         return
  204.  
  205. ; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
  206. ;
  207. ; Visualiza espacios en blanco.
  208.  
  209. LCD_LineaEnBlanco
  210.         movlw   LCD_CaracteresPorLinea
  211.         goto    LCD_EnviaBlancos
  212. LCD_UnEspacioBlanco
  213.         movlw   .1
  214.         goto    LCD_EnviaBlancos
  215. LCD_DosEspaciosBlancos
  216.         movlw   .2
  217.         goto    LCD_EnviaBlancos
  218. LCD_TresEspaciosBlancos
  219.         movlw   .3
  220. LCD_EnviaBlancos
  221.         movwf   LCD_Auxiliar1           ; (LCD_Auxiliar1) se utiliza como contador.
  222. LCD_EnviaOtroBlanco    
  223.         movlw   ' '                     ; Esto es un espacio en blanco.
  224.         call    LCD_Caracter            ; Visualiza tanto espacios en blanco como se
  225.         decfsz  LCD_Auxiliar1,F         ; haya cargado en (LCD_Auxiliar1).
  226.         goto    LCD_EnviaOtroBlanco
  227.         return
  228.  
  229. ; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
  230. ;
  231. ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
  232. ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
  233. ;
  234. ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
  235. ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
  236. ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
  237. ;
  238. ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
  239. ;
  240. LCD_Byte
  241.         movwf   LCD_Auxiliar2           ; Guarda el valor de entrada.
  242.         andlw   b'11110000'             ; Analiza si el nibble alto es cero.
  243.         btfss   STATUS,Z                ; Si es cero lo apaga.
  244.         goto    LCD_VisualizaAlto               ; No es cero y lo visualiza.
  245.         movlw   ' '                     ; Visualiza un espacio en blanco.
  246.         call    LCD_Caracter
  247.         goto    LCD_VisualizaBajo
  248.  
  249. LCD_ByteCompleto
  250.         movwf   LCD_Auxiliar2           ; Guarda el valor de entrada.
  251. LCD_VisualizaAlto
  252.         swapf   LCD_Auxiliar2,W         ; Pone el nibble alto en la parte baja.
  253.         call    LCD_Nibble              ; Lo visualiza.
  254. LCD_VisualizaBajo
  255.         movf    LCD_Auxiliar2,W         ; Repite el proceso con el nibble bajo.
  256. ;       call    LCD_Nibble              ; Lo visualiza.
  257. ;       return
  258.  
  259. ; Subrutina "LCD_Nibble" ----------------------------------------------------------------
  260. ;
  261. ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
  262. ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
  263. ; - Si (W)=b'01010110', se visualizará "6".
  264. ; - Si (W)=b'10101110', se visualizará "E".
  265. ;
  266. LCD_Nibble
  267.         andlw   b'00001111'             ; Se queda con la parte baja.
  268.         movwf   LCD_Auxiliar1           ; Lo guarda.
  269.         sublw   0x09                    ; Comprueba si hay que representarlo con letra.
  270.         btfss   STATUS,C       
  271.         goto    LCD_EnviaByteLetra
  272.         movf    LCD_Auxiliar1,W
  273.         addlw   '0'                     ; El número se pasa a carácter ASCII sumándole
  274.         goto    LCD_FinVisualizaDigito  ; el ASCII del cero y lo visualiza.
  275. LCD_EnviaByteLetra
  276.         movf    LCD_Auxiliar1,W
  277.         addlw   'A'-0x0A                        ; Sí, por tanto, se le suma el ASCII de la 'A'.
  278. LCD_FinVisualizaDigito
  279.         goto    LCD_Caracter            ; Y visualiza el carácter. Se hace con un "goto"
  280.                                         ; para no sobrecargar la pila.
  281.                                        
  282. ;       ===================================================================
  283. ;         Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  284. ;         E. Palacios, F. Remiro y L. López.
  285. ;         Editorial Ra-Ma.  www.ra-ma.es
  286. ;       ===================================================================
  287.  
  288.  

Mi pregunta es. ¿Cómo hago para realmente hacer que no salte la interrupción RBI?

Un saludo y gracias de antemano.
« Última modificación: 22 de Julio de 2018, 13:58:41 por jurgen »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6750
Re:Interrupcion RBI junto control LCD en PIC16F84A (ASM)
« Respuesta #1 en: 22 de Julio de 2018, 16:32:23 »
Hay unos cuantos de problemas con tu codigo:

Código: ASM
  1.         call    Retardo_20ms            ;Espera se estabilicen niveles.

Nunca pongas retardos en las interrupciones, no necesitas esperar NADA. Ni tampoco funciones como imprimir en el LCD ya que son consumidoras de tiempo.

Código: ASM
  1.         bcf     INTCON,INTF             ;Limpia el flag de reconocimiento INTF
  2.         bcf     INTCON,EEIF             ;Limpia el flag de reconocimiento EEIF
  3.         bcf     INTCON,T0IF             ;Limpia el flag de reconocimiento T0IF

La limpieza de banderas estan mal ubicadas, ahi vas a tener problemas, lo mejor es que lo limpies dentro de cada CALL que atiende a la interrupcion que le corresponde ej:

Código: ASM
  1. Interrupcion_RBI
  2.         call    LCD_Borra
  3.         movlw   MensajeRBI              ; Visualiza el mensaje para RBI.
  4.         call    LCD_Mensaje
  5.         bcf     INTCON,RBIF             ;Limpia el flag de reconocimiento RBIF
  6.         return

Citar
Mi pregunta es. ¿Cómo hago para realmente hacer que no salte la interrupción RBI?

Por lo que veo en la libreria que tenes:

Código: ASM
  1. LCD_EscribeLCD
  2.         andlw   b'11110000'             ; Se queda con el nibble alto del dato que es el
  3.         movwf   LCD_Dato                ; que hay que enviar y lo guarda.
  4.         movf    LCD_BusDatos,W          ; Lee la información actual de la parte baja
  5.         andlw   b'00001111'             ; del Puerto B, que no se debe alterar.
  6.         iorwf   LCD_Dato,F              ; Enviará la parte alta del dato de entrada

La libreria utiliza RB4 a RB7 como salidas, entonces vos con tu libreria le estas cambiando de estado al pin, disparando la interrupción.
La forma de solucionarlo es modificar la libreria para que utilize otros pines para que no disparen la interrupción, seguramente del PORTA
« Última modificación: 22 de Julio de 2018, 16:42:26 por KILLERJC »

Desconectado jurgen

  • PIC10
  • *
  • Mensajes: 5
Re:Interrupcion RBI junto control LCD en PIC16F84A (ASM)
« Respuesta #2 en: 08 de Agosto de 2018, 14:51:01 »
Gracias KILLERJC. Saludos


 

anything