diff options
Diffstat (limited to 'ESS1995i2c/main.cpp')
| -rw-r--r-- | ESS1995i2c/main.cpp | 112 |
1 files changed, 18 insertions, 94 deletions
diff --git a/ESS1995i2c/main.cpp b/ESS1995i2c/main.cpp index 54aa879..efb8e65 100644 --- a/ESS1995i2c/main.cpp +++ b/ESS1995i2c/main.cpp @@ -7,6 +7,7 @@ http://arduino.cc/playground/Code/ATMELTWI i2c library seems to require a 'register address' - -ESS1995 doesn't need this? + it certainly doesn't define a register in control byte 1 of write message */ #include "electic.h" @@ -41,9 +42,20 @@ int main(){ */ digitalWrite(CS,HIGH); //select DMM - - - Wire.beginTransmission(ESS1995_ADDR); + uint8_t WB1,WB2,WB3,WB4; +/* + uint8_t WB1 = (CB_SHBP << 7) | (CB_function << 3) | (CB_VARCrange); + uint8_t WB2 = (CB_BUZfreq << 5) | (CB_ADCrate << 3) | (CB_FREQrange); + uint8_t WB3 = (CB_ACmode << 7) | (CB_EXTdiode << 4) | (CB_DCfs << 3) | (CB_LPFbw << 1) | (CB_FREQinprest); + uint8_t WB4 = (CB_PEAKmode << 7) | (CB_PCALmode << 6) | (CB_OPconf << 2) | (CB_ADPext); +*/ + Wire.beginTransmission(WRITE_ID); + Wire.send(WB1); + Wire.send(WB2); + Wire.send(WB3); + Wire.send(WB4); + //default reads + Wire.endTransmission(); uint16_t delayMillis=250; @@ -97,20 +109,12 @@ writeDMM(); while(1) { if (digitalRead(DATA_NEW)==HIGH){ //DMM is ready to send data - digitalWrite(OUTPUT1,HIGH); - digitalWrite(OUTPUT2,LOW); - startWrite(); - writeStartBit(); - writeByte(READ_ID); + Wire.beginTransmission(READ_ID); if (digitalRead(DATA_NEW)==LOW){ //ID confirmed - digitalWrite(OUTPUT2,HIGH); - startRead(); for (int i=0;i<10;i++) { - data[i] = readByte(); + data[i] = Wire.receive(); } - //stop bit comes from the MPU? does seem to be necessary. - startWrite(); - writeStopBit(); + Wire.endTransmission(); //parse data DB_STATUS=data[0]; @@ -177,85 +181,5 @@ writeDMM(); //delay(delayMillis); } } -void startWrite() { - pinMode(SDATA,OUTPUT); - digitalWrite(SCLK, HIGH); -} -void startRead() { - pinMode(SDATA,INPUT); - digitalWrite(SCLK, HIGH); -} -void SCLKcycle_W() { - //insert a high clock cycle, normally LOW - delayMicroseconds(START_DELAY); - digitalWrite(SCLK, HIGH); - delayMicroseconds(CLOCK_DELAY); - digitalWrite(SCLK, LOW); - delayMicroseconds(START_DELAY); -} -void SCLKcycle_R() { - //insert a low clock cycle, normally HIGH - delayMicroseconds(START_DELAY); - digitalWrite(SCLK, LOW); - delayMicroseconds(CLOCK_DELAY); - digitalWrite(SCLK, HIGH); - delayMicroseconds(START_DELAY); -} -void writeByte(uint8_t data){ - - for (uint8_t i=0,bit=7;i<8;i++,bit--) { - digitalWrite(SDATA,(data>>bit)&0b01); - SCLKcycle_W(); - } - digitalWrite(SDATA,HIGH); //ACK/ stopbit should be HIGH? - SCLKcycle_W(); //ACK INTERVAL -} -void writeStopBit(){ - digitalWrite(SDATA,LOW); //prepare SDATA - delayMicroseconds(START_DELAY); - digitalWrite(SCLK,HIGH); - delayMicroseconds(START_DELAY); - digitalWrite(SDATA,HIGH); //stop bit -} -void writeStartBit(){ - digitalWrite(SDATA, HIGH); //should be anyway - digitalWrite(SCLK, HIGH); - delayMicroseconds(START_DELAY); - digitalWrite(SDATA,LOW); //start bit - delayMicroseconds(START_DELAY); - digitalWrite(SCLK, LOW); - delayMicroseconds(START_DELAY); -} -uint8_t readByte(){ - uint8_t data=0; - uint8_t thisdata; - //delayMicroseconds(START_DELAY); - //digitalWrite(SCLK, HIGH); //load first bit - delayMicroseconds(START_DELAY); - for (uint8_t i=0,bit=7;i<8;i++,bit--) { - thisdata=digitalRead(SDATA); - data = data | (thisdata<<bit); - digitalWrite(OUTPUT1,thisdata); - SCLKcycle_R(); - } - SCLKcycle_R(); //ACK - return data; -} -void writeDMM(){ - uint8_t WB1 = (CB_SHBP << 7) | (CB_function << 3) | (CB_VARCrange); - uint8_t WB2 = (CB_BUZfreq << 5) | (CB_ADCrate << 3) | (CB_FREQrange); - uint8_t WB3 = (CB_ACmode << 7) | (CB_EXTdiode << 4) | (CB_DCfs << 3) | (CB_LPFbw << 1) | (CB_FREQinprest); - uint8_t WB4 = (CB_PEAKmode << 7) | (CB_PCALmode << 6) | (CB_OPconf << 2) | (CB_ADPext); - - startWrite(); - writeStartBit(); - writeByte(WRITE_ID); - writeByte(WB1); - writeByte(WB2); - writeByte(WB3); - writeByte(WB4); - writeStopBit(); - -} |
