Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Pic16f87xx timer stack overflow

Status
Not open for further replies.

kel

Newbie level 4
Joined
May 21, 2006
Messages
7
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,321
Friends,
TMR1 is currently giving me issues. The timer is free running. My MCU clock frequency is 20MHz. As you would see in the code section, I'm simply reading the timer registers (TMR1H:TMR1L) and display the values on PORTB and PORTD. However, when I run the simulation in Proteus, I get the following erro:
[PIC16 CORE] PC=0x000E. Stack overflow executing CALL instruction.

Code:
        LIST      P=16F877A                   	;LIST DIRECTIVE TO DEFINE PROCESSPR
	INCLUDE   <p16F877A.inc>
        ERRORLEVEL -302,-207
   __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF &    _CPD_OFF & _WRT_OFF & _CP_OFF & _DEBUG_OFF

; TODO PLACE VARIABLE DEFINITIONS GO HERE
;******************************************************************
SERPORT_SHR_VARS   UDATA       0X20                  ;PIC16F877A DOESN'T LIKE UDATA_SHR!!!!
W_TEMP           RES           1
S_TEMP            RES           1
P_TEMP            RES           1
USTEMPH	      RES	      1
USTEMPL	      RES	      1

;RESET VECTORS
;******************************************************************
RES_VECT     CODE     0x0000                  ;PROCESSOR RESET VECTOR
                  GOTO     PROGMAIN                ;GO TO BEGINNING PROGRAM

;INTERRUPT HANDLER AND SERVICING
;******************************************************************
INT_HANDLER ORG     0x0004                   ;INTERRUPT VECTOR LOCATION
                   MOVWF   W_TEMP                   ;YES, SAVE CONTEXT
		   MOVF	   STATUS,W
                   MOVWF   S_TEMP                   ;SAVE STATUS IN STATUS TEMPT REGISTER
		   MOVF	   PCLATH,W
		   MOVWF   P_TEMP
                   BANKSEL PIR1
		   BTFSS   PIR1,TMR1IF                ;IS RX INTERRUPT OCCURS?
                   GOTO    INT_RESTOR_CONTX     ;NO, GOTO INTERRUPT EXIT
                   CALL    TMR1_HANDLER             ;CALL USER RECEIVE SUBROUTINE
INT_RESTOR_CONTX   
                   MOVF	   P_TEMP,W
		   MOVWF   PCLATH
		   MOVF    S_TEMP,W                 ;RESTORE CONTEXT
                   MOVWF   STATUS                   ;RESTORE STATUS
                   SWAPF   W_TEMP,F
                   SWAPF   W_TEMP,W                 ;RESTORE
INT_EXIT	   BCF	   PIR1,TMR1IF         ;CLEAR FLAG
	           RETFIE                                 ;RETURN FROM INTERRUPT SUBROUTINE

; MAIN PROGRAM
;*******************************************************************************
MAIN_PROG CODE						    ;LET LINKER REPLACE MAIN PROGRAM
PROGMAIN
 	    CALL      PORTSETUP				    ;SET UP PORTB AND PORTD AS OUTPUT
	    CALL      TMR1SETUP				    ;SET UP TIMER1
	    BSF	      T1CON,TMR1ON			    ;TIMER1 IS NOW ON AND COUNTING
	    BANKSEL   PIE1				    ;BANK1
	    BSF	      PIE1,TMR1IE			    ;TIMER1 INTERRUPT IS ON
	    BANKSEL   INTCON
	    BSF	      INTCON,PEIE			    ;ENABLE PERIPHERAL INTERRUPT IN INTCON<PEIE>	    
	    BSF	      INTCON,GIE			    ;ALL INTERRUPTS ARE ON
	    BANKSEL   PORTB
	    CLRF      PORTB
	    CLRF      PORTD
FOREVER     
            NOP
	    NOP
            GOTO      FOREVER

; TMR1SETUP FUNCTION: INITIALIZES TIMER 1 AND ALL ASSOCIATED INTERRUPTS
;*******************************************************************************

TMR1SETUP   CLRF      T1CON				    ;CLEAR TIMER1		  
	    CLRF      TMR1H				    ;CLEAR TIMER1 HIGH REGISTER
	    CLRF      TMR1L				    ;CLEAR TIMER1 LOW REGISTER
	    CLRF      PIR1				    ;CLEAR PERIPHERAL INTERRUPT REGISTER  
	    CLRF      INTCON				    ;CLEAR INTERRUPT CONTROLL REGISTERS
	    CLRF      USTEMPH
	    CLRF      USTEMPL
	    BANKSEL   PIE1				    ;BANK1
	    CLRF      PIE1				    ;CLEAR PERIPHERAL INTERRUPT ENABLE REGISTER	   
	    
	    BANKSEL   T1CON				    ;BANK 0
	    MOVLW     ((B'110000')|(0<<T1OSCEN)|(0<<T1SYNC)|(0<<TMR1CS))
	    MOVWF     T1CON				    ;SET T1OSCEN & TMR1CS, CLEAR 
                                                                    ;T1SYNC BIT,SELECT PRESCALLER IS 
                                                                    ; 1:8 & CLOCK SOURCE
	    RETURN     		   

; PORTSETUP FUNCTION: INITIALIZES PROGRAM PORTS
;*******************************************************************************
 PORTSETUP  
            CLRF     PORTB
	    CLRF     PORTD
	    BANKSEL  TRISB				    ;BANK1
	    CLRW
	    MOVWF    TRISB				    ;ALL PORTB PINS ARE OUTPUT
	    MOVWF    TRISD				    ;ALL PORTD PINS ARE OUTPUT
	    BANKSEL  PORTB				    ;BANK0
	    BSF	     PORTB,RB0
	    BSF	     PORTD,RD7
	    RETURN   
	    
; TMR1 INTERRUPT HANDLER FUNCTION: SERVICES INTERRUPT
;******************************************************************
TMR1_HANDLER
	    BANKSEL  T1CON
	    BCF	  T1CON,TMR1ON
	    BCF	  INTCON,GIE		           ;TURN OFF ALL INTERRUPTS
	    MOVF      TMR1H,W				    ;READ TIMER1 HIGH REG
	    MOVWF    USTEMPH				   ;SAVE IN USER TEMP HIGH REGER	    
	    MOVF      TMR1L,W				    ;READ TIMER1 HIGH REG
	    MOVWF    USTEMPL				    ;SAVE IN USER TEMP LOW REGER
	    
	    MOVF     TMR1H,W				    ;CHECK IF TIMER1 LOW REGISTER 
	    SUBWF    USTEMPH,W				    ;HAS OVERFLOW DURING READ
	    BTFSC     STATUS,Z				    ;HAS IT OVERFLOWN?
	    GOTO     TMRCONTNUE				    ;NO, CONTINUE
	    
	    MOVF     TMR1H,W	;READ HIGH BYTE							    
	    MOVWF    USTEMPH				    ;
	    MOVF     TMR1L,W				    ;READ TIMER1 LOW REG
	    MOVWF    USTEMPL				    ;
TMRCONTNUE  
            MOVF     USTEMPL,W
	    MOVWF    PORTB
	    MOVF     USTEMPH,W
	    MOVWF    PORTD	
	    BSF	  T1CON,TMR1ON
	    BSF	  INTCON,GIE				    ;TURN ON ALL INTERRUPTS
	    RETURN
	    
	    END  				   
; END OF PROGRAM CODE
;*****************************************************************

I appreciate your help.

Thank you.
 

mistakes in the using of call and return instruction causes this problem. If you failed to return from the called subroutine properly,this problem will occur. check your code ,especially the interrupt subroutine , there you have also used one call instruction. in the ISR , after reading the interrupt flag immediately clear the GIE bit ,this will prevent the triggering of more interrupt before processing the current. If more interrupts triggered while processing one will lead to stack overflow. Good luck.....
 

Thanks, MUKESH.K.S.

I've placed "return' opcode on every single modules/functions. So that might not be the problem.

The INTCON<GIE> is cleared within the module being called by the interrupt.

I think I will have to move to the interrupt as per your suggestion and see if that fixes the problem.

Code:
TMR1_HANDLER
	    BANKSEL  T1CON
	    BCF	  T1CON,TMR1ON
	    BCF	  INTCON,GIE		           ;TURN OFF ALL INTERRUPTS
	    MOVF      TMR1H,W				    ;READ TIMER1 HIGH REG
	    MOVWF    USTEMPH				   ;SAVE IN USER TEMP HIGH REGER	    
	    MOVF      TMR1L,W				    ;READ TIMER1 HIGH REG
	    MOVWF    USTEMPL				    ;SAVE IN USER TEMP LOW REGER
	    
	    MOVF     TMR1H,W				    ;CHECK IF TIMER1 LOW REGISTER 
	    SUBWF    USTEMPH,W				    ;HAS OVERFLOW DURING READ
	    BTFSC     STATUS,Z				    ;HAS IT OVERFLOWN?
	    GOTO     TMRCONTNUE				    ;NO, CONTINUE
	    
	    MOVF     TMR1H,W	;READ HIGH BYTE							    
	    MOVWF    USTEMPH				    ;
	    MOVF     TMR1L,W				    ;READ TIMER1 LOW REG
	    MOVWF    USTEMPL				    ;
TMRCONTNUE  
            MOVF     USTEMPL,W
	    MOVWF    PORTB
	    MOVF     USTEMPH,W
	    MOVWF    PORTD	
	    BSF	  T1CON,TMR1ON
	    BSF	  INTCON,GIE				    ;TURN ON ALL INTERRUPTS
	    RETURN	   
;*****************************************************************
Thanks for your time.
 

You have not cleared tmr1 interrupt flag so the interupt handler is called continously, produced stack overflow

Code:
	    BCF		INTCON,TMR1IF

You do not need to clear/set GIE and TMR1ON uppon interrupt handler in/out.

eg.
Code:
TMR1_HANDLER
;	    BANKSEL  T1CON
;	    BCF	  T1CON,TMR1ON
;	    BCF	  INTCON,GIE		           ;TURN OFF ALL INTERRUPTS
	    
	    BANKSEL	INTCON
	    [SIZE=2][COLOR="#B22222"]BCF		INTCON,TMR1IF[/COLOR][/SIZE]
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top