Fast PWM - Compare to OCR1A

OK. It's fairly long, so I'll have to split it:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <pins_arduino.h>
#include <rotary.h>
#include <digitalWriteFast.h>
#include <digitalWriteFast.h>
#include <LiquidCrystal.h>


#define ENCODERSWITCH           4
#define ENCODERDELAY           20
#define ENCODERSETTOFREQ        1
#define ENCODERSETTOSELECT      0

#define TRIANGLE                0
#define SAWTOOTH                1
#define SINE                    2
#define SQUARE                  3

#define LCDCOLUMNOFFSET         6
#define LCDCOLUMNS             16
#define LCDROWS                 2

#define MAXFREQUENCY      2000000
#define CLOCKFREQUENCY   16000000
#define MINFREQUENCY          100
#define DEFAULTFREQ          1000

PROGMEM byte sineWave[] = {
  1, 2, 3, 5, 6, 8, 11, 13, 
  16, 18, 21, 24, 27, 30, 32, 35, 38, 41, 
  43, 46, 49, 51, 54, 56, 57, 59, 60, 61, 
  62, 63, 63, 63, 63, 62, 61, 60, 59, 57, 
  56, 54, 51, 49, 46, 43, 41, 38, 35, 32, 
  30, 27, 24, 21, 18, 16, 13, 11, 8, 6, 
  5, 3, 2, 1, 0, 0, 0, 0, 1, 2, 
  3, 5, 6, 8, 11, 13, 16, 18, 21, 24, 
  27, 30, 32, 35, 38, 41, 43, 46, 49, 51, 
  54, 56, 57, 59, 60, 61, 62, 63, 63, 63, 
  63, 62, 61, 60, 59, 57, 56, 54, 51, 49, 
  46, 43, 41, 38, 35, 32, 30, 27, 24, 21, 
  18, 16, 13, 11, 8, 6, 5, 3, 2, 1,

};

PROGMEM byte triangle[] = {
  32,34,36,38,40,42,44,46,48,50,
  52,54,56,58,60,62,63,62,60,58,
  56,54,52,50,48,46,44,42,40,38,
  36,34,32,30,28,26,24,22,20,18,
  16,14,12,10,8,6,4,2,0,2,
  4,6,8,10,12,14,16,18,20,22,
  24,26,28,30,
  32,34,36,38,40,42,44,46,48,50,
  52,54,56,58,60,62,63,62,60,58,
  56,54,52,50,48,46,44,42,40,38,
  36,34,32,30,28,26,24,22,20,18,
  16,14,12,10,8,6,4,2,0,2,
  4,6,8,10,12,14,16,18,20,22,
  24,26,28,30
};
PROGMEM byte sawTooth[] = {
  0,1,2,3,4,5,6,7,8,9,
  10,11,12,13,14,15,16,17,18,19,
  20,21,22,23,24,25,26,27,28,29,
  30,31,32,33,34,35,36,37,38,39,
  40,41,42,43,44,45,46,47,48,49,
  50,51,52,53,54,55,56,57,58,59,
  60,61,62,63,
  0,1,2,3,4,5,6,7,8,9,
  10,11,12,13,14,15,16,17,18,19,
  20,21,22,23,24,25,26,27,28,29,
  30,31,32,33,34,35,36,37,38,39,
  40,41,42,43,44,45,46,47,48,49,
  50,51,52,53,54,55,56,57,58,59,
  60,61,62,63};

PROGMEM byte squareWave[] = {
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

static  long incrementTable[] = {
  10,20,100,500,1000,2500,5000,10000};
static char waveForms[][10] = {
  "10 Hz    ", "20 Hz    ", "100 Hz   ", "500 Hz   ", "1 kHz    ", 
  "2.5 kHz  ", "5 kHz    ", "10 kHz   ", 
  "Triangle ", "Saw Tooth", "Sine     ", "Square   "};
#define MAXENCODERVALUES    (sizeof(incrementTable) / sizeof(incrementTable[0]))
#define MAXWAVETYPES        4

int tableSize = sizeof(sineWave) / sizeof(sineWave[0]);  // Waveforms all the same
int buttonRead;

volatile byte tableVals = tableSize;
volatile boolean buttonState;
volatile byte *waveTypePtr;
volatile byte index = 0;
volatile int increIndex = 0;
volatile int waveType;
volatile float increment;
volatile long frequency;
volatile long oldFrequency;
volatile long period;

Rotary myEncoder(2, 3);
LiquidCrystal lcd(12, 11, 9, 8, 7, 6);

void setup() 
{
  pinMode(ENCODERSWITCH, INPUT);
  digitalWrite(ENCODERSWITCH, HIGH);
  
  frequency = DEFAULTFREQ;  // Start off with 1000Hz
  
  cli();                    // Turn interrupts off

  InitEncoder();            // Set up encoder interrupt
  InitTimer();              // Set up timer interrupt

  sei();                    // Turn interrupts on
  
  lcd.begin(LCDCOLUMNS, LCDROWS);
  
  buttonRead = ENCODERSETTOFREQ;
  buttonState = false;
  oldFrequency = frequency - 1;
  increment = incrementTable[increIndex];
  waveType = SQUARE;
  waveTypePtr = squareWave;

  UpdateDisplayFrequency();

  lcd.setCursor(14, 0);
  lcd.print("Hz");
  lcd.setCursor(0, 1);
  lcd.print("Incr: 10 Hz");

}