add modbus stuff

This commit is contained in:
hg
2014-11-07 18:40:19 +01:00
parent 747ffbf6ad
commit cebf295a8b
5 changed files with 731 additions and 75 deletions

View File

@ -7,7 +7,7 @@
// #include <Arduino.h>
#include <SPI.h>
#include "Streaming.h"
// #include "Streaming.h"
#include "ads1210.h"
#include "fatal.h"
@ -22,77 +22,77 @@ void ADS1210::disableCS() const {
}
void ADS1210::waitForDRdy() const {
uint32_t timeOut = 1000000;
while ((0 != digitalRead(m_drdyPin)) && timeOut) {
timeOut--;
}
if (0 == timeOut) {
fatal(1);
}
uint32_t timeOut = 1000000;
while ((0 != digitalRead(m_drdyPin)) && timeOut) {
timeOut--;
}
if (0 == timeOut) {
fatal(1);
}
}
void ADS1210::writeRegister(const uint8_t regAddr, const uint8_t value) const {
//waitForDRdy();
enableCS();
SPI.transfer(regAddr);
SPI.transfer(value);
disableCS();
//waitForDRdy();
enableCS();
SPI.transfer(regAddr);
SPI.transfer(value);
disableCS();
}
uint8_t ADS1210::readRegister(const uint8_t regAddr) const {
uint8_t res;
//waitForDRdy();
enableCS();
SPI.transfer(regAddr | INSR_RW);
res = SPI.transfer(0);
disableCS();
return res;
uint8_t res;
//waitForDRdy();
enableCS();
SPI.transfer(regAddr | INSR_RW);
res = SPI.transfer(0);
disableCS();
return res;
}
void ADS1210::exec() {
if (0 == digitalRead(m_drdyPin)) {
union {
uint8_t in[4];
uint32_t out;
} res;
enableCS();
SPI.transfer(ADDR_DOR2 | INSR_MB1 | INSR_RW);
res.in[2] = SPI.transfer(0);
res.in[1] = SPI.transfer(0);
res.in[0] = SPI.transfer(0);
res.in[3] = 0;
disableCS();
//Serial << "DOR4x8: " << _HEX(res.in[3]) << " " << _HEX(res.in[2]) << " " << _HEX(res.in[1]) << " " << _HEX(res.in[0]) << endl;
//Serial << "DOR1x32: " << _HEX(res.out) << endl;
if (0 == digitalRead(m_drdyPin)) {
union {
uint8_t in[4];
uint32_t out;
} res;
value = res.out;
enableCS();
SPI.transfer(ADDR_DOR2 | INSR_MB1 | INSR_RW);
res.in[2] = SPI.transfer(0);
res.in[1] = SPI.transfer(0);
res.in[0] = SPI.transfer(0);
res.in[3] = 0;
disableCS();
if (value == 0) {
// fatal(2);
}
}
//Serial << "DOR4x8: " << _HEX(res.in[3]) << " " << _HEX(res.in[2]) << " " << _HEX(res.in[1]) << " " << _HEX(res.in[0]) << endl;
//Serial << "DOR1x32: " << _HEX(res.out) << endl;
value = res.out;
if (value == 0) {
// fatal(2);
}
}
}
void ADS1210::setMode(uint8_t mode) const {
uint8_t cmr = readRegister(ADDR_CMR2);
cmr &= ~CMR_MD_Mask;
cmr |= mode;
writeRegister(ADDR_CMR2, cmr);
uint8_t cmr = readRegister(ADDR_CMR2);
cmr &= ~CMR_MD_Mask;
cmr |= mode;
writeRegister(ADDR_CMR2, cmr);
}
void ADS1210::setGain(uint8_t gain) const {
uint8_t cmr = readRegister(ADDR_CMR2);
cmr &= ~CMR_Gain_Mask;
cmr |= gain;
writeRegister(ADDR_CMR2, cmr);
uint8_t cmr = readRegister(ADDR_CMR2);
cmr &= ~CMR_Gain_Mask;
cmr |= gain;
writeRegister(ADDR_CMR2, cmr);
}
void ADS1210::begin(uint8_t csPin, uint8_t drdyPin) {
@ -102,31 +102,31 @@ void ADS1210::begin(uint8_t csPin, uint8_t drdyPin) {
m_drdyPin = drdyPin;
// initialization of SPI
Serial << "Start SPI initialization ... ";
// Serial << "Start SPI initialization ... ";
pinMode(m_csPin, OUTPUT);
digitalWrite(m_csPin, HIGH);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV8);
SPI.setDataMode(SPI_MODE1);
Serial << "done." << endl;
// Serial << "done." << endl;
// initialization of ADS1210
Serial << "Start ADS1210 initialization ... ";
pinMode(m_drdyPin, INPUT);
writeRegister(ADDR_CMR3, CMR_SDL | CMR_UB | CMR_REFO);
writeRegister(ADDR_CMR1, 0x1b); // data rate
writeRegister(ADDR_CMR0, 0x58);
Serial << "done." << endl;
// initialization of ADS1210
// Serial << "Start ADS1210 initialization ... ";
pinMode(m_drdyPin, INPUT);
writeRegister(ADDR_CMR3, CMR_SDL | CMR_UB | CMR_REFO);
writeRegister(ADDR_CMR1, 0x1b); // data rate
writeRegister(ADDR_CMR0, 0x58);
// Serial << "done." << endl;
// Serial << "Set gain ... ";
// setGain(CMR_Gain_2);
// Serial << "done." << endl;
Serial << "SelfCalibration ... ";
setMode(CMR_MD_SelfCalibration);
waitForDRdy();
Serial << "done." << endl;
// Serial << "Set gain ... ";
// setGain(CMR_Gain_2);
// Serial << "done." << endl;
// Serial << "SelfCalibration ... ";
setMode(CMR_MD_SelfCalibration);
waitForDRdy();
// Serial << "done." << endl;
}