TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ridrovo 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