Blink without delay using PIC16F877A and CCS C
Related topics:PIC16F877A Timer0 module and interrupt
PIC16F877A Timer2 module and interrupt
The Timer1 module is a 16-bit timer/counter consisting of two 8-bit registers (TMR1H and TMR1L) which are readable and writable. The TMR1 register pair (TMR1H:TMR1L) increments from 0000h to FFFFh and rolls over to 0000h.
PIC16F877A Timer1 interrupt:
The TMR1 interrupt, if enabled, is generated on overflow which is latched in interrupt flag bit, TMR1IF (PIR1<0>). This interrupt can be enabled/disabled by setting/clearing TMR1 interrupt enable bit, TMR1IE (PIE1<0>).
PIC16F877A Timer1 prescaler rate:
Prescaler rate of the timer1 can be: 1, 2, 4 or 8.
The following equation computes timer1 frequency:
Timer1_freq = MCU_freq / {4 * Prescaler * (65536 - TMR1)}
Where TMR1 is preload value. And Timer1 overflow time = 1/Timer1_freq
PIC16F877A Timer1 interrupt example:
This is a simple example which uses timer1 interrupt to make an LED connected to RB0 blinking at a frequency of 1Hz.
PIC16F877A Timer1 interrupt example CCS PIC C code:
The timer is used to interrupt every 500ms and to make the LED ON for 500ms and OFF for 500ms. HS oscillator used with frequency of 4MHz.
// PIC16F877A Timer1 interrupt
// Timer1 is used to interrupt every 500ms
// http://ccspicc.blogspot.com/
// electronnote@gmail.com
#include <16F877A.h>
#use delay(crystal=4000000)
#INT_TIMER1
void timer1_isr(void)
{
clear_interrupt(INT_TIMER1);
set_timer1(3036);
output_toggle(PIN_B0);
}
void main()
{
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); // Internal clock and prescaler 8
set_timer1(3036); // Preload value
clear_interrupt(INT_TIMER1); // Clear Timer1 interrupt flag bit
enable_interrupts(INT_TIMER1); // Enable Timer1 interrupt
enable_interrupts(GLOBAL);
output_low(PIN_B0);
while(TRUE) ; // Endless loop
}
Reference:
PIC16F877A datasheet from Microchip