Frequently Asked Questions

How is the TIMER0 interrupt used to perform an event at some rate?

The following is generic code used to issue a quick pulse at a fixed rate:

#include <16Cxx.H>
#use Delay(clock=15000000) 
#define HIGH_START 114 
byte seconds, high_count;
#INT_RTCC

clock_isr() {
   if(--high_count==0) {
      output_high(PIN_B0);
      delay_us(5);
      output_low(PIN_B0); 
      high_count=HIGH_START; 
   } 
}

main() {
   high_count=HIGH_START;
   set_rtcc(0);
   setup_counters(RTCC_INTERNAL, RTCC_DIV_128); 
   enable_interrupts(INT_RTCC); 
   enable_interrupts(GLOBAL); 

   while(TRUE); 
}

In this program, the pulse will happen about once a second. The math is as follows:

    The timer is incremented at (CLOCK/4)/RTCC_DIV.

In this example, the timer is incremented (15000000/4)/128 or 29297 times a second (34us).

The interrupt happens every 256 increments. In this example, the interrupt happens 29297/256 or 114 times a second.

The interrupt function decrements a counter (HIGH_START times) until it is zero, then issues the pulse and resets the counter. In this example, HIGH_START is 114 so the pulse happens once a second. If HIGH_START were 57, the pulse would be about twice a second.