squarewave.c - Generates a square wave using timer 2 and an ISR.ΒΆ
 
#include "pic24_all.h"
 
Output the square wave on RB2.
#define WAVEOUT (_LATB2)
#define CONFIG_WAVEOUT() CONFIG_RB2_AS_DIG_OUTPUT()
 
Interrupt Service Routine for Timer2.
void _ISR _T2Interrupt(void) {
Toggle the output pin to generate a square wave.
  WAVEOUT = !WAVEOUT;
Clear the timer interrupt bit, signaling the PIC that this interrupt has been serviced.
  _T2IF = 0;
}
 
Define the time, in ms, between Timer2 interrupts.
#define ISR_PERIOD  (15)
void  configTimer2(void) {
T2CON is set like this for documentation purposes. It could be replaced by T2CON = 0x0020.
  T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF
          | T2_32BIT_MODE_OFF
          | T2_SOURCE_INT
          | T2_PS_1_64;
Subtract 1 from ticks value assigned to PR2 because period is PRx + 1.
  PR2 = msToU16Ticks(ISR_PERIOD, getTimerPrescale(T2CONbits)) - 1;
Start with a cleared timer2 value.
  TMR2  = 0;
Enable Timer2 interrupts.
  _T2IF = 0;
  _T2IP = 1;
  _T2IE = 1;
Start the timer only after all timer-related configuration is complete.
  T2CONbits.TON = 1;
}
int main (void) {
  configBasic(HELLO_MSG);
  CONFIG_WAVEOUT();
  configTimer2();
 
The interrupt does work of generating the square wave; no code is needed here.
  while (1) {
Blink the heartbeat LED to show that the PIC is running.
    doHeartbeat();
  }
}