Introduction: PIC Micro Timer Code

About: www.leevonk.com

Here's the minimal code to make timer 1 (a 16 bit timer) work using PICBasic.

General descriptions of PIC timer variables used to control the timer: (you should be able to use these no matter what programming language you use):

T1CON.0 is the first bit of the timer configuration byte, this bit is used to start and stop the timer.
--so--
T1CON.0=1, starts the timer
T1CON.0=0, stops the timer

TMR1H is the timer value's high byte (bits 8-15)
TMR1L is the timer value's low byte (bits 0-7)
--so--
TMR1H = 0 'resets the timer value's high byte
TMR1L = 0 'resets the timer value's low byte
--and--
MyTime.Lowbyte = TMR1L 'puts the timer's low byte in MyTime's lower 8 bits
MyTime.Highbyte = TMR1H 'puts the timer's high byte in MyTime's upper 8 bits

NOTE:
the MyTime should be declared as a word, not a byte since it has to be 16 bits long to hold the whole 16 bit timer1 value

NOTE:
When writing to or reading from the timer, it is very important in which order it is done. When reading the timer values you have to read first the LOW then the HIGH byte. When writing the timer values write first the HIGH then the LOW, this is due to complications in how the timer works.

NOTE:
when I say 'timer value' I mean a number representing the amount of time since the timer was started. To convert between real time and timer1 value units, there seems to be a 5:1 ration between timer1 units and microseconds (5000 timer1 units = 1000 microsecond = 1 millisecond)

Step 1: The Code

'this code is an infinite loop.
'It will run through MamaLoop, then it will stop and
'wait until a specified amount of time (SomeNumber)
'has passed since the start of MamaLoop before continuing
'to FinishLoop.

'####################################################
SomeNumber var word
SomeNumber = 4500

MyTime var word

'====================================
MamaLoop:

T1CON.0=0 'stop the timer
TMR1H = 0 'Set the high part of the timer value to 0
TMR1L = 0 'Set the low part of the timer value to 0
T1CON.0=1 'start the timer

'do whatever you want in the loop
'....blah if, then, blahblah
'....blah if, then, blahblah
'....blah

'-----
'the EndLoopDelay will wait until a specified amount of time has passed
'since the start of the MamaLoop (when the timer value was set to 0)
EndLoopDelay:

CLEARWDT 'clear the watchdog timer (so PIC doesn't reset)

MyTime.Highbyte=TMR1H 'get part of the timer value
MyTime.Lowbyte=TMR1L 'get the rest of the timer value

IF MyTime > SomeNumber THEN 'if the timer value > than your number
GOTO FinishLoop
else
GOTO EndLoopDelay
endif
'-----
'====================================

FinishLoop:
'do something at the end of the loop
'then go back to restart the MamaLoop
GOTO MamaLoop

'####################################################