;************TIMER0 INTERRUPT************ ; by: Eng'r Roland Michael A. dela Peņa * ;**************************************** ; This is a program to increment variables ROLAND0,ROLAND1,ROLAND2 using ; the TMR0 Interrupt. ; At every overflow count of TMR0, the variables are incremented ; ; ; For 8MHz crystal ; 8,000,000 cycles/sec = 4 cycles/t ; t = 4/8,000,000 sec ; t = 500 nsec ; pre-scaler => 1:2 | 1:4 | 1:8 | 1:16 | 1:32 | 1:64 | 1:128 | 1:256 ; If TIMER0 = 0 ; 256 counts to overflow and interrupt occurs ; 500 nsec x 256 counts = 128 usec (1) ; If pre-scaler is 1:256 ; 128 usec x 256 = 32.768 msec (2) ; max interrupt delay time is 32.768 msec ; ; If i want 10 msec ; determine the pre-scaler and value of TIMER0 ; let pre-scaler = 1:256 ; T x 256 = 10 msec (2) ; T = 39.0625 usec ; 500 nsec x C = 39.0625 usec (1) ; C = 78.125 or 78 counts ; therefore 1:256 @ 78 counts = 10 msec LIST P=16F84 ERRORLEVEL -302 #include p16f84.inc ;************************************************************ ; REGISTER DEFINITIONS ;************************************************************ CBLOCK 0CH ; VARIABLES ROLAND0 ROLAND1 ROLAND2 ENDC ;************************************************************************ ;THIS PART INITIALIZES THE PORTS AND OTHER PHERIPERALS IN MICROCONTROLLER ;************************************************************************ ORG 0000h ; SET POWER ON RESET VECTOR. CLRF PORTA CLRF PORTB GOTO INIT ORG 0004h ; SET INTERRUPT VECTOR. GOTO ISR ORG 0005h INIT CLRF ROLAND0 CLRF ROLAND1 CLRF ROLAND2 BSF STATUS,RP0 ; SET TO BANK = 1. BCF OPTION_REG,5 ; SET CLOCK SOURCE TO INTERNAL INSTRUCTION CYCLE CLOCK. BCF OPTION_REG,3 ; SET PRESCALER TO TMR0. BCF OPTION_REG,0 BCF OPTION_REG,1 BCF OPTION_REG,2 BCF OPTION_REG,7 ; ENABLE BUILT-IN PULL-UP RESISTORS. MOVLW h'FF' MOVWF TRISB ; SET PORTB TO ALL INPUT. MOVLW b'00000' MOVWF TRISA ; SET PORTA TO ALL OUTPUT. BCF STATUS,RP0 ; SET BANK = 0. ;************************************************************** ; ENABLING THE INTERRUPT AT TIMER0 ;************************************************************** MOVLW d'250' ; LOAD TIMER0 INTERVAL VALUE. MOVWF TMR0 ; SET TMR0 = F0h or 15 MORE COUNTS TO OVERFLOW. BSF INTCON,5 ; ENABLE TMR0. BSF INTCON,GIE ; TIMER0 IS NOW READY FOR INTERRUPT. ; TMR0 STARTS TO DECREMENT AFTER GIE = 1. MAIN ; reserved for program lines ; ; ; GOTO MAIN ;**************************************************************** ; THIS ROUTINE EXECUTES AFTER TIMER0 REACHES 256 COUNTS ;**************************************************************** ISR BCF INTCON,7 ; DISABLE GIE SO THAT NO INTERRUPT ALWAYS OCCUR. BCF INTCON,2 ; SET TIMER0 INTERRUPT TO DID NOT OCCUR. MOVLW d'250' ; RELOAD TIMER0 VALUE. MOVWF TMR0 INCF ROLAND0 INCF ROLAND1 INCF ROLAND2 RETFIE ; RETFIE RELOADS PC WITH THE SP AND AUTOMATICALLY ; ENABLE GIE. END