Line 118: Line 118:
 
$$Delay =  (Count * Prescalar) / (20Mhz/4)$$
 
$$Delay =  (Count * Prescalar) / (20Mhz/4)$$
 
$$Delay =  ((Count * Prescalar) / 5)  usec$$
 
$$Delay =  ((Count * Prescalar) / 5)  usec$$
 
 
$$Count =  ((5 * Delay)/ Presaclar) usec$$   
 
$$Count =  ((5 * Delay)/ Presaclar) usec$$   
$$Count =  ((5 * Delay)/ Presaclar)-1 usec$$
+
$$Count =  (((5 * Delay)/ Presaclar)-1) usec$$
  
 
=TImer Reg=
 
=TImer Reg=

Revision as of 16:23, 6 May 2016

In this tutorial we are going to discuss the Timer module of Pic16f877a.
First we will see what are timers, their working and later we will configure the PIC16f877a timers to generate delay of 100ms and 500ms respectively. At the end we will see how to use the ExploreEmdedded Timer library.

Timer Basics

As the name suggests these are used to measure the time or generate the accurate time delay. The microcontroller can also generate/measure the required time delays by running loops, but the timer/counter peripheral relieves the CPU from that redundant and repetitive task, allowing it to allocate maximum processing time for other tasks.

Timer is nothing but a simple binary counter that can be configured to count clock pulses(Internal/External). Once it reaches the Max value, it will roll back to zero setting up an OverFlow flag and generates the interrupt if enabled.

Timer.gif

PIC Timer Module

Pic16f877a has three indepenndent timer which can be used as timer,Counters or for PWM generation.
Below table provides the details of the three Timers.

Timer Size Control Register Count Register Min Delay Max Delay
TIMER0 8-bit T0CON TMR0 0 0
TIMER1 16-bit T1CON TMR1H,TMR1L 0 0
TIMER2 8-bit T2CON TMR2 0 0



Timer 0

The timer TMR0 module is an 8-bit timer/counter with the following features:

  • 8-bit timer/counter
  • Readable and writable
  • 8-bit software programmable prescaler
  • Internal or external clock select
  • Interrupt on overflow from FFh to 00h
  • Edge select for external clock

Timer0 Registers

The below table shows the registers associated with PIC16f877A Timer0 module.

Register Description
OPTION_REG This registers is used to configure the TIMER0 Prescalar, Clock Source etc
TMR0 This register holds the timer count value which will be incremented depending on prescalar configuration
INTCON This register contains the Timer0 overflow flag(TMR0IF) and corresponding Inetrrupt Enable flag(TMR0IE).

OPTION_REG
7 6 5 4 3 2 1 0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

RBPU: NA for Timers

INTEDG: NA for Timers

T0CS: TMR0 Clock Source Select bit
1-Transition on T0CKI pin
0-Internal instruction cycle clock (CLKO)

T0SE: TMR0 Source Edge Select bit
1-Increment on high-to-low transition on T0CKI pin
0-Increment on low-to-high transition on T0CKI pin

PSA: Prescaler Assignment bit
1-Prescaler is assigned to the WDT
0-Prescaler is assigned to the Timer0

PS2:PS0: Prescaler Rate Select bits Timer0Prescalar.png

  • Note:There is only one prescaler available which is mutually exclusively shared between the Timer0 module and the Watchdog Timer. A prescaler assignment for the Timer0 module means that there is no prescaler for the Watchdog Timer and vice versa. This prescaler is not accessible but can be configured using PS2:PS0 bits of OPTION_REG.



INTCON
7 6 5 4 3 2 1 0
GIE PIE TMR0IE INTE RBIE TMR0IF INTF RBIF

GIE: Global Interrupt Enable bit
1-Enables all unmasked interrupts
0-Disables all interrupts

PIE: Peripheral Interrupt Enable bit
1-Enables all unmasked peripheral interrupts
0-Disables all peripheral interrupts

TMR0IE: TMR0 Overflow Interrupt Enable bit
1-Enables the TMR0 interrupt
0-Disables the TMR0 interrupt

INTE: NA for Timers

RBIE: NA for Timers

TMR0IF: TMR0 Overflow Interrupt Flag bit
1-TMR0 register has overflowed (must be cleared in software)
0-TMR0 register did not overflow

INTF: NA for Timers

RBIF: NA for Timers
Timer0 Block Diagram.png

Timer0 Calculation

$$Delay = (Count * Prescalar) / (FOSC/4)$$ $$Delay = (Count * Prescalar) / (20Mhz/4)$$ $$Delay = ((Count * Prescalar) / 5) usec$$ $$Count = ((5 * Delay)/ Presaclar) usec$$ $$Count = (((5 * Delay)/ Presaclar)-1) usec$$

TImer Reg

00 Lpc1768 Timer.jpg