Autor Tema: contador 0-99 con interrupcion externa rb0  (Leído 3145 veces)

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

Desconectado ridrovo

  • PIC10
  • *
  • Mensajes: 1
contador 0-99 con interrupcion externa rb0
« en: 24 de Noviembre de 2013, 23:14:37 »
Saludos  no entiendo la parte de la interrupcion externa del pic16f887
mi proyecto:
Se trata de un contador (0-99), el incremento se maneja por interrupcion del timer0 y mediante la interrupcion externa(switch):
* si el switch esta abierto el contador para
*si el switch esta cerrado vuelve a contar desde donde se quedo
ejemplo:
inicia el conteo(switch cerrado): 0 1 2 3 4
switch abierto: se queda en 4
switch cerrado: 5 6 7 8...
estoy trabajando con el PIC16f887 y con MPLAB

este es el codigo del contador pero ni idea de como hacer la parte de la interrupcion externa.
;Directivas iniciales

         LIST      p=16F887      ;Tipo de microcontrolador
         INCLUDE    P16F887.INC      ;Define los SFRs y bits del    P16F887
         __CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC ;Setea parámetros de configuración
         ERRORLEVEL    -302         ;Deshabilita mensajes de advertencia por cambio bancos
;*******************************************************************************************   
;Variables      
         CBLOCK   0X20   
         CNT         ;Cuenta 100 interrupciones
         UNIDAD
         UNICOD   
         DECENA
         DECCOD   
         SEL   
          Guarda_W
          Guarda_STATUS
          GUARDA_DIG1
          GUARDA_DIG2
         ENDC   
;*********************************************************************
;Inicio del programa
         ORG      0x00      ;Vector de RESET
         GOTO      INICIO
         ORG      0x04      ;Vector de interrupción
         GOTO      ISR   ;Va a rutina de interrupción

;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.          
ISR  

            GOTO        DETENER
            MOVF      SEL,W      ;Se mueve a si mismo para afectar bandera
         BTFSS      STATUS,2   ;sel=0 refresca dig1; sel=1 refresca dig2
         GOTO      DIG2
DIG1       
         MOVF      UNIDAD,W  
         CALL      TABLA
         MOVWF   UNICOD
         MOVF       UNICOD,W
         BSF      PORTA,0
         BSF      PORTA,1
         MOVWF   PORTD
         BCF      PORTA,0
         COMF      SEL,F
         GOTO       DEC
DIG2   
         MOVF      DECENA,W  
         CALL      TABLA
         MOVWF   DECCOD
         MOVF       DECCOD,W
         BSF      PORTA,0
         BSF      PORTA,1
         MOVWF   PORTD
         BCF      PORTD,1
         COMF      SEL,F   
DEC               
         DECFSZ    CNT,F         ;cuenta espacios de 10ms
         GOTO      SEGUIR      ;Aún, no son 100 interrupciones
         INCF       UNIDAD,F      ;Ahora sí 10x100=1000ms=1seg
         MOVLW   .10
         SUBWF   UNIDAD,W
         BTFSS      STATUS,2
         GOTO      CONT
         CLRF      UNIDAD
         INCF      DECENA
         MOVLW   .10
         SUBWF   DECENA,W
         BTFSS      STATUS,2
         GOTO      CONT
         CLRF      DECENA

CONT       MOVLW    .50      
          MOVWF    CNT         ;Carga contador con 100

SEGUIR  
         BCF      INTCON,T0IF      ;Repone flag del TMR0
         MOVLW    -.39
             MOVWF    TMR0         ;Repone el TMR0 con -.39 (217)
             RETFIE            ;Retorno de interrupción

      
;********************************************************************
; Programa Principal
INICIO
;SETEO DE PUERTOS
         BANKSEL   ANSEL      ;Selecciona el Bank3
         CLRF      ANSEL
         CLRF      ANSELH
         BANKSEL    TRISA      ;Selecciona el Bank1
         CLRF      TRISA      ;PORTA configurado como salida
         CLRF      TRISD      ;PORTD configurado como salida
         BSF         TRISB, 0    ;OJO RB0 CONFIGURADO COMO ENTRADA

;INICIALIZACION         
         BANKSEL    PORTA      ;Selecciona el Bank0      
         CLRF      PORTA      ;Borra latch de salida de PORTA
         CLRF      PORTD      ;Borra latch de salida de PORTD
         CLRF        PORTB       ;OJO
         CLRF      UNIDAD
         CLRF      DECENA
         CLRF      SEL   
                                                                
;PROGRAMACION DEL TMR0
         BANKSEL   OPTION_REG     ;Selecciona el Bank1
         MOVLW   B'00000111'   ;TMR0 como temporizador
         MOVWF   OPTION_REG     ;con preescaler de 256
         BANKSEL   TMR0      ;Selecciona el Bank0
         MOVLW   .217      ;Valor decimal 217   
         MOVWF   TMR0      ;Carga el TMR0 con 217
   
;PROGRAMACION DE INTERRUPCION
         MOVLW   B'10110000' ;OJO
         MOVWF   INTCON      ;Activa la interrupción del TMR0
         MOVLW   .50         ;Cantidad de interrupciones a contar
         MOVWF   CNT         ;Nº de veces a repetir la interrupción
;**********************************************************************
PP         NOP
         NOP
         GOTO     PP
;***********************************************************************

; TABLA DE CONVERSION-----CATODO COMUN

TABLA
             ADDWF   PCL,F          ; PCL + W -> PCL
               ; El PCL se incrementa con el
               ; valor de W proporcionando un
               ; salto
             RETLW      0x3F        ; Retorna con el código del 0
         RETLW   0x06      ; Retorna con el código del 1
         RETLW   0x5B      ; Retorna con el código del 2
         RETLW   0x4F      ; Retorna con el código del 3
         RETLW   0x66      ; Retorna con el código del 4
         RETLW   0x6D      ; Retorna con el código del 5
         RETLW   0x7D      ; Retorna con el código del 6
         RETLW   0x07      ; Retorna con el código del 7
         RETLW   0x7F      ; Retorna con el código del 8
         RETLW   0x67      ; Retorna con el código del 9
         END         ; Fin del programa fuente
« Última modificación: 28 de Noviembre de 2013, 00:32:41 por ridrovo »