Autor Tema: Interrupcion por teclado para 16F877A  (Leído 3748 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #15 en: 11 de Marzo de 2016, 16:05:37 »
Comenza un ejemplo nuevo, un programa totalmente nuevo para solo la interrupcion. Luego cuando entiendas realmente lo que hace la interrupcion vas al programa con el LCD y lo agregas.

Respecto al diagrama esta bien, recorda que si activas los Pull-ups del puertoB podes omitir las resistencias esas.

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #16 en: 11 de Marzo de 2016, 18:54:55 »
y porque no me funciona ? podes ayudarme ? en el archivo anterior esta el asm que hice solo para esto
gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #17 en: 11 de Marzo de 2016, 19:18:39 »
y porque no me funciona ? podes ayudarme ? en el archivo anterior esta el asm que hice solo para esto
gracias

No, en el archivo anterior hay codigo de LCD, hay delays que no se usan alli, hay muchas cosas que ni siquiera deben estar alli. Para ser un "programa nuevo" como te habia pedido. En resumen pase a hacerte el favor y eliminar todo lo que no necesitas. Aunque falta de completar varias cosas, algunas señaladas y otras no tanto :P


Código: ASM
  1. ;
  2. ;PROPIETARIO:                   RUBEN DARIO FIGUEREDO
  3. ;                                              
  4. ;FECHA:                                 10 DE MARZO DE 2016 15:49
  5. ;PROFESOR:                              FORO TODO PIC
  6. ;VERSION DEFINITIVA:            MICRO 16F877A
  7. ;GRABAR CON:                    WDT=                            OFF
  8. ;                                               POWER UP TIMER=         OFF
  9. ;                                               BROWN OUT DETECT=       OFF
  10. ;                                               CODE PROTECT=           ON
  11. ;**************************************************************************
  12.                                  list p=16f877a
  13.                      #include <p16f877a.inc>
  14.  
  15.  #define                FOSC    D'4000000'  
  16.  
  17. ;**************************************************************************************************************
  18. ;FUSIBLES DE PROGRAMACIÓN, EVITA TENER QUE ESCRIBIRLOS CADA VEZ QUE SE EJECUTA EL PROGRAMA WINPICPROG O IC-PROG
  19. ;*************************************************************************************************************
  20.  
  21. __CONFIG _BODEN_OFF & _CP_OFF & _WRT_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF
  22.  
  23. ;*************************************************************************************************************
  24.  
  25. CBLOCK  0X20
  26.         TEMP1
  27.         TEMP2
  28.         W_TEMP
  29.         STATUS_TEMP
  30.         PCLATH_TEMP
  31.         ENDC
  32.  
  33. ;*****************************************************************************         
  34.  
  35.                 ORG             000H            ;VECTOR DE RESET
  36.                 GOTO    SETUP
  37.                 ORG             0X04            ;VECTOR DE INTERRUPCION
  38.  
  39.  
  40. ;**********************************************************************************************
  41. ;                       CONFIGURACION DE PUERTOS
  42. ;**********************************************************************************************
  43.  
  44. SETUP
  45.  
  46.                 BANKSEL         TRISA                   ;SUBO A BANCO1
  47.        
  48.                 MOVLW           B'00000110'     ;1 input, 0 output
  49.                 MOVWF           TRISA                   ;DESCARGO EN TRISA
  50.                 MOVLW           B'00000000'     ;1 input, 0 output
  51.                 MOVWF           TRISB                   ;DESCARGO EN TRISB
  52.                 MOVLW           B'00000000'     ;1 input, 0 output
  53.                 MOVWF           TRISC                   ;DESCARGO EN TRISD
  54.                 MOVLW           B'00000000'     ;1 input, 0 output
  55.                 MOVWF           TRISD                   ;DESCARGO EN TRISE
  56.                 MOVLW           B'00000000'     ;1 input, 0 output
  57.                 MOVWF           TRISE
  58.                
  59.                 MOVLW           .7
  60.                 MOVWF           ADCON1
  61.  
  62.  
  63.                 BANKSEL         PORTA                           ;BAJO A BANCO 0
  64.        
  65.                 CLRF            PORTA                   ;LIMPIO PORTA
  66.                 CLRF            PORTB                   ;LIMPIO PORTB
  67.                 CLRF            PORTC                   ;LIMPIO PORTC
  68.                 CLRF            PORTD                   ;LIMPIO PORTD
  69.                 CLRF            PORTE                   ;LIMPIO PORTE
  70.  
  71. ;****************************************************************************************************
  72. ;                       CONFIGURACION DE INTEERRUPCIONES
  73. ;****************************************************************************************************
  74.  
  75. CONF_INTERRUPCION
  76.  
  77.                 BSF INTCON,RBIE                         ; HABILITAR INTERRUPCION RBIE
  78.                 BCF INTCON,RBIF                         ; LIMPIAR LA BANDEERA DE INTERRUPCION
  79.                 BSF INTCON,GIE                  ; HABILITAR INTERRUPCION
  80.  
  81. ;******************************************************************************************************
  82. ;                       RUTINA PRINCIPAL PRENDE UN LED Y MUESTRA UN MENSAJE
  83. ;******************************************************************************************************
  84.  
  85. PRINCIPAL
  86.                 ;Aca crear el codigo del LED
  87.                 GOTO            PRINCIPAL
  88.  
  89. ;*****************************************************************************************
  90. ;                        RUTINA DE SERVICIO DE INTERRUCION
  91. ;*****************************************************************************************
  92.  
  93. ISR
  94.         ; Aca arreglar todo.
  95.                 BCF             INTCON,GIE                               ; DESHABLITAR INTERRUPCIONES
  96.        
  97. ;CHEQUEO BOTONES
  98.  
  99.                 BTFSS           MENU
  100.                 BCF                     LED
  101.                 CALL            DEMORA
  102.                 CALL            PRINCIPAL
  103.                
  104.  
  105. SALIDA_ISR
  106.  
  107.                 BCF                     INTCON,RBIF                             ; LIMPIA LA BANDERA DE INTERRUPCION
  108.                 BSF             INTCON,GIE                              ; HABILITAR INTERRUPCIONES
  109.                 RETFIE                                                          ; REGRESAR DE LA INTERRUPCION
  110.  
  111.        
  112.  
  113. DEMORA  
  114.  
  115.                 MOVLW           .255    ;CARGO 255 A W
  116.                 MOVWF           TEMP1   ;DESCARGO 4 EN GRAL1   
  117. BN              MOVLW           .255            ;CARGO 255 A W
  118.                 MOVWF           TEMP2   ;DESCARGO EN GRAL2
  119. NM              NOP                                     ;NOP, UN CICLO DE MÁQUINA, UN BYTE
  120.                 DECFSZ          TEMP2   ;DECREMENTO GRAL2, SALTO SI ES CERO
  121.                 GOTO            NM              ;VOY A NM
  122.                 DECFSZ          TEMP1   ;DECREMENTO GRAL1 SALTO SI ES CERO
  123.                 GOTO            BN              ;VOY A BN
  124.                 RETURN                          ;RETORNO
  125.  
  126.  
  127. END

En ese codigo, tenes los siguientes problemas:

- No tenes definido la instruccion en el vector de interrupcion, que te llevaria a la rutina de interrupcion.
- No guardas el contexto ( STATUS, W , PCLATH ) al entrar a la interrupcion ni lo repones cuando salis, esto podes buscarlo en el datasheet, busca por W_TEMP que seguro tenes el codigo.
- Activas la interrupcion dentro de la interrupcion, eso no se hace, el mismo RETFIE lo hace por si solo ( activa GIE ).
- Usas una demora dentro de la interrupcion
- Haces un CALL a la rutina Principal.. NO NO y NO, pensa la interrupcion como algo aislado, NUNCA pero NUNCA hagas eso. Por ahora lo que es de la interrupcion NUNCA deberia estar en el camino del programa Principal y viceversa. Una ves que entiendas mejor como es que funciona una interrupcion podes llegar a "mezclar un poco las cosas". Para que quede mas claro pensalo como 2 programas apartes, uno es la interrupcion y el otro es el principal, ninguno se pueden llamar entre uno u otros, solo usar registros.
- Al entrar a la interrupcion se dehsabilita por si sola la interrupcion global ( GIE ), por lo tanto el BCF esta por demas.
- Usaste un CALL a PRINCIPAL sin haber un RETURN. ( Aunque dije que era incorrecto hacer eso, lo que quiero apuntar es que si usas un CALL asegurate que en algun momento llegue a un RETURN).

Resolve estos problemas y luego podemos seguir  :mrgreen:
« Última modificación: 11 de Marzo de 2016, 19:23:02 por KILLERJC »

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #18 en: 11 de Marzo de 2016, 19:59:02 »
Bueno KILLERJC lo voy a intentar y comento .gracias !!!!!!!!!!!!!!!!!!!!!!!!!!