+ Reply to Thread
Results 1 to 10 of 10

Thread: Eprom write problem using PIC16F676

  1. #1
    mathur2000 Newbie
    Join Date
    Feb 2007
    Posts
    11

    Default Eprom write problem using PIC16F676

    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


  2. #2
    Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent
    Join Date
    Mar 2005
    Location
    Brisbane Australia
    Posts
    6,806

    Default

    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.

  3. #3
    mathur2000 Newbie
    Join Date
    Feb 2007
    Posts
    11

    Default

    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

  4. #4
    mister_e Newbie
    Join Date
    Jul 2006
    Location
    Montreal, Canada
    Posts
    331

    Default

    Any schematic? maybe something like below would help?

    Steve

  5. #5
    Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent Pommie Excellent
    Join Date
    Mar 2005
    Location
    Brisbane Australia
    Posts
    6,806

    Default

    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.

  6. #6
    eblc1388 Excellent eblc1388 Excellent eblc1388 Excellent eblc1388 Excellent eblc1388 Excellent
    Join Date
    Jan 2005
    Location
    UK
    Posts
    2,226

    Default

    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.
    L.Chung

  7. #7
    mathur2000 Newbie
    Join Date
    Feb 2007
    Posts
    11

    Default

    This is the schematic.

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

  8. #8
    mathur2000 Newbie
    Join Date
    Feb 2007
    Posts
    11

    Default

    elbc could u please elaborate. Pl suggest the schematic for the same.

  9. #9
    eblc1388 Excellent eblc1388 Excellent eblc1388 Excellent eblc1388 Excellent eblc1388 Excellent
    Join Date
    Jan 2005
    Location
    UK
    Posts
    2,226

    Default

    See modified circuit.
    Attached Images
    L.Chung

  10. #10
    mathur2000 Newbie
    Join Date
    Feb 2007
    Posts
    11

    Default

    Thanks I will try & revert back

+ Reply to Thread

Similar Threads

  1. Simple EPROM Programmer
    By FastEddie in forum Electronic Projects Design/Ideas/Reviews
    Replies: 0
    Latest: 4th October 2006, 08:04 PM
  2. Problem Writing into EEPROM of PIC16f690
    By Ken Ho in forum Micro Controllers
    Replies: 11
    Latest: 17th August 2006, 04:55 AM
  3. Mysterious Problem!
    By matasoft in forum Micro Controllers
    Replies: 15
    Latest: 11th September 2004, 07:50 PM
  4. wierd problem with lcd
    By jijita in forum General Electronics Chat
    Replies: 0
    Latest: 29th August 2004, 08:02 PM
  5. code problem with lcd wg128 64b
    By jijita in forum Micro Controllers
    Replies: 0
    Latest: 23rd August 2004, 07:44 PM

Tags for this Thread