Sorry for the poor explanation but I’m a little confused myself.

From the proton geeks site I’ve modified the code snippet “How to build a simple and stupid small timer routine” by Olivier de Broqueville to achieve basically what I’m after.

Code:
device = 16F876a  	   			  	  	   'PIC device
CMCON = 7 								   'disable comparators
ADCON1 = 7 								   'disable ADCs
TRISB = %11111111 						   'Portb as inputs
TRISA = %00000000 						   'Porta as outputs
porta = %00000000 						   'Set all outputs low


	ON_INTERRUPT Horloge

	DECLARE XTAL=4

	
	SYMBOL GIE  = INTCON.7	
	SYMBOL T0IF   = INTCON.2
	SYMBOL T0IE   = INTCON.5	
	SYMBOL PS0 = OPTION_REG.0
	SYMBOL PS1 = OPTION_REG.1
	SYMBOL PS2 = OPTION_REG.2
	SYMBOL PSA = OPTION_REG.3
	SYMBOL T0SE= OPTION_REG.4
	SYMBOL T0CS= OPTION_REG.5
	
	DIM mycounter as  WORD 	 ' This is the TIME variable used to count the interrupts
	DIM mycounter_limit as WORD   ' This is the limit to reach. Could have been a constant in the program
					   	  		 ' to win some place (you would win 6 words)

	DIM SECONDS as BYTE
	GIE=0

	GOTO INITIALISATION			 ' As always: place interrupt routine first and jump over...
' -----------------------------------------------------------------------------
' INTERRUPT ROUTINE
' -----------------------------------------------------------------------------
Horloge:
				INC mycounter	' Increment the time variable at every interrupt
				T0IF=0			' Clear the interrupt flag
				CONTEXT RESTORE


Initialisation:    
			   T0SE =0	 	   ' TIMER0 triggered by ascending edge
			   T0CS =0	 	   ' TIMER0 using internal clock
			   PSA  =0	 	   ' Prescaler assigned to TIMER0
			   PS0  =1	 	   ' Prescaler set at 1:256
			   PS1  =1
			   PS2  =1	

			   mycounter_limit= 10 
			   mycounter=0   	
			   SECONDS=0
			   
			   TMR0=0	 ' Reset TIMER0
			   T0IE=1	 ' Autorisation of TIMER0 interrupt
			   GIE=1	 ' Autorisation of all interrupts
			    
MAIN:
 	 		   WHILE 1=1   		 		   	   			 ' Do this forever
			   IF mycounter > mycounter_limit Then		 ' Are we above the TIME factor?
			   	  			  				   			 ' As the test is ABOVE the clock runs a bit
														 ' slow, which was the purpose
			   	     mycounter=0						 ' Reset the 'interrupt' counter
			   	     SECONDS=SECONDS+1					 ' Increment the seconds
					 IF SECONDS > 59 THEN				 ' If 59 sec, 
						SECONDS=0						 ' and RESET seconds
					 ENDIF	
 

				  
			   ENDIF
			   
			   
			   if SECONDS > 5 then
			   porta =%00000001
			   
			   else
			    porta =%00000100
				'Stop for 5 sec and
				'check PIR
				end if
			   WEND	 	   	  		   		   				' And do it forever


	 

END
But I don’t really understand how it works as I managed to get approximately the required time by setting “mycounter_limit= 10” (trail and error).

He gives an explanation here : linky
but as I’m using 4mHz OSC the values are different. Can anyone help explain whats happening in the code as I never like to use something with out fully understanding it.


Thanks

Jim