kel
Newbie level 4
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:
I appreciate your help.
Thank you.
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.