#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(); }