Created
September 26, 2014 16:22
-
-
Save sashoo/03c5157773e23d51c216 to your computer and use it in GitHub Desktop.
Arduino timer interrupt experiment
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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