hola buenas recientemente tengo un proyecto que consta del conteo del 0 al 999 los cuales son activados mediante un push boton y 3 displays de ánodo común que tras 1 minuto sin testeo se pagan los displays y al detectar pulso se resetea y comienza el conteo de 0
pero yo lo hice mediante el TMR0 por desbordamiento eh interrupciones pero eso me genera que la pila de 9v a la cual esta conectado el circuito se consuma muy rápido y eh estado leyendo en foros que se puede activar el modo sleep en un pic el pic que yo uso es el 16f887 y viendo en su datashet si tiene ese modo SLEEP pero no tengo ni idea como entrarle ni como activarlo me gustaría si alguien me podría explicar como implementarlo en mi circuito para poder así reducir mi consumo de energía. Gracias.
Les comparto mi código que ya esta en uso para ver que se le quita y que se le agrega para el modo SLEEP.
include P16F887.INC
__CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
__CONFIG _CONFIG2, _WRT_OFF & _BOR4V_BOR21V
CBLOCK 0x020
CENTENAS
DECENAS
UNIDADES
TIEMPO
TIEMPO_M
BANDERA_TMP
W_TEMP
STATUS_TEMP
v1
v2
v3
TCount
ENDC
#DEFINE BOTON PORTA,4; AQUI PUEDES CAMBIAR EL BIT Y PUERTO QUE QUIERAS QUE SEA EL BOTON SIN NECESIDAD DE CAMBIAR EN TODO EL PROGRAMA
ORG 0x00
GOTO INICIO
ORG 0X04
;=================================
; INTERRUPCIONES
;=================================
INT_SUB:
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
BCF INTCON, T0IF
INCF TIEMPO,F
MOVFW TIEMPO
XORLW .153 ;TIEMPO PARA 10seg, lo necesitamos 6 veces mas para completar el minuto
BTFSS STATUS, Z
GOTO FIN_INTE
TERMINO_TMP
CLRF TIEMPO
INCF TIEMPO_M,F
MOVFW TIEMPO_M
XORLW .6 ;TESTEAMOS SI YA VAN 6 VECES DE 10 SEGUNDOS
BTFSS STATUS,Z
GOTO FIN_INTE
TERMINO_MINUTO
BSF BANDERA_TMP,0
CLRF TIEMPO
CLRF TIEMPO_M
FIN_INTE:
BSF INTCON, GIE
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;=================================
; TABLAS
;=================================
;Con display de anodo comun, EL BIT7 ES EL PUNTO DEL DISPLAY
BIN2SEVEN_SEG
ANDLW B'00001111'
ADDWF PCL,F
RETLW B'11000000' ;'0'
RETLW B'11111001' ;'1'
RETLW B'10100100' ;'2'
RETLW B'10110000' ;'3'
RETLW B'10011001' ;'4'
RETLW B'10010010' ;'5'
RETLW B'10000010' ;'6'
RETLW B'11111000' ;'7'
RETLW B'10000000' ;'8'
RETLW B'10011000' ;'9'
RETLW B'10001000' ;'A'
RETLW B'10000011' ;'B'
RETLW B'11000110' ;'C'
RETLW B'10100001' ;'D'
;;Con display de catodo comun, EL BIT0 ES EL PUNTO DEL DISPLAY
;BIN2SEVEN_SEG
; ANDLW B'00001111'
; ADDWF PCL,F
; RETLW B'01111110' ;'0'
; RETLW B'00001100' ;'1'
; RETLW B'10110110' ;'2'
; RETLW B'10011110' ;'3'
; RETLW B'11001100' ;'4'
; RETLW B'11011010' ;'5'
; RETLW B'11111010' ;'6'
; RETLW B'00001110' ;'7'
; RETLW B'11111110' ;'8'
; RETLW B'11001110' ;'9'
; RETLW B'11101110' ;'A'
; RETLW B'11111000' ;'B'
; RETLW B'01110010' ;'C'
; RETLW B'10111100' ;'D'
;=================
; CONFIG
;=================
INICIO
Banksel PORTA
CLRF PORTA
CLRF PORTB
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISB;ENTRADAS Y SALIDAS
CLRF PORTB
CLRF PORTC
CLRF PORTD
; CLRF PORTA
BSF BOTON
BANKSEL OPTION_REG
MOVLW b'11000111';OSC INTERNO, PREESCALER 1:256= 65.5 mS cada sobreflujo del TMR para que sean 10 segundos necesitamos que sea 153*65.5mS
MOVWF OPTION_REG
BANKSEL INTCON; HABILITACION DE LA INTERRUPCION DEL TMR0
BSF INTCON, T0IE
BSF INTCON, PEIE
BCF INTCON, GIE ;AUN NO ENCENDEMOS LA INTERRUPCION
BANKSEL PORTA
CLRF TIEMPO
CLRF BANDERA_TMP
;========================
; PROGRAMA PRINCIPAL
;=======================
RESETEO:;AQUI VA A REGRESAR CADA VEZ QUE PASEN LOS 10 SEGUNDOS
BCF INTCON, GIE
CLRF TIEMPO
CLRF TIEMPO_M
CLRF BANDERA_TMP
CLRF UNIDADES
CLRF DECENAS
CLRF CENTENAS
; CLRF PORTA
MOVLW 0XFF
MOVWF PORTB
MOVWF PORTC
MOVWF PORTD
TESTEO_BOTON
;BTFSS BOTON
;GOTO TESTEO_BOTON
;BTFSC BOTON
;GOTO $-1; ESTA INSTRUCCION ES COMO UN GOTO A LA INSTRUCCION ANTERIOR -1
btfss PORTA,4 ;Prueba el bit b del registro f, Salta la siguiente instrucción si bit b es 1.
goto TESTEO_BOTON ;salta a la etiqueta
btfsc PORTA,4
goto $-1
call RET_1s ;salta a una subrutina indicada
MOVLW 0X00 ;PARA ASEGURAR CEROS AL INICIO
CALL BIN2SEVEN_SEG
; MOVWF PORTA
MOVWF PORTB
MOVWF PORTC
MOVWF PORTD
INICIA_CUENTA:
INC_UNI:
MOVFW UNIDADES
XORLW .9
BTFSS STATUS,Z
GOTO INC_UNI2
CLRF UNIDADES
MOVF UNIDADES,W
CALL BIN2SEVEN_SEG
MOVWF PORTD
GOTO INC_DEC
INC_UNI2:
INCF UNIDADES, F
MOVFW UNIDADES
CALL BIN2SEVEN_SEG
MOVWF PORTD
GOTO FIN_CUENTA
;------------------------
INC_DEC:
MOVFW DECENAS
XORLW .9
BTFSS STATUS,Z
GOTO INC_DEC2
CLRF DECENAS
MOVF DECENAS,W
CALL BIN2SEVEN_SEG
MOVWF PORTC
GOTO INC_CENT
INC_DEC2:
INCF DECENAS, F
MOVFW DECENAS
CALL BIN2SEVEN_SEG
MOVWF PORTC
GOTO FIN_CUENTA
;------------------------
INC_CENT:
MOVFW CENTENAS
XORLW .9
BTFSS STATUS,Z
GOTO INC_CENT2
CLRF CENTENAS
MOVF CENTENAS,W
CALL BIN2SEVEN_SEG
MOVWF PORTB
GOTO INC_UNI
INC_CENT2:
INCF CENTENAS,F
MOVFW CENTENAS
CALL BIN2SEVEN_SEG
MOVWF PORTB
;--------------------------
FIN_CUENTA:
CLRF TMR0
BSF INTCON,GIE; EMPIEZA A CONTAR TMR0
ESPERA2:
BTFSC BANDERA_TMP,0
GOTO RESETEO
BTFSS BOTON
GOTO ESPERA2
BTFSC BOTON
GOTO $-1
CALL RET_1s
BCF INTCON, GIE
CLRF TIEMPO
CLRF TIEMPO_M
CLRF BANDERA_TMP
GOTO INICIA_CUENTA
RET_1s
movlw .125
movwf v1
movlw .250
movwf v2
movlw .3
movwf v3
c1
decfsz v1,F
goto c1
decfsz v2,F
goto c1
decfsz v3,F ;espera para el sguiente salto
goto c1
return
END