Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Eprom write problem using PIC16F676

Status
Not open for further replies.

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 :

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
 
I don't know why your write to EEPROM isn't working.

You problem with org 2100h is because you have code after the data. Move your org and data to the end of your file and it will work as expected. It is currently trying to assemble your Delay routine into EEPROM.

Mike.
 
Thanks for answering.

I have shifted ORG 2100H before 'END'. Now it is woking fine.

As for the eeprom write it is still not working. Is the charging in the 2200µF capacitor too less to complete the write routine ?? or is there any other way to accomplish the same ??

Please reply
 
Any schematic? maybe something like below would help?

2-gif.119
 
Try turning off brown out detect. It should give you a little more time. You could also try increasing the 2200 cap. I would expect 7 segment displays to discharge a cap pretty quickly. Do any of the locations get written?

Mike.
 
mathur2000, your circuit arrangement is not at its best.

I would have placed the 2,200uF or higher value capacitor before the 7805 and fitted just a 10uF at the 7805 +5V output. The un-filtered DC from the the bridge rectifier is connected to a 1N4001 diode first before going to the above 2,200uF capacitor. The diode serves to isolate the voltage from 2,200uF capacitor so that any DC failure can be detected early.

You than arrange to monitor the output of the bridge rectifier, or have it to generate an interrupt when the DC have been lost. Because you have got a 7805 in between 2,200uF and PIC, the total time available for you to save the content of the registers is much longer than having a 2,200uF capacitor at the +5V output because the +5V voltage does not start falling immediately.
 
This is the schematic.

Thank u all for ur suggestions. I will change the ckt and reply
 

Attachments

  • Scheme01.gif
    Scheme01.gif
    20.3 KB · Views: 462
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top