3

I am trying to implement interrupts on an Arduino Uno board. My goal is to synthesize waves and play them via a 3.5 mm jack. This is what I have so far, based on some code I was provided. I have stripped it down to a somewhat barebones version in order to isolate what is wrong. I have the audio jack plugged in to pin 9, which is what I was told is the PWM pin for this board. However, nothing plays out of the audio jack at all. I would really appreciate any advice or help! :)

#include "avr/pgmspace.h"
#define NUM_OSC 1    // number of oscillators
#define MAXVOL 255   // maximum volume of each oscillator

const byte sine256[256] PROGMEM = {
  128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,
  176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,
  218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,
  246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,
  255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,
  246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
  218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,
  176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,
  128,124,121,118,115,112,109,106,103,99, 96, 93, 90, 87, 84, 81, 
  79, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39, 
  37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 18, 16, 15, 13, 12, 10, 
  9,  8,  7,  6,  5,  4,  3,  3,  2,  1,  1,  0,  0,  0,  0,  0,  
  0,  0,  0,  0,  0,  0,  1,  1,  2,  3,  3,  4,  5,  6,  7,  8,  
  9,  10, 12, 13, 15, 16, 18, 19, 21, 23, 25, 27, 29, 31, 33, 35, 
  37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76, 
  79, 81, 84, 87, 90, 93, 96, 99, 103,106,109,112,115,118,121,124
  };

const byte square256[256] PROGMEM = {
  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,
  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,
  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,
  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,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
  };


const byte* const wave_table[] = {sine256, square256, triangle256, sawtooth256};

// information about the current state of a single oscillator
struct OscillatorState
{
   unsigned int phaseStep;  // frequency of this oscillator
   unsigned int volume;     // volume multiplier for this oscillator
   unsigned int phaseAccu;  // accumulator that steps through this oscillator
                            // high byte = current sample index
   const byte* waveform;    // which waveform
};

volatile OscillatorState oscillators;
volatile byte valOut;

//********* interrupt routines ******

// set up timer 1 to do phase correct PCM at a nominal frequency of 31372.549
void setupTimer()
{
// Timer1 Clock Prescaler to : 1, set WGM22 to zero, and WGM12,13 for phase     correct PCM
  TCCR1B = (TCCR1B & 0b11100000) | 0b00001;

// set it to clear compare match mode on both pins, and phase correct PCM     (WGM21 and WGM20)
  TCCR1A = (TCCR1A &0b00001100)| 0b10100001;

// set overflow interrupts enabled for timer 1
  TIMSK1 |= (1<<TOIE1);

  Serial.println("hello");
}

// each timer 1 overflow, set the next sample value for the PWMs
ISR(TIMER1_OVF_vect) 
{

  oscillators.phaseAccu += oscillators.phaseStep;
  valOut = highByte(pgm_read_byte(oscillators.waveform +     highByte(oscillators.phaseAccu)) * oscillators.volume);

  OCR1A = valOut; // replaced ... = valOut[0];  // write to pin 9
}


unsigned int hzToPhaseStep(float frequency)
{
  float phaseStep = frequency * 2.0886902978652881446683197032183;    // (pow(2,16) * frequency) / 31376.6
  return (unsigned int)phaseStep;
}


void setup()
{
  delay(1000);
  Serial.begin(9600);
  OCR1A = 0;
  oscillators.waveform = wave_table[2];                   
  oscillators.phaseAccu = 0;
  setupTimer();
  oscillators.volume = 200;
  oscillators.phaseStep = hzToPhaseStep(440.00);
}


void loop()
{

}

1 Answer 1

3

I have the audio jack plugged in to pin 9 ... However, nothing plays out of the audio jack at all.

As you are relying on the timer changing the pin you need to make pin 9 output in setup:

 pinMode (9, OUTPUT);

When I did that I heard stuff - I wouldn't exactly call it pretty but I heard stuff.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.