Browse Source

Started with the DAC driver.

software_develop
Maximilian Stiefel 7 years ago
parent
commit
9e1c6a5940
  1. 10
      software/app/application.cpp
  2. 138
      software/app/dac101c085.cpp
  3. 48
      software/app/dac101c085.h

10
software/app/application.cpp

@ -2,6 +2,7 @@
#include <SmingCore/SmingCore.h>
#include <SmingCore/HardwareSerial.h>
#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],

138
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 <SmingCore/Wire.h>
#include <SmingCore/SmingCore.h>
//-------------------------------------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 );
}
}
}

48
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 <stdint.h>
//-------------------------------------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_ */
Loading…
Cancel
Save