No voy a sacar el cava porque aún falta, pero aunque he estado un montón de tiempo sin escribir, yo sigo con lo mio, cuando me dejan. Por donde voy ..., todo funciona correctamente, uso la interrupción para incrementar el valor de un botón que luego uso en el programa principal (eso es poner un flag no). Uso dos botones, uno para ver la hora y cambiar a la linterna (si, ahora tiene linterna) y con el otro lo apago todo y dejo a cero la memoria que uso para la interrupcion.
; =====================================================================
; El reloj funciona con dos botones, al pulsar un boton se visualiza
; por los leds la hora y los minutos. Al volver a pulsarlo se enciende
; el led que hace de linterna. Con el otro botón, se apaga la linterna
; o se apagan los leds que dan la hora.
;
; Version: 1.5
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF
LIST P=16F628A
INCLUDE <P16F628A.INC>
CBLOCK 0x20
segundos
minutos
horas
contador
boton_0
led
W_temp
Status_temp
ENDC
boton_1 EQU d'0'
Max_horas EQU d'12'
Max_minutos EQU d'60'
Max_segundos EQU d'60'
ORG 0x0000 ; Vector de reset
goto Start
ORG 0X0004 ; Vector de interrupcion
goto Interrupcion
Start
bsf STATUS,RP0
clrf TRISA
movlw b'11111111'
movwf TRISB
bcf STATUS,RP0
CLRF PORTA ; Digital y a 0
MOVLW 0x07
MOVWF CMCON
movlw b'00111100' ; Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
movwf T1CON
movlw b'00001011' ; Se configura CCP modo captura cada flanco de subida.-
movwf CCP1CON
movlw b'11110100'
movwf CCPR1H
movlw b'00100100'
movwf CCPR1L
clrf TMR1H
clrf TMR1L
bsf T1CON,TMR1ON
; Activamos la interrupción
BCF INTCON,INTF ; Activo interrupcion de RB0/Flanco descendente
BSF INTCON,INTE
BSF INTCON,GIE ; Habilitamos interrupciones globales
; Zona del banco de memorias de los diferentes registros.
movlw d'0'
movwf boton_0
movlw d'1'
movwf segundos
movwf minutos
movwf horas
movwf contador
movlw d'64'
movwf led
; ================================================================
; Comienza el programa principal.
; ================================================================
Principal
call Pulsador
call Contar_hora
goto Principal
Pulsador
btfss PORTB,1
goto clear_boton_0
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'0'
btfsc STATUS,Z
return
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'2'
btfsc STATUS,Z
goto Encender_led
movf boton_0,W
sublw d'1'
btfsc STATUS,Z
goto Mostrar_hora
goto Principal
; ===================================================================
; Enciende el LED de iluminación
; ===================================================================
Encender_led
movf led,W
movwf PORTA
goto Contar_hora
; ===================================================================
; Dejamos a cero la memoria del botón_0 y limpiamos PORTA
; ====================================================================
clear_boton_0
clrf PORTA
movlw d'0'
movwf boton_0
return
; =======================================================================
; Una vez el boton_0 está a 1 mostramos la hora y los minutos
; =======================================================================
Mostrar_hora
movf horas,W ; mostramos las horas por el display de leds.
movwf PORTA
call Contar_hora ; tiempo en que los leds permanecen encendidos mostrando la hora
clrf PORTA
call Contar_hora ; tiempo en que los leds permanecen apagados
movf minutos,W ; mostramos lOS minutos por el display de leds.
movwf PORTA
call Contar_hora
clrf PORTA
return
Tiempo_refresco
btfss PIR1,CCP1IF
goto Tiempo_refresco
bcf PIR1,CCP1IF
clrf TMR1H
decfsz contador,F
goto Tiempo_refresco
movlw d'2'
movwf contador
return
; ==========================================================================
; Conteo de las horas del reloj y su puesta a cero cuando llega a las 12 horas
; =============================================================================
Contar_hora
inc_segundos
btfss PIR1,CCP1IF
goto inc_segundos
bcf PIR1,CCP1IF
clrf TMR1H
decfsz contador,F
goto inc_segundos
comp
movlw d'2'
movwf contador
incf segundos,F
movf segundos,W ;revisa si ha llegado a 60 segundos.
sublw Max_segundos
btfss STATUS,Z ; si ha llegado a 60 segundos, se va a inc_minutos, sino se va a inc_segundos.
return
; " En el momento que los segundos llegan a 60, se incrementa 1 a minutos, se revisa si se ha llegado a 60 minutos y se pone a 0 los segundos"
inc_minutos
movlw d'1' ; Ponemos a cero los segundos para que empiece el conteo.
movwf segundos
incf minutos ; incrementamos en 1 los minutos.
movf minutos,W
sublw Max_minutos ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
goto inc_horas ; si ha llegado a 60 minutos se va a inc_horas.
return ; si no, se va ainc_segundos que empiezan a cero puesto que ya se ha reseteado en movwf segundos.
; " En el momento que los minutos llegan a 60, se incrementa 1 en horas y se ponen a 0 los minutos y los segundos"
inc_horas
movlw d'1' ; Primer número por donde quieres que empiece el conteo.
movwf minutos
incf horas
movf horas,W
sublw Max_horas ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
call doce_horas
return
doce_horas
movlw d'1'
movwf segundos
movwf minutos
movwf horas
return
; ===========================================================
; Comienzo de la interrupcion
; =============================================================
Interrupcion:
; Guardo Contexto
MOVWF W_temp
SWAPF STATUS,W
MOVWF Status_temp
; Comienza el codigo de mi interrupcion
BANKSEL PIR1
BTFSC INTCON,INTF
CALL Int_Rb0
; Fin de codigo de interrupcion
; Devuelvo el contexto
;Fin_interrupcion:
SWAPF Status_temp,W
MOVWF STATUS
SWAPF W_temp,F
SWAPF W_temp,W
RETFIE
Int_Rb0:
btfsc PORTB,0
incf boton_0,1
goto Fin_int_Rb0
Fin_int_Rb0:
BCF INTCON,INTF
RETURN
END
Que me queda?? pues mucho, ahora con tus apuntes que vas colgando miraré bien bien usar el CCP como contador, porque creo que todavía no lo hago correctamente y luego ... ya veremos por donde seguimos. Seguiremos informando.