mathur2000
New Member
I have made a circuit which counts internal pulses and displays the same on 7 segment displays. I have used CD4511 BCD to 7 seg. decoder on RC0 to RC 3 & used RC4 to RC7 to drive the segments.
I want to save the content of 3 registers only when the power supply drops to a certain level or when the power fails. For this I have used 10 µF capacitor on the bridge rectifier on the power supply and 2200 µF capacitor after 7805 in VCC. I have taken a signal from the bridge rectifier which is connected to the base of a transistor (BC547) which grounds the RB0/INT pin. This I thought would give me an Interrrupt for arount 50 ms which would be suuffiecient for the interrupt routine to complete the eeprom write routine which the interrupt calls
I have written the following code :
I am also having an another problem. When I write ORG 2100H and DE 0x0ff, 0x0ff, 0x0ff, The compiler gives an erroor that maximum permissible address is 0x3FF.
Please help
I want to save the content of 3 registers only when the power supply drops to a certain level or when the power fails. For this I have used 10 µF capacitor on the bridge rectifier on the power supply and 2200 µF capacitor after 7805 in VCC. I have taken a signal from the bridge rectifier which is connected to the base of a transistor (BC547) which grounds the RB0/INT pin. This I thought would give me an Interrrupt for arount 50 ms which would be suuffiecient for the interrupt routine to complete the eeprom write routine which the interrupt calls
I have written the following code :
Code:
;****************************************************************************************** ;
; 6 DIGIT COUNTER ;
; ;
;****************************************************************************************** ;
LIST P=16F676 ; DEFINE PROCESSOR
#INCLUDE <P16F676.INC> ; INCLUDE PROCESSOR DEFINATIONS
__CONFIG _CP & _CPD & _BODEN & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT
ERRORLEVEL -302 ; SUPRESS MESSAGES
#DEFINE DGT_ONES PORTC,4
#DEFINE DGT_TENS PORTC,5
#DEFINE DGT_HS PORTA,4
CBLOCK 0X30
ONES, TENS, MSEC, HS, THS
TMP_W, TMP_STS, C1, C2, C3
ENDC
;****************************************************************************************** ;
ORG 0X00
GOTO INIT
;****************************************************************************************** ;
; INTERRUPT HANDLING ROUTINE ;
;****************************************************************************************** ;
ORG 0X04
INTP MOVWF TMP_W ; SAVE VALUE OF W IN TMP_W FILE
SWAPF STATUS,W ; & VALUE OF STATUS REGISTER
MOVWF TMP_STS ; TMP_STS FILE
BTFSC INTCON,INTF
CALL SAVE
BCF INTCON,INTF
;****************************************************************************************** ;
SIT1 BCF INTCON,2 ; IF YES, CLEAR INTERRUPT FLAG
MOVLW .6 ; ADD 6 TO TMR0 REGISTER FOR EXACT
ADDWF TMR0, F ; 4000 µS PULSE (16 X 250 µS)
INCF MSEC, F
MOVLW .25 ; 4 MS X 250 = 1 SEC WAS 250
SUBWF MSEC,W ;
BTFSS STATUS,Z ; CHECK 0 STATUS
GOTO EXIT ; IF NOT 0, EXIT FROM INTERRUPT
CLRF MSEC
INCF ONES,F ; INCREASE ONES
MOVLW .10 ; CHECK IF IT HAS REACHED 10
SUBWF ONES,W ; OR NOT
BTFSS STATUS,Z ; CHECK 0 STATUS
GOTO EXIT ; IF NOT 0, EXIT FROM INTERRUPT
CLRF ONES ; CLEAR ONES
INCF TENS,F ; INCREASE TENS
MOVLW .10 ; CHECK IF IT HAS REACHED 10
SUBWF TENS,W ; OR NOT
BTFSS STATUS,Z ; CHECK 0 STATUS
GOTO EXIT ; IF NOT 0, EXIT FROM INTERRUPT
CLRF TENS ; CLEAR TENS
INCF HS,F ; INCREASE HS
MOVLW .10 ; CHECK IF IT HAS REACHED 10
SUBWF HS,W ; OR NOT
BTFSS STATUS,Z ; CHECK 0 STATUS
GOTO EXIT ; IF NOT 0, EXIT FROM INTERRUPT
CLRF HS ; CLEAR HS
EXIT
BCF INTCON,2
BSF INTCON,7
SWAPF TMP_STS,W ; MOVE BACK ORIGINAL VALUES OF W &
MOVWF STATUS ; STATUS TO W & STATUS REGISTERS
MOVF TMP_W,W ;
RETFIE ; & RETURN FROM INTERRUPT
;****************************************************************************************** ;
; OSCILLATOR CALIBRATION ;
;****************************************************************************************** ;
CALL 0X3FF ; RETRIEVE FACTORY CALIBRATION VALUE
BANKSEL OSCCAL ; SET FILE REGISTER BANK TO 1
MOVWF OSCCAL ; UPDATE REGISTER WITH FACTORY CAL VALUE
BANKSEL PORTA ; SET FILE REGISTER BANK TO 0
;****************************************************************************************** ;
; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE ;
;****************************************************************************************** ;
; AFBEDCGDP
TABLE ADDWF PCL,F ; ADD PROGRAM COUNTER TO ITSELF
RETLW B'110000' ; SEGMENT OUTPUTS FOR 0
RETLW B'110001' ; SEGMENT OUTPUTS FOR 1
RETLW B'110010' ; SEGMENT OUTPUTS FOR 2
RETLW B'110011' ; SEGMENT OUTPUTS FOR 3
RETLW B'110100' ; SEGMENT OUTPUTS FOR 4
RETLW B'110101' ; SEGMENT OUTPUTS FOR 5
RETLW B'110110' ; SEGMENT OUTPUTS FOR 6
RETLW B'110111' ; SEGMENT OUTPUTS FOR 7
RETLW B'111000' ; SEGMENT OUTPUTS FOR 8
RETLW B'111001' ; SEGMENT OUTPUTS FOR 9
RETLW 0 ; JUST IN CASE
;****************************************************************************************** ;
; DISPLAY DRIVING ROUTINE ;
;****************************************************************************************** ;
OVER
;CHECK
; BTFSC PORTA,3
; CALL SAVE
BSF PORTC,0
BSF PORTC,1
BSF PORTC,2
BSF PORTC,3
MOVF ONES,W ; MOVE THE VALUE OF MSD IN W
CALL TABLE ; OTHERWISE, DISPLAY SEVEN SEGMENT VALUE
ANDWF PORTC,F ; IN DISPLAYS THROUGH PORTB
BCF DGT_ONES
CALL DELAY ; FOR 0.0005 SECONDS
BSF DGT_ONES
BSF PORTC,0
BSF PORTC,1
BSF PORTC,2
BSF PORTC,3
MOVF TENS,W ; MOVE VALUE OF LSD IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
ANDWF PORTC,F ; IN DISPLAYS THROUGH PORTB
BCF DGT_TENS
CALL DELAY ; FOR 0.0005 SECONDS
BSF DGT_TENS
BSF PORTC,0
BSF PORTC,1
BSF PORTC,2
BSF PORTC,3
MOVF HS,W ; MOVE VALUE OF LSD IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
ANDWF PORTC,F ; IN DISPLAYS THROUGH PORTB
BCF DGT_HS
CALL DELAY ; FOR 0.0005 SECONDS
BSF DGT_HS
; MOVF THS,W ; MOVE VALUE OF LSD IN W
; CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
; MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
;
; BSF DGT_THS
; CALL DELAY ; FOR 0.0005 SECONDS
; BCF DGT_THS
GOTO OVER
;****************************************************************************************** ;
; INITIALIZATION ROUTINE ;
;****************************************************************************************** ;
INIT
MOVLW B'000000' ; STATUS OF PORTA
MOVWF PORTC ;
MOVLW B'000000' ; STATUS OF PORTC
MOVWF PORTA ;
BANKSEL ANSEL ;
MOVLW B'001100' ; ALL OUTPUTS
MOVWF TRISA
CLRF ANSEL ; TO DIGITAL IO'S
CLRF TRISC ; ALL OUTPUTS
BANKSEL PORTC
BANKSEL CMCON
MOVLW B'000111' ; ALL OUTPUTS
MOVWF CMCON
BANKSEL PORTA
; BANKSEL TRISA ; SWITCH TO BANK1
; MOVLW B'000001' ; STATUS OF PORTA
; MOVWF TRISA ;
; CLRF TRISC ; ALL OUTPUTS
; BANKSEL PORTA ; SWITCH BACK TO BANK0
;****************************************************************************************** ;
; ROUTINE FOR CLEARING ALL RAM LOCATIONS ;
;****************************************************************************************** ;
CLR MOVLW 30H ; MOVE A VALUE OF 20
MOVWF FSR ; IN FILE SELECT REGISTER
CLR_RAM CLRF INDF ; CLEAR INDIRECT FILE
INCF FSR,F ; INCREASE FSR
MOVLW 40H ;
SUBWF FSR,W ; TILL 80H LOCATION
BTFSS STATUS,Z ; IF YES, JUMP TO NEXT COMMAND
GOTO CLR_RAM ; IF NOT, DO UNTILL DONE.
;****************************************************************************************** ;
; SETTING UP PRESCALER OF INTERRUPT PULSE COUNTER ;
;****************************************************************************************** ;
; CALL WRITEZEROS
MOVLW B'111111'
MOVWF PORTC
;****************************************************************************************** ;
; BSF OPTION_REG,T0IE ;
; BANKSEL PORTA ;
BANKSEL OPTION_REG
MOVLW 03H ; SET PRESCALER TO 1:16
MOVWF OPTION_REG ;
BSF OPTION_REG,6
BANKSEL PORTA
MOVLW 06H ; (256-6) OVERFLOW EVERY 4 MS
MOVWF TMR0 ; 16 X 250 = 4000 µS
BSF INTCON,T0IE ; ENABLE RB0/INT
BSF INTCON,INTE ; ENABLE RB0/INT
BSF INTCON,7 ; ENABLE ALL INTERRUPTS
CALL READALL
GOTO OVER ; RUN
;****************************************************************************************** ;
; EEPROM ROUTINES ;
;****************************************************************************************** ;
READONES
BANKSEL EECON1
MOVLW 0
MOVWF EEADR
BSF EECON1,RD
MOVF EEDAT,W
BANKSEL PORTA
MOVWF ONES
RETURN
READTENS
BANKSEL EECON1
MOVLW 1
MOVWF EEADR
BSF EECON1,RD
MOVF EEDAT,W
BANKSEL PORTA
MOVWF TENS
RETURN
READHS
BANKSEL EECON1
MOVLW 2
MOVWF EEADR
BSF EECON1,RD
MOVF EEDAT,W
BANKSEL PORTA
MOVWF HS
RETURN
WRITEONES
BANKSEL EECON1
BSF EECON1,WREN
BANKSEL PORTA
MOVF ONES,W
BANKSEL EEDAT
MOVWF EEDAT
MOVLW 0
MOVWF EEADR
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRDONE1
BTFSC EECON1,WR
GOTO WRDONE1
BCF EECON1, WREN
BANKSEL PORTA
RETURN
WRITETENS
BANKSEL EECON1
BSF EECON1,WREN
BANKSEL PORTA
MOVF TENS,W
BANKSEL EEDAT
MOVWF EEDAT
MOVLW 1
MOVWF EEADR
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRDONE2
BTFSC EECON1,WR
GOTO WRDONE2
BCF EECON1, WREN
BANKSEL PORTA
RETURN
WRITEHS
BANKSEL EECON1
BSF EECON1,WREN
BANKSEL PORTA
MOVF HS,W
BANKSEL EEDAT
MOVWF EEDAT
MOVLW 2
MOVWF EEADR
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRDONE3
BTFSC EECON1,WR
GOTO WRDONE3
BCF EECON1, WREN
BANKSEL PORTA
RETURN
WRITEALL BCF PIR1,7
BCF INTCON,GIE
CALL WRITEONES
CALL WRITETENS
CALL WRITEHS
BCF PIR1,7
BSF INTCON,GIE
RETURN
READALL BCF PIR1,7
BCF INTCON,GIE
CALL READONES
CALL READTENS
CALL READHS
BCF PIR1,7
BSF INTCON,GIE
RETURN
WRITEZEROS
BANKSEL EECON1
BSF EECON1,WREN
MOVLW 0
MOVWF EEDAT
MOVLW 0
MOVWF EEADR
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRDONE4
BTFSC EECON1,WR
GOTO WRDONE4
BCF EECON1, WREN
BANKSEL EECON1
BSF EECON1,WREN
MOVLW 0
MOVWF EEDAT
MOVLW 1
MOVWF EEADR
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRDONE5
BTFSC EECON1,WR
GOTO WRDONE5
BCF EECON1, WREN
BANKSEL EECON1
BSF EECON1,WREN
MOVLW 0
MOVWF EEDAT
MOVLW 2
MOVWF EEADR
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRDONE6
BTFSC EECON1,WR
GOTO WRDONE6
BCF EECON1, WREN
BANKSEL PORTA
RETURN
;****************************************************************************************** ;
SAVE CALL WRITEALL
RETURN
;****************************************************************************************** ;
; ORG 2100H
; DE 0X0FF, 0X0FF, 0X0FF, 0X0FF, 0X0FF, 0X0FF, 0X0FF, 0X0FF
;****************************************************************************************** ;
; DELAY ROUTINES ;
;****************************************************************************************** ;
; 0.5 MILLISECOND DELAY ROUTINE ;
;****************************************************************************************** ;
DELAY MOVLW .60 ;
MOVWF C1 ;
MOVLW .6 ;
MOVWF C2 ;
LOOP DECFSZ C1,F ;
GOTO LOOP ;
DECFSZ C2,F ;
GOTO LOOP ;
NOP
NOP
RETURN
;****************************************************************************************** ;
END
I am also having an another problem. When I write ORG 2100H and DE 0x0ff, 0x0ff, 0x0ff, The compiler gives an erroor that maximum permissible address is 0x3FF.
Please help