Newer
Older
ubScopin / src / dac.cpp
#include "util.h"
#include "config.h"
#include "dac.h"

MCP4725 xDac;
MCP4725 yDac;

Dac xyz;

int i2c_init() {

	if (!bcm2835_init())
		return (1);

	bcm2835_i2c_set_baudrate(3400000);

	return (0);
}

void Dac::Setup(void) {
	xDac.begin(0x61);
	yDac.begin(0x60);

	i2c_init();

}

void Dac::SetXY(int dacX, int dacY) {
	//xDac.setVoltageFast(dacX * 3, false);
	//yDac.setVoltageFast(dacY * 3, false);

	//Fast
	xDac.setVoltageFast(dacX * 3);
	yDac.setVoltageFast(dacY * 3);
}

void Dac::SetZ(uint8_t z) {
	PORT_ZDAC = (z) ? (PORT_ZDAC & ~ZDAC_BV) : (PORT_ZDAC | ZDAC_BV);
}

MCP4725::MCP4725() {
}

void MCP4725::begin(uint8_t addr) {
	_i2caddr = addr;
}

void MCP4725::setVoltage(uint16_t output, bool writeEEPROM) {
	bcm2835_i2c_begin();
	bcm2835_i2c_setSlaveAddress(_i2caddr);

	i2c_start_wait(_i2caddr);

	if (writeEEPROM)
		bcm2835_i2c_write(MCP4726_CMD_WRITEDACEEPROM);
	else
		bcm2835_i2c_write(MCP4726_CMD_WRITEDAC);

	bcm2835_i2c_write(output / 16); // Upper data bits          (D11.D10.D9.D8.D7.D6.D5.D4)
	bcm2835_i2c_write((output % 16) << 4);

	bcm2835_i2c_end();

}

void MCP4725::setVoltageFast(uint16_t output) {
	bcm2835_i2c_begin();
	bcm2835_i2c_setSlaveAddress(_i2caddr);
	bcm2835_i2c_write(volt >> 8);
	bcm2835_i2c_write (volt);
	bcm2835_i2c_end();

}