#include <avr/pgmspace.h>
#include "LUT.h"
//PIN DEFINITIONS
#define DATAOUT 3 //MOSI, DIN Pin 15 on AD5668
#define SPICLK 4 //Serial Clock In, SCLK Pin 16
#define SLAVESELECT 5//SYNC Active Low Control Input, Pin 2
#define LDAC 6//LDAC, Pin 1, Pulse this pin low to update DAC registers, can be tied permanently low.
#define CLR 7
#define PWRLED 8
#define RXLED 9
//OUTLET DEFINITIONS FOR MIDI X0X
#define GATE 0
#define CV 1
#define ACC 2
#define SLD 3
#define FILT 4
//AD5668 Command definitions
#define WRITE 0
#define UPDATE 1
#define WRITE_UPDATE_ALL 2
#define WRITE_UPDATE_N 3
#define POWER 4
#define LOAD_CC_REG 5
#define LOAD_LDAC_REG 6
#define RESET 7
#define SETUP_INTERNAL_REGISTER 8
//MIDI VARIABLES
byte incomingByte;
int action = 0; //0 not implemented/do nothing, 1 note on, 2 note off, 3 cc, 4 sysex
int note = -1; //use -1 to indicate the value has not yet been set, this should be changed
int velocity = -1; //in future versions to save memory (i.e. use a char or a byte)
int extra1 = -1;
int extra2 = -1;
int RX = LOW; // previous value of the LED
unsigned long interval = 100; // interval to blink (milliseconds)
boolean noteOn = false;
boolean sysex = false;
unsigned int voltage1 = 13400;
unsigned int voltage2 = 26500;
unsigned int voltage3 = 39550;
unsigned int voltage4 = 52625;
long voltage5 = 65735;
void setup() {
//set pin modes
pinMode(DATAOUT, OUTPUT);
pinMode(SPICLK, OUTPUT);
pinMode(SLAVESELECT, OUTPUT);
pinMode(LDAC, OUTPUT);
pinMode(CLR, OUTPUT);
pinMode(PWRLED, OUTPUT);
pinMode(RXLED, OUTPUT);
//disable DAC to start with
digitalWrite(DATAOUT,LOW);
digitalWrite(SPICLK, LOW);
digitalWrite(SLAVESELECT, LOW);
digitalWrite(LDAC, HIGH);
digitalWrite(PWRLED, HIGH);
digitalWrite(RXLED, HIGH);
digitalWrite(CLR, LOW);
delay(500);
digitalWrite(CLR, HIGH);
delay(500);
delay(1000);
write_dac(SETUP_INTERNAL_REGISTER, 0, 1); //set up internal register on DAC
delay(1000);
write_dac(POWER, 0, 0);
delay(1000);
write_dac(RESET, 0, 0);
delay(1000);
digitalWrite(RXLED, LOW);
Serial.begin(31250); //change this when you want to graduate from usb midi to real midi
}
void write_dac(byte command, byte address, unsigned int data) {
switch (command) {
case WRITE_UPDATE_N:
{
byte b1 = B11110000|command; //padding at beginning of byte
////Serial.print("b1 ");
////Serial.println(b1, BIN);
byte b2 = address << 4 | data >> 12; //4 address bits and 4 MSBs of data
////Serial.print("b2 ");
////Serial.println(b2, BIN);
byte b3 = (data << 4) >> 8; // middle 8 bits of data
////Serial.print("b3 ");
////Serial.println(b3, BIN);
byte b4 = (data << 12) >> 8 | B00001111;
////Serial.print("b4 ");
////Serial.println(b4, BIN);
////Serial.println();
digitalWrite(SLAVESELECT, LOW);
delayMicroseconds(1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4);
delayMicroseconds(1);
digitalWrite(LDAC, LOW);
delayMicroseconds(1);
digitalWrite(LDAC, HIGH);
delayMicroseconds(1);
digitalWrite(SLAVESELECT, HIGH);
break;
}
case SETUP_INTERNAL_REGISTER:
{
byte b1 = B11111000; //padding at beginning of byte
////Serial.print("b1 ");
////Serial.println(b1, BIN);
byte b2 = B00000000;
////Serial.print("b2 ");
////Serial.println(b2, BIN);
byte b3 = B00000000;
////Serial.print("b2 ");
////Serial.println(b3, BIN);
byte b4 = B00000000|data;
////Serial.print("b4 ");
////Serial.println(b4, BIN);
////Serial.println();
digitalWrite(SLAVESELECT, LOW);
delayMicroseconds(1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4);
delayMicroseconds(1);
digitalWrite(SLAVESELECT, HIGH);
break;
}
case RESET:
{
byte b1 = B11110111; //padding at beginning of byte
////Serial.print("b1 ");
////Serial.println(b1, BIN);
byte b2 = B00000000;
////Serial.print("b2 ");
////Serial.println(b2, BIN);
byte b3 = B00000000;
////Serial.print("b2 ");
////Serial.println(b3, BIN);
byte b4 = B00000000|data;
////Serial.print("b4 ");
////Serial.println(b4, BIN);
////Serial.println();
digitalWrite(SLAVESELECT, LOW);
delayMicroseconds(1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4);
delayMicroseconds(1);
digitalWrite(SLAVESELECT, HIGH);
break;
}
case POWER:
{
byte b1 = B11110100; //padding at beginning of byte
////Serial.print("b1 ");
////Serial.println(b1, BIN);
byte b2 = B00000000;
////Serial.print("b2 ");
////Serial.println(b2, BIN);
byte b3 = B00000000;
////Serial.print("b2 ");
////Serial.println(b3, BIN);
byte b4 = B11111111;
////Serial.print("b4 ");
////Serial.println(b4, BIN);
////Serial.println();
digitalWrite(SLAVESELECT, LOW);
delayMicroseconds(1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b1);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b2);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b3);
shiftOut(DATAOUT, SPICLK, MSBFIRST, b4);
delayMicroseconds(1);
digitalWrite(SLAVESELECT, HIGH);
break;
}
}
}