From 9e1c6a5940b42990a2804eaf99bb1f5e4b93d25d Mon Sep 17 00:00:00 2001 From: Maximilian Stiefel Date: Tue, 8 Aug 2017 18:18:51 +0200 Subject: [PATCH] Started with the DAC driver. --- software/app/application.cpp | 10 +++ software/app/dac101c085.cpp | 138 +++++++++++++++++++++++++++++++++++ software/app/dac101c085.h | 48 ++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 software/app/dac101c085.cpp create mode 100644 software/app/dac101c085.h diff --git a/software/app/application.cpp b/software/app/application.cpp index fd2eb93..95dc796 100644 --- a/software/app/application.cpp +++ b/software/app/application.cpp @@ -2,6 +2,7 @@ #include #include #include "ads101x.h" +#include "dac101c085.h" #include "sensor_hub.h" #include "sensor_settings.h" #include "double_buffer.h" @@ -13,6 +14,7 @@ static const int HUB_PERIOD = 5; static const int ADC_TIMEBASE = 250; static const int ADC_PERIOD = 5; static const uint8_t ADC_ADDRESS = 0x48; +static const uint8_t DAC_ADDRESS = 0x0C; using namespace rijnfel; @@ -22,6 +24,7 @@ void STAGotIP(IPAddress ip, IPAddress mask, IPAddress gateway); Timer procTimer; ads::cADS101x adc(0, ADC_ADDRESS); +dac::cDAC101C085 mydac(1, DAC_ADDRESS); uint8_t channel = 0; cSensorHub hub(HUB_PERIOD); @@ -66,6 +69,13 @@ void init() { cWebInterface::GetInstance()->Start(); procTimer.initializeMs(HUB_PERIOD, updateSensorHub).start(); + mydac.checkDev(); + Serial.print("Write DAC reg: "); + Serial.print(mydac.changeSettings(dac::eOpMode::NORMAL, 1023)); + Serial.println(""); + Serial.print("Read out DAC regs: "); + Serial.print(mydac.ReadSettings()); + Serial.println(""); } void STADisconnect(String ssid, uint8_t ssid_len, uint8_t bssid[6], diff --git a/software/app/dac101c085.cpp b/software/app/dac101c085.cpp new file mode 100644 index 0000000..b93ec57 --- /dev/null +++ b/software/app/dac101c085.cpp @@ -0,0 +1,138 @@ +//---------------------------------------------------------------------------------------------------------------------------- +// Project: Uppsense +// Name: dac101c085.cpp +// Author: Maximilian Stiefel +// Date: 08.08.2017 +// +// Description: +// +//---------------------------------------------------------------------------------------------------------------------------- + +//-------------------------------------Libraries------------------------------------------------------------------------------ +#include "dac101c085.h" +#include +#include + +//-------------------------------------Namespaces----------------------------------------------------------------------------- +namespace rijnfel { +namespace dac { + +//-------------------------------------Constructor---------------------------------------------------------------------------- +cDAC101C085::cDAC101C085(uint8_t i_number, uint8_t i_address): + m_number(i_number), m_address(i_address) +{} + +//-------------------------------------Destructor----------------------------------------------------------------------------- +cDAC101C085::~cDAC101C085() +{} + +//-------------------------------------checkDev------------------------------------------------------------------------------- +void cDAC101C085::checkDev() +{ + // Vars + byte error = 0; + // Action + #if DEBUG_LEVEL == 1 + Serial.print("DAC: Scanning address 0x"); + Serial.print(m_address, HEX); + Serial.println("."); + #endif + Wire.beginTransmission(m_address); + error = Wire.endTransmission(); + I2CError(error); // Pass to error parser +} + +//-------------------------------------changeSettings------------------------------------------------------------------------- +uint8_t cDAC101C085::changeSettings(enum eOpMode mode, uint16_t val) +{ + // Vars + uint16_t settings = 0; + // Action + if( val > 1023) + return 0; // This is illegal + settings = val << D_BITS_POS; // First two bits have to be 0 + switch(mode) + { + case NORMAL: + settings += 0b00 << PD_BITS_POS; + break; + case PULL_DOWN_2K5: + settings += 0b01 << PD_BITS_POS; + break; + case PULL_DOWN_100K: + settings += 0b10 << PD_BITS_POS; + break; + case HIGH_IMPEDANCE: + settings += 0b11 << PD_BITS_POS; + break; + + } + return WriteSettings(settings); +} + +//-------------------------------------WriteSettings-------------------------------------------------------------------------- +uint8_t cDAC101C085::WriteSettings(uint16_t settings) +{ + // Vars + uint8_t error = 0; + // Action + Wire.beginTransmission(m_address); + Wire.write( (uint8_t) (settings >> 8) ); // Most significant byte + Wire.write( (uint8_t) (settings & 0xFF) ); // Least significant byte + error = Wire.endTransmission(); + Serial.print(settings); + return I2CError(error); // Pass to error parser +} + +//-------------------------------------ReadSettings-------------------------------------------------------------------------- +uint16_t cDAC101C085::ReadSettings(void) +{ + // Vars + uint8_t number = 0; + uint16_t settings = 0; + + // Action + number = Wire.requestFrom(m_address, (uint8_t) 2); + if( number != 2) + { + Serial.print("DAC: Trying to read 2 bytes from 0x"); + Serial.print(m_address, HEX); + Serial.println(" went wrong."); + return 0; + } + settings = (uint16_t) Wire.read() << 8; // Most significant byte + settings += (uint16_t) Wire.read(); // Least significant byte + return settings; +} + +//-------------------------------------I2CError------------------------------------------------------------------------------- +uint8_t cDAC101C085::I2CError(uint8_t error) +{ + switch(error) + { + case 0: + #if DEBUG_LEVEL == 1 + Serial.println("DAC: I2C device found. Transmission successful."); + #endif + break; + case 2: + Serial.print("DAC: Received NACK after address from 0x."); + Serial.print(m_address, HEX); + Serial.println("."); + break; + case 3: + Serial.print("DAC: Received NACK after data from 0x."); + Serial.print(m_address, HEX); + Serial.println("."); + break; + case 4: + Serial.print("DAC: Unknow error at 0x."); + Serial.print(m_address, HEX); + Serial.println("."); + break; + } + return ( (error == 0) ? 1 : 0 ); +} + +} +} diff --git a/software/app/dac101c085.h b/software/app/dac101c085.h new file mode 100644 index 0000000..a6e455a --- /dev/null +++ b/software/app/dac101c085.h @@ -0,0 +1,48 @@ +//---------------------------------------------------------------------------------------------------------------------------- +// Project: Uppsense +// Name: dac101c085.h +// Author: Maximilian Stiefel +// Date: 08.08.2017 +// +// Description: +// +//---------------------------------------------------------------------------------------------------------------------------- + +#ifndef APP_DAC101C085_H_ +#define APP_DAC101C085_H_ + +//-------------------------------------Libraries------------------------------------------------------------------------------ +#include + +//-------------------------------------Defines-------------------------------------------------------------------------------- +#define DEBUG_LEVEL 1 // 1 a lot debugging output, else rare debugging output +#define PD_BITS_POS 14 // Position of power down bits +#define D_BITS_POS 2 // Position of data bits + +//-------------------------------------Namespaces----------------------------------------------------------------------------- +namespace rijnfel { +namespace dac { + +//-------------------------------------Enums---------------------------------------------------------------------------------- +enum eOpMode {NORMAL, PULL_DOWN_2K5, PULL_DOWN_100K, HIGH_IMPEDANCE}; + +//-------------------------------------cDAC101085----------------------------------------------------------------------------- +class cDAC101C085 +{ +public: + cDAC101C085(uint8_t number, uint8_t i_address); // Constructor + ~cDAC101C085(); // Destructor + void checkDev(); // Check if device is available and alive + uint16_t ReadSettings(void); + uint8_t WriteSettings(uint16_t settings); + uint8_t changeSettings(enum eOpMode mode, uint16_t val); + +private: + uint8_t m_number; // Which of the dacs is it? + uint8_t m_address; + uint8_t I2CError(uint8_t error); +}; + +} +} +#endif /* APP_DAC101C085_H_ */