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()
{
}
VE7JRO
2,51519 gold badges27 silver badges29 bronze badges
asked Dec 6, 2016 at 1:57

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.

answered Dec 6, 2016 at 4:31

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.