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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.