Skip to content

Instantly share code, notes, and snippets.

@sashoo
Created September 26, 2014 16:22
Show Gist options
  • Save sashoo/03c5157773e23d51c216 to your computer and use it in GitHub Desktop.
Save sashoo/03c5157773e23d51c216 to your computer and use it in GitHub Desktop.
Arduino timer interrupt experiment
#include "waveform.h"
#include <SPI.h>
//#include "TimerOne.h"
#define MOSI 11
#define SCK 13
#define LD0 8
#define CS0 9
#define CLR 10
int freq = FREQ;
volatile unsigned long sine_point = 0;
volatile unsigned long sine_data = 0;
volatile boolean toggle0 = 0;
void setup() {
pinMode(MOSI, OUTPUT); // master output slave input
pinMode(SCK, OUTPUT); // serial clock (aka CLK, SCLK)
pinMode(LD0, OUTPUT); // load strobe; active low outputs value from DAC
pinMode(CS0, OUTPUT); // chip select (aka slave select, SS)
pinMode(CLR, OUTPUT); // clears DAC register, active low
digitalWrite(CS0, HIGH);
digitalWrite(LD0, HIGH);
SPI.begin();
SPI.setBitOrder(MSBFIRST); // most significant bit first
SPI.setDataMode(SPI_MODE0); // clock polarity and phase
SPI.setClockDivider(SPI_CLOCK_DIV2); // half of system clock (16 MHz / 2 = 8 MHz)
noInterrupts();
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 50khz increments
OCR1A = 319;// = (16*10^6) / (1*50000) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS12 and CS10 bits for 1024 prescaler
TCCR1B |= (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
ISR(TIMER1_COMPA_vect){//timer0 interrupt 2kHz toggles pin 8
// uncomment for sine
digitalWrite(LD0, LOW);
digitalWrite(LD0, HIGH);
sine_point++;
if (sine_point >= PHI_STEPS)
sine_point = 0;
setValue(sine_wave[sine_point]);
// uncomment for square wave
/*
if (toggle0){
setValue(2048);
toggle0 = 0;
}
else{
setValue(0);
toggle0 = 1;
}
*/
//should I use it?
//TCNT1 = 0;
}
void loop() {
}
// packages an int as 2 bytes and sends it
// over SPI to a 12 bit DAC (DAC8512)
void setValue(unsigned int value) {
//noInterrupts();
//digitalWrite(CLR, HIGH);
//digitalWrite(CLR, LOW);
int ctrl_reg = 0; // 0000
int level = value; // 111010111000
// Shift 'ctrl_reg' left by 4 bits
int shifted_ctrl_reg = ctrl_reg << 4; // 00010000
// Shift 'level' 8 bits to the right
int shifted_right_level = level >> 8; // 00001110
// Create byte 1 by doing a bitwise or of 'shifted_ctrl_reg' and 'shifted_right_level'
int byte1 = shifted_ctrl_reg;
byte1 = byte1 | shifted_right_level; // 00011110
// Now in byte2 I only want the last 8 bits of 'level' as the first 4 were in byte1 so I just delete the first 4 bits from 'level' by making them 0
int byte2 = level;
bitWrite(byte2, 8, 0);
bitWrite(byte2, 9, 0);
bitWrite(byte2, 10, 0);
bitWrite(byte2, 11, 0);
SPI.transfer(byte1);
SPI.transfer(byte2);
// Load strobe to output value from DAC analog output
// moved to ISR
//digitalWrite(LD0, LOW);
//digitalWrite(LD0, HIGH);
//interrupts();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment