Many times, we plan and build systems that perform various processes that depend on time.
Simple example of this process is the digital wristwatch. The role of this electronic system is to display time in a very precise manner and change the display every second (for seconds), every minute (for minutes) and so on.
To perform the steps we've listed, the system must use a timer, which needs to be very accurate in order to take necessary actions.The clock is actually a core of any electronic system.
In this PIC timer module tutorial we will study the existing PIC timer modules. The microcontroller PIC16F877 has 3 different timers:
We can use these timers for various important purposes. So far we used “delay procedure” to implement some delay in the program, that was counting up to a specific value, before the program could be continued. "Delay procedure" had two disadvantages:
Now, using Timers we can build a very precise time delays which will be based on the system clock and allow us to achieve our desired time delay well-known in advance.
In order for us to know how to work with these timers, we need to learn some things about each one of them. We will study each one separately.
The Timer1 module, timer/counter, has the following features:
Let’s explain the features of PIC Timer1 we have listed above:
Timer1 has a register called TMR1 register, which is 16 bits of size.
Actually, the TMR1 consists of two 8-bits registers:
TMR1IF – TMR1 overflow Interrupt Flag bit.
This flag marks the end of ONE cycle count. The flag need to be reset in the software if you want to do another cycle count. We can read the value of the register TMR1 and write into. We can reset its value at any given moment (write) or we can check if there is a certain numeric value that we need (read).
Prescaler – Frequency divider.
We can use Prescaler for further division of the system clock. The size of the register is 2-bit only, so you can make four different division. The options are:
You can choose whether to use an internal system clock (crystal) or external oscillator that can be connected to a pin RC0.
We perform all the necessary settings with T1CON register. As we can see, the size of the register is 8 bits. Let’s explore the relevant bits:
The following is an example how we can initialize the T1CON register:
Or you can set all the T1CON register at once as follows:
PIC TIMER1 block diagram
If using INTERNAL crystal as clock, the division is performed as follow:
PIC TIMER1 formula for internal clock
Fout– The output frequency after the division.
Tout – The Cycle Time after the division.
4 - The division of the original clock (4 MHz) by 4, when using internal crystal as clock (and not external oscillator).
Count - A numeric value to be placed to obtain the desired output frequency - Fout.
(256 - TMR1) - The number of times in the timer will count based on the register TMR0.
If using EXTERNAL clock source (oscillator), the division is performed as follow:
PIC TIMER1 formula for external clock
Suppose we want to create a delay of 2 second in the our program using Timer1. What is the value of Count?
First, let’s assume that the frequency division by the Prescaler will be 1:1. Second, let’s set TMR1=0, which means the TMR1 will count 65,536 times. Thus:
Formula to calculate Cout for Timer1
The following simple program creates a delay of 1 sec using TIMER1:
int Count = 0;
void main (void)
T1CON = 0b00000001;
while (! TMR1IF);
TMR1IF = 0;
if (Count == 15)
Count = 0;
1 sec delay using Timer1