From 992ce9a84f37333ad7e6cac003101bad8db2df00 Mon Sep 17 00:00:00 2001 From: Last Davis Vern Date: Wed, 6 Aug 2025 14:20:36 +0200 Subject: [PATCH] Initial --- .../ACM1219_Interface_Rev01.ino | 118 ++++++ .../ACM1219_Interface_Rev01.ino | 118 ++++++ .../ACM1219_Interface_Rev01/Status.ino | 47 +++ .../ACM1219_Interface_Rev01/Subs.ino | 382 ++++++++++++++++++ .../analyse_commands.ino | 116 ++++++ .../ACM1219_Interface_Rev01/commands.ino | 357 ++++++++++++++++ .../ACM1219_microcontroller_setup_Rev01.ino | 45 +++ ACM1219_Interface_Rev01/Status.ino | 47 +++ ACM1219_Interface_Rev01/Subs.ino | 382 ++++++++++++++++++ ACM1219_Interface_Rev01/analyse_commands.ino | 116 ++++++ ACM1219_Interface_Rev01/commands.ino | 357 ++++++++++++++++ .../ACM1219_microcontroller_setup_Rev01.ino | 45 +++ 12 files changed, 2130 insertions(+) create mode 100644 ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino create mode 100644 ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino create mode 100644 ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Status.ino create mode 100644 ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Subs.ino create mode 100644 ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/analyse_commands.ino create mode 100644 ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/commands.ino create mode 100644 ACM1219_Interface_Rev01/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino create mode 100644 ACM1219_Interface_Rev01/Status.ino create mode 100644 ACM1219_Interface_Rev01/Subs.ino create mode 100644 ACM1219_Interface_Rev01/analyse_commands.ino create mode 100644 ACM1219_Interface_Rev01/commands.ino create mode 100644 ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino diff --git a/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino new file mode 100644 index 0000000..702a05f --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino @@ -0,0 +1,118 @@ +/**************************************************** +Programmed during 2011-05-02 and 2011-07-29 for the +project ACM1219 as a serial interface +Designed and developed by Adrian Beckert +Contact: adrian.beckert@gmx.ch +*****************************************************/ + +#include +#include + +#define I2C_ADDRESS 0x48 //define register adresses +#define STATUS 0x00 +#define CAP_DATA 0x01 +#define VT_DATA 0x04 +#define CAP_SETUP 0x07 +#define VT_SETUP 0x08 +#define EXC_SETUP 0x09 +#define CONFIGURATION 0x0A +#define CAP_DAC_A 0x0B +#define CAP_DAC_B 0x0C +#define CAP_OFFSET 0x0D +#define CAP_GAIN 0x0F +#define VOLTAGE_GAIN 0x11 + +//initial operation of EEPROM for booting and factory default settins +byte values[159]={128,0,75,57,158,0,128,0,77,208,91,37,115,101, +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0,0,1,128,0,75,57,158,0,128,0,77,208,91,37,115,101, +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0}; + +//variables for statistics +unsigned long ti=0; //millis() is an unsigned long type (runs over after 49.7 days) +unsigned int n=0; +long long av[2]; +long long vari[2]; +long mini[2]; +long maxi[2]; + +//string for saving settings from setCIN +byte settings[33]; +byte limits[33]; + +void setup(){ + if (EEPROM.read(77)!=0){ //check if EEPROM may have been already used or not + for (byte i=0;i<158;i++){ + EEPROM.write(i,values[i]); //write values in EEPROM + } + } + + pinMode(2,OUTPUT); //set pin 2 as output + pinMode(3,OUTPUT); //set pin 3 as output + + Serial.begin(9600); + Wire.begin(); + + byte control; + Wire.beginTransmission(0x00); //general call + Wire.write(0x06); //reset AD7746 + control =Wire.endTransmission(); + delay(1); //wait for reboot + if (control!=0){ + Serial.println("DEVICE CONNECTION ERROR"); + } + + //Set configurations saved in EEPROM + for (byte i=0;i<12;i++){ + writeR(i+7,EEPROM.read(i)); //set registers as saved in EEPROM + } + + //get Settings-String of EEPROM + for (byte i=12;i<45;i++){ + settings[i-12]=EEPROM.read(i); //set settings-string as saved in EEPROM + } + + //get limits-String of EEPROM + for (byte i=45;i<78;i++){ + limits[i-45]=EEPROM.read(i); //set settings-string as saved in EEPROM + } +} + + + + + +void loop(){ + byte cvt[7]; + byte control=0; + if (Serial.available()>0){ //check if command is available + char cmd[33]; + serial_gets(33,cmd); //read incoming command + analyse_cmd(cmd); //analyse command + control=1; //indicate that a command was processed + } + + if (n>50000){control=1;} //indicate if the averaging function risks to overflow + if (control==1){ //if indicator is =1 + ti=millis(); //reset time + n=0; //reset number of measurements + for (byte i=0;i<2;i++){ //reset all other statistical variables + av[i]=0; + vari[i]=0; + mini[i]=16777215; + maxi[i]=0; + } + } + else{ + if (bitRead(readR(0),0)==0){ //check status register if new data is available + readRegisters(7,cvt); //read new data + n++; + accumulate(cvt); //update statistical variables + } + } +} diff --git a/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino new file mode 100644 index 0000000..702a05f --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01.ino @@ -0,0 +1,118 @@ +/**************************************************** +Programmed during 2011-05-02 and 2011-07-29 for the +project ACM1219 as a serial interface +Designed and developed by Adrian Beckert +Contact: adrian.beckert@gmx.ch +*****************************************************/ + +#include +#include + +#define I2C_ADDRESS 0x48 //define register adresses +#define STATUS 0x00 +#define CAP_DATA 0x01 +#define VT_DATA 0x04 +#define CAP_SETUP 0x07 +#define VT_SETUP 0x08 +#define EXC_SETUP 0x09 +#define CONFIGURATION 0x0A +#define CAP_DAC_A 0x0B +#define CAP_DAC_B 0x0C +#define CAP_OFFSET 0x0D +#define CAP_GAIN 0x0F +#define VOLTAGE_GAIN 0x11 + +//initial operation of EEPROM for booting and factory default settins +byte values[159]={128,0,75,57,158,0,128,0,77,208,91,37,115,101, +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0,0,1,128,0,75,57,158,0,128,0,77,208,91,37,115,101, +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0}; + +//variables for statistics +unsigned long ti=0; //millis() is an unsigned long type (runs over after 49.7 days) +unsigned int n=0; +long long av[2]; +long long vari[2]; +long mini[2]; +long maxi[2]; + +//string for saving settings from setCIN +byte settings[33]; +byte limits[33]; + +void setup(){ + if (EEPROM.read(77)!=0){ //check if EEPROM may have been already used or not + for (byte i=0;i<158;i++){ + EEPROM.write(i,values[i]); //write values in EEPROM + } + } + + pinMode(2,OUTPUT); //set pin 2 as output + pinMode(3,OUTPUT); //set pin 3 as output + + Serial.begin(9600); + Wire.begin(); + + byte control; + Wire.beginTransmission(0x00); //general call + Wire.write(0x06); //reset AD7746 + control =Wire.endTransmission(); + delay(1); //wait for reboot + if (control!=0){ + Serial.println("DEVICE CONNECTION ERROR"); + } + + //Set configurations saved in EEPROM + for (byte i=0;i<12;i++){ + writeR(i+7,EEPROM.read(i)); //set registers as saved in EEPROM + } + + //get Settings-String of EEPROM + for (byte i=12;i<45;i++){ + settings[i-12]=EEPROM.read(i); //set settings-string as saved in EEPROM + } + + //get limits-String of EEPROM + for (byte i=45;i<78;i++){ + limits[i-45]=EEPROM.read(i); //set settings-string as saved in EEPROM + } +} + + + + + +void loop(){ + byte cvt[7]; + byte control=0; + if (Serial.available()>0){ //check if command is available + char cmd[33]; + serial_gets(33,cmd); //read incoming command + analyse_cmd(cmd); //analyse command + control=1; //indicate that a command was processed + } + + if (n>50000){control=1;} //indicate if the averaging function risks to overflow + if (control==1){ //if indicator is =1 + ti=millis(); //reset time + n=0; //reset number of measurements + for (byte i=0;i<2;i++){ //reset all other statistical variables + av[i]=0; + vari[i]=0; + mini[i]=16777215; + maxi[i]=0; + } + } + else{ + if (bitRead(readR(0),0)==0){ //check status register if new data is available + readRegisters(7,cvt); //read new data + n++; + accumulate(cvt); //update statistical variables + } + } +} diff --git a/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Status.ino b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Status.ino new file mode 100644 index 0000000..0c8d7e0 --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Status.ino @@ -0,0 +1,47 @@ +//********************Subroutine******************** +void displayStatus() { + byte v[19]; + readRegisters(19,v); + + Serial.println("\nAD7746 Registers:"); + Serial.print("Status (0x00): "); + Serial.println(v[0],BIN); + Serial.print("Cap Data (0x01-0x03): "); + Serial.print(v[1],BIN); + Serial.print("/"); + Serial.print(v[2],BIN); + Serial.print("/"); + Serial.println(v[3],BIN); + Serial.print("VT Data (0x04-0x06): "); + Serial.print(v[4],BIN); + Serial.print("/"); + Serial.print(v[5],BIN); + Serial.print("/"); + Serial.println(v[6],BIN); + Serial.print("Cap Setup (0x07): "); + Serial.println(v[7],BIN); + Serial.print("VT Setup (0x08): "); + Serial.println(v[8],BIN); + Serial.print("EXC Setup (0x09): "); + Serial.println(v[9],BIN); + Serial.print("Configuration (0x0A): "); + Serial.println(v[10],BIN); + Serial.print("Cap Dac A (0x0B): "); + Serial.println(v[11],BIN); + Serial.print("Cap Dac B (0xc0C): "); + Serial.println(v[12],BIN); + Serial.print("Cap Offset (0x0D-0x0E): "); + Serial.print(v[13],BIN); + Serial.print("/"); + Serial.println(v[14],BIN); + Serial.print("Cap Gain (0x0F-0x10): "); + Serial.print(v[15],BIN); + Serial.print("/"); + Serial.println(v[16],BIN); + Serial.print("Volt Gain (0x11-0x12): "); + Serial.print(v[17],BIN); + Serial.print("/"); + Serial.println(v[18],BIN); + Serial.println(""); + +} diff --git a/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Subs.ino b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Subs.ino new file mode 100644 index 0000000..6f8c573 --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/Subs.ino @@ -0,0 +1,382 @@ + +//********************Subroutine: ReadR************* +/* +read 1 Register R and return value +*/ +byte readR(unsigned char r) { + byte c; + + Wire.requestFrom(I2C_ADDRESS,r+1); //read every register from 0x00 until the required register + while (!Wire.available()==r+1); //wait until registers are available + + for (int i=r; i>=0; i--) { + c=Wire.read(); + if (i==0) {return c;} //return only required register + } +} +//********************Subroutine: readRegisters***** +/* +read a number of registers from 0 on +*/ +byte readRegisters(byte number, byte* reg) { + byte c; + + Wire.requestFrom((byte)I2C_ADDRESS,number); //read every register from 0x00 on + if (Wire.available()170){ //check if capdac has to be disabled + writeR(CAP_DAC_A,0); //disable capdac + } + else{ + writeR(CAP_DAC_A,_BV(7)|(capdac*127/17+5)/10); //write value into register + } +} +//********************Subroutine: setCapdacB******** +void setCapdacB(byte* inp,byte start){ + int capdac=int (inp[start]-'0')*100 //convert xx.x of the string to int + +int(inp[start+1]-'0')*10 + +inp[start+3]-'0'; + + + if (capdac>170){ //check if capdac has to be disabled + writeR(CAP_DAC_B,0); //disable capdac + } + else{ + writeR(CAP_DAC_B,_BV(7)|(capdac*127/17+5)/10); //write value into register + } +} +//********************Subroutine: readC************* +/* +read the 3 registers of the capacitance-channel and convert +to a 24Bit integer +*/ +long readC(){ + byte v[4]; + readRegisters(4,v); + return long(v[1])*65536+long(v[2])*256+long(v[3]); +} +//********************Subroutine: readVT************ +/* +read the 3 registers of the VT-channel and convert +to a 24Bit integer +*/ +long readVT(){ + byte v[7]; + readRegisters(7,v); + return long(v[4])*65536+long(v[5])*256+long(v[6]); + +} +//********************Subroutine: serial_gets******* +/* +read characters up to the next white space character +sent from the serial port as a string +*/ +byte serial_gets(byte num, char* string) { //lentght of entered data + for (byte i=0; i 0 && Serial.read() < 32); //if data is already available read untill finished + return num-1; +} +//********************Subroutine: setbits*********** +/* +set value v of a defined bit lenght (lenght-startbit) +in the register r. For example the bits 5 to 7 of +register 0x0A have to be set on 010. +The command is: set_bits(0x0A,5,3,2) +5=Startbit,3=bitlenght,2=value of the binary code 010 +*/ +void set_bits (byte r, byte startbit, byte lenght, byte v){ + byte b; //initialize a temp value b + b=readR(r); //read the Register which have to be changed and save as b + for (byte i=0;i0){ + zahl[i+decimals]=big%10+'0'; //get the integer part of the number + big/=10; + i++; + } + + for (byte k=0;kmaxi[i]) maxi[i]=tmp; //check if new value is max + if (tmp0){ //create previous average + tmpav=av[i]/(n-1); + tmpav/=100; + } + else{ + tmpav=0; //if n=0, previous average=0 + } + delta=tmp*10; //increase accuracy + tmp*=1000; //increase accuracy + av[i]+=tmp; //new mean(sum) + + + delta-=tmpav;//1 //calculate delta + tmpav=av[i]/100;//1 //calculate new mean with 1 decimal accuracy + vari[i]+=delta*((tmp/100)-tmpav/n);//2 //calculate new sum of variance + } +} +//********************Subroutine: checkLIMIT******** +/* +check if upper or lower limit is exceeded +*/ + +void checkLIMIT (byte* limits,long val){ + byte cas; + byte loc; + + val=retcap(val,0); + switch (settings[7]){ //check which c channel is enabled + case '0': //both disalbed + cas=9; + break; + + case '1': //CIN 1 enabled + cas=settings[9]; //check if single mode + loc=9; //store start location of limit in string + break; + + case '2': //CIN 2 enabled + cas=settings[21]; //check if single mode + loc=21; //store start location of limit in string + break; + + default: + Serial.println("CHECKLIMIT-ERROR"); + } + + if (cas=='0'){ //enabled channel in sigle mode + if (valretbitval(limits,loc+6)){ //check if upper limit is exceeded + digitalWrite(3,HIGH); //if yes set pin 3 high + } + else{ + digitalWrite(3,LOW); //else set pin 3 low + } + } + else{ + digitalWrite(2,LOW); + digitalWrite(3,LOW); + } + +} +//setLIMIT 04.99,11.21,01.00,11.17 +//********************Subroutine: retbitval********* +/* +calculates the value in DEC out of 4 array elements +*/ +long retbitval(byte* array,byte start){ + long bitval; + bitval=long(array[start]-'0')*1000 //convert the string part xx.xx to an integer number xxxx + +long(array[start+1]-'0')*100 + +long(array[start+3]-'0')*10 + +long(array[start+4]-'0'); + bitval*=1000000; //add 6 decimals + return bitval; +} + diff --git a/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/analyse_commands.ino b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/analyse_commands.ino new file mode 100644 index 0000000..0b2bfa9 --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/analyse_commands.ino @@ -0,0 +1,116 @@ +//********************Subroutine******************** +//Analyse command +byte analyse_cmd(char* cmd){ + + switch (cmd[0]*cmd[1]-cmd[2]) //analyse cmd string + { + case 11417: //read... + switch(cmd[4]*cmd[5]-cmd[6]){ //analyse read command + + case 5678: //CVT + readCVT(settings); + break; + + case 5523: //AVC + readAVCVT(); + break; + + case 6907: //STA + readSTATUS(); + break; + + case 6478: //MUC + readMUC(settings,cmd); + break; + + default: + Serial.println("READ-ERROR"); + } + + + break; + + case 11499: //set... + Serial.println(cmd); //return received string to acknowledge the reception + switch(cmd[3]*cmd[4]-cmd[5]){ //analyse set command + + case 4813: //CIN + setCIN(settings,cmd); + break; + + case 5471: //LIM + setLIMIT(limits,cmd); + break; + + case 7192: //VT (and white space (ASCII32)) + setVT(cmd); + break; + + case 5596: //CT (and white space (ASCII32)) + setCT(cmd); + break; + + case 6005: //EXC + setEXC(cmd); + break; + + case 7157: //VTC + setVTCHOP(cmd); + break; + + case 5017: //CLK + setCLKCTRL(cmd); + break; + + case 7141: //VTS + setVTSHORT(cmd); + break; + + case 4275: //CAP + setCAPCHOP(cmd); + break; + + case 5215: //CON + setCONVMOD(cmd); + break; + + case 5223: //COF + setCOF(cmd); + break; + + case 4692: //CGA + setCGAINOF(cmd); + break; + + case 6041: //VGA + setVGAINOF(cmd); + break; + + default: + Serial.println("SET-ERROR"); + + } + + break; + + case 2998: //*IDN? + Serial.println("0x48,ACM1219,Arduino Uno ATMEGA328P-PU,AD7746 Capacitance-to-Digital Converter,A.Beckert"); + break; + + case 11037: //saveSettings + Serial.println(cmd); //return received string to acknowledge the reception + saveSettings(); + break; + + case 11399: //restoreDefaults + Serial.println(cmd); //return received string to acknowledge the reception + restoreDefaults(); + break; + + default: + Serial.print(cmd); //return received string to acknowledge the reception + Serial.println(",CMD-ERROR"); + } +} + + diff --git a/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/commands.ino b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/commands.ino new file mode 100644 index 0000000..253c423 --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_Interface_Rev01/commands.ino @@ -0,0 +1,357 @@ + +//********************Subroutine: setCIN************ + +void setCIN(byte* settings, char* cmd){ + float f; + + if (cmd[3]*cmd[4]-cmd[5]==4813){ //check if command is CIN and not MUC or else + for (byte i=0;i<32;i++){ //copy command into settings string + settings[i]=cmd[i]; + } + } + + switch (settings[7]){ + + case '0': //disable CIN 1 and CIN 2 + set_bits(CAP_SETUP,0,8,settings[7]-'0'); //set cap channel off + writeR(CAP_DAC_A,0); //disable capdac A + writeR(CAP_DAC_B,0); //disable capdac B + break; + + case '1': //CIN 1 selected + set_bits(CAP_SETUP,6,2,settings[7]-'0'+1); //set CIN1 + set_bits(CAP_SETUP,5,1,settings[9]-'0'); //set differential mode + setCapdacA(settings,11); //set CapdacA + setCapdacB(settings,16); //set CapdacB + break; + + + case '2': //CIN 2 selected + set_bits(CAP_SETUP,6,2,settings[7]-'0'+1); //set CIN2 + set_bits(CAP_SETUP,5,1,settings[21]-'0'); //set differential mode + setCapdacA(settings,23); //set CapdacA + setCapdacB(settings,28); //set CapdacB + break; + + default: + Serial.println("setC_ERROR"); + } +} + +//********************Subroutine: setVT************* + +void setVT(char* cmd){ + set_bits(VT_SETUP,5,3,cmd[6]-'0'); //select temp sensor int/ext,vdd monitor, ext voltage input + set_bits(VT_SETUP,4,1,cmd[8]-'0'); //set ext voltage Reference +} + +//********************Subroutine: setCT************* + +void setCT(char* cmd){ + set_bits(CONFIGURATION,6,2,cmd[8]-'0'); //set conversion time VT channel + set_bits(CONFIGURATION,3,3,cmd[6]-'0'); //set conversion time C channel + +} + +//********************Subroutine: setEXC************ + +void setEXC(char* cmd){ + set_bits(EXC_SETUP,2,2,cmd[7]-'0'); //config EXC Pin A + set_bits(EXC_SETUP,4,2,cmd[9]-'0'); //config EXC Pin B + set_bits(EXC_SETUP,0,2,cmd[11]-'0'); //set Vdd + set_bits(EXC_SETUP,6,1,cmd[13]-'0'); //set EXCON +} + +//********************Subroutine: setVTCHOP********* + +void setVTCHOP(char* cmd){ + set_bits(VT_SETUP,0,1,cmd[10]-'0'); //set VT chop +} + +//********************Subroutine: setCLKCTRL******** + +void setCLKCTRL(char* cmd){ + set_bits(EXC_SETUP,7,1,cmd[11]-'0'); //set CLKCTRL +} + +//********************Subroutine: setVTSHORT******** + +void setVTSHORT(char* cmd){ + set_bits(VT_SETUP,1,1,cmd[11]-'0'); //set VT short +} +//Example: +//setVTSHORT_1 + +//********************Subroutine: setCAPCHOP******** +/* +CAPCHOP approximately doubles the conversion time +*/ +void setCAPCHOP(char* cmd){ + set_bits(CAP_SETUP,0,1,cmd[11]-'0'); //set CAP chop +} + +//********************Subroutine: setCONVMOD******** + +void setCONVMOD(char* cmd){ + set_bits(CONFIGURATION,0,3,cmd[11]-'0'); //set converter mode +} + +//********************Subroutine: setCOF************ +/* +set an accurate c-channel offset +*/ +void setCOF(char* cmd){ + unsigned int big=65535; //16Bit full range + big*=make_long(cmd,7); //return a long type + big/=6; + big/=10000; //delete additional digits + if (big<65536){ + writeR(CAP_OFFSET,big/256); //write in register + writeR(CAP_OFFSET+1,big%256); //write in register + } + else{ + Serial.println("SETCOF-ERROR"); + } +} + +//********************Subroutine: setGAINOF********* +/* +Set gain of the c-channel +*/ +void setCGAINOF(char* cmd){ + unsigned int big; + big=make_long(cmd,11); //convert string into integer value + if (big<65536){ + writeR(CAP_GAIN,big/256); //split value in two registers + writeR(CAP_GAIN+1,big%256); //part two + } + else{ + Serial.println("SETCGAINOF-ERROR"); + } +} + +//********************Subroutine: setVGAINOF******** + /* + change factory calibratet VT-channel gain + */ + void setVGAINOF(char* cmd){ + unsigned int big; + big=make_long(cmd,11); //convert string into integer value + if (big<65536){ + writeR(VOLTAGE_GAIN,big/256); //split value in two registers + writeR(VOLTAGE_GAIN+1,big%256); //part two + } + else{ + Serial.println("SETVGAINOF-ERROR"); + } + } + +/*********************Subroutine******************** + read routines +**********************Subroutine: readCVT***********/ + + void readCVT(byte* settings){ + switch (settings[7]){ //check which C channel is enabled + + case '0': + Serial.print("-999.999,-999.999,"); //if both disabled, print twice -999.999 + printll(rettemp(readVT(),0),4); + Serial.println(""); + break; + + case '1': + printll(retcap(readC(),0),8); //read capacitance on enabled channel + Serial.print(",-999.999,"); //print -999.999 for disabled channel + printll(rettemp(readVT(),0),4); //read temperature + Serial.println(""); + break; + + case '2': //analog to case '1' + Serial.print("-999.999,"); + printll(retcap(readC(),0),8); + Serial.print(","); + printll(rettemp(readVT(),0),4); + Serial.println(""); + break; + + default: + Serial.println("READ-ERROR"); + } + } + + //********************Subroutine: readAVCVT********* + void readAVCVT(){ + float f; + if (n>1){ //avoid divisions by 0 + for (byte i=0;i<2;i++){ + vari[i]/=(n-1); //calculate variance + f=float(vari[i]); //convert long long to float + f/=100; //remove additional decimals (because of integer arithmetic) + f=sqrt(f); //calculate standard deviation + f/=8388608.; //convert bit value into pF + f*=4.096; //multiply with half mesure scale + av[i]/=n; //calculate average + if (i==0){ + printll(retcap(mini[i],0),8); //convert bit value to pF + Serial.print(","); + printll(retcap(maxi[i],0),8); //convert bit value to pF + Serial.print(","); + printll(retcap(av[i],3),8); //convert to pF and print average + Serial.print(","); + } + else{ + printll(rettemp(mini[i],0),4); //convert bit value to pF + Serial.print(","); + printll(rettemp(maxi[i],0),4); //convert bit value to pF + Serial.print(","); + printll(rettemp(av[i],3),4); //convert to pF and print average + Serial.print(","); + } + Serial.print(f,5); + Serial.print(","); + } + Serial.print(millis()-ti); //display mesured interval + Serial.print(","); + Serial.println(n); //display number of mesurements + } + else{ + Serial.println("n<2 !!!"); + } + } + //********************Subroutine: readSTATUS******** + void readSTATUS(){ + displayStatus(); //Display all Registers + } + //********************Subroutine: readMUC*********** + /* + read on CIN 1 and CIN 2 multiplex. Mesure first with + actual settings, afterward load settings for other + channel and restore previous settings.Between + multiplex delays for 700ms for updating values + on c-channel. + */ + + void readMUC(byte* settings, char* cmd){ + long f; + switch (settings[7]){ //check current enabled channel + + case '0': //both channels disabled + Serial.print("-999.999,-999.999,"); //show that both capacitance channels are disabled + printll(rettemp(readVT(),0),4); //read+print vt channel + break; + + case '1': //channel 1 enabled + printll(retcap(readC(),0),8); //read+print capacitance + Serial.print(","); + settings[7]='2'; //change settings string for next step. Channel 2 will be enabled + setCIN(settings,cmd); //change coonfigurations and enable channel 2 (due to the change of settings string) + delay(700); //wait for updating the new configured channel + printll(retcap(readC(),0),8); //read+print capacitance on channel 2 + Serial.print(","); + settings[7]='1'; //change settings string + setCIN(settings,cmd); //change configurations and enable channel 1 + printll(rettemp(readVT(),0),4); //read+print vt channel + break; + + case '2': //channel 2 enabled + f=readC(); //read first channel 2 and store result + settings[7]='1'; //start multiplex mode etc. (analog case '1') + setCIN(settings,cmd); + //delay(700); + while(bitRead(readR(0),0)==1); + while(bitRead(readR(0),0)==1); + printll(retcap(readC(),0),8); + settings[7]='2'; + setCIN(settings,cmd); + Serial.print(","); + printll(retcap(f,0),8); + Serial.print(","); + printll(rettemp(readVT(),0),4); + break; + + default: + Serial.println("MULTIPLEX-ERROR"); + } + Serial.println(""); + + } + //********************Subroutine: saveSETTINGS****** + /* + save the current settings in EEPROM incl. settings-string + */ + + void saveSettings(){ + byte a; + unsigned int b=0; + + for (byte i=0;i<12;i++){ //go through every write-register and + a=readR(i+7); + if(a!=EEPROM.read(i)){ //proof if the current register has the same value as before + EEPROM.write(i,a); //write the value into EEPROM + b=1; //indicate if any change has been made + } + } + + for (byte i=0;i<33;i++){ + if (EEPROM.read(i+12)!=settings[i]){ //check settings-string + EEPROM.write(i+12,settings[i]); //if a value is different, write to EEPROM + b=1; //indicate if any change has been made + } + } + + for (byte i=0;i<33;i++){ + if (EEPROM.read(i+45)!=limits[i]){ //check limits-string + EEPROM.write(i+45,limits[i]); //if a value is different, write to EEPROM + b=1; //indicate if any change has been made + } + } + + + if (b==1){ //if changes have been saved + b=(long(EEPROM.read(78))*256)+EEPROM.read(79); //read how many have already been saved + b++; //increase 1 + if (b>65534){ //ERROR if settings have already been changed 65534 times + Serial.println("ATTENTION CURRENT USED EEPROM FOR SAVESETTINGS HAS TO BE CHANGED.PLEASE CONSULT THE DEVELOPER A.BECKERT."); + } + + EEPROM.write(78,b/256); //write new save-number to EEPROM + EEPROM.write(79,b%256); //write new save-number to EEPROM + + } + } + //********************Subroutine: setLIMIT********** + /* + create limits string + */ + void setLIMIT(byte* limits, char*cmd){ + for (byte i=0;i<32;i++){ //copy command into settings string + limits[i]=cmd[i]; + } + } +//setLIMIT 04.99,11.21,05.02,12.17" + //********************Subroutine: restoreDefaults*** + /* + restore factory defaults + */ +void restoreDefaults(){ + for (byte i=0;i<78;i++){ + if (EEPROM.read(i)!=EEPROM.read(80+i)){ + EEPROM.write(i,EEPROM.read(80+i)); + } + } + //Set configurations saved in EEPROM + for (byte i=0;i<12;i++){ + writeR(i+7,EEPROM.read(i)); //set registers as saved in EEPROM + } + + //get Settings-String of EEPROM + for (byte i=12;i<45;i++){ + settings[i-12]=EEPROM.read(i); //set settings-string as saved in EEPROM + } + + //get limits-String of EEPROM + for (byte i=45;i<78;i++){ + limits[i-45]=EEPROM.read(i); //set settings-string as saved in EEPROM + } +} + diff --git a/ACM1219_Interface_Rev01/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino b/ACM1219_Interface_Rev01/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino new file mode 100644 index 0000000..94914d1 --- /dev/null +++ b/ACM1219_Interface_Rev01/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino @@ -0,0 +1,45 @@ +/**************************************************** +Programmed during 2011-05-02 and 2011-07-29 for the +project ACM1219 as a microcontroller setup for the +ACM1219 interface +Designed and developed by Adrian Beckert +Contact: adrian.beckert@gmx.ch +*****************************************************/ +#include + +byte values[159]={128,0,75,57,158,0,128,0,77,208,91,37,115,101, //Values to write into the EEPROM +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0,0,1,128,0,75,57,158,0,128,0,77,208,91,37,115,101, +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0}; + + +void setup(){ + Serial.begin(9600); + for (byte i=0;i<158;i++){ //write values in EEPROM + EEPROM.write(i,values[i]); + } + + Serial.println("Please check:"); + Serial.println("Column 1: Values to write in EEPROM"); + Serial.println("Column 2: Values written in EEPROM"); + for (byte i=0;i<158;i++){ //print the values written into serial port + Serial.print(i,DEC); + Serial.print(": "); + Serial.print(values[i],DEC); + Serial.print(" "); + Serial.println(EEPROM.read(i),DEC); + } + + Serial.println("successful"); + Serial.println("Please close the serial port and load the file 'ACM1219_Interface_Rev01' on the Arduino microcontroller"); +} + +void loop(){ +} + + diff --git a/ACM1219_Interface_Rev01/Status.ino b/ACM1219_Interface_Rev01/Status.ino new file mode 100644 index 0000000..0c8d7e0 --- /dev/null +++ b/ACM1219_Interface_Rev01/Status.ino @@ -0,0 +1,47 @@ +//********************Subroutine******************** +void displayStatus() { + byte v[19]; + readRegisters(19,v); + + Serial.println("\nAD7746 Registers:"); + Serial.print("Status (0x00): "); + Serial.println(v[0],BIN); + Serial.print("Cap Data (0x01-0x03): "); + Serial.print(v[1],BIN); + Serial.print("/"); + Serial.print(v[2],BIN); + Serial.print("/"); + Serial.println(v[3],BIN); + Serial.print("VT Data (0x04-0x06): "); + Serial.print(v[4],BIN); + Serial.print("/"); + Serial.print(v[5],BIN); + Serial.print("/"); + Serial.println(v[6],BIN); + Serial.print("Cap Setup (0x07): "); + Serial.println(v[7],BIN); + Serial.print("VT Setup (0x08): "); + Serial.println(v[8],BIN); + Serial.print("EXC Setup (0x09): "); + Serial.println(v[9],BIN); + Serial.print("Configuration (0x0A): "); + Serial.println(v[10],BIN); + Serial.print("Cap Dac A (0x0B): "); + Serial.println(v[11],BIN); + Serial.print("Cap Dac B (0xc0C): "); + Serial.println(v[12],BIN); + Serial.print("Cap Offset (0x0D-0x0E): "); + Serial.print(v[13],BIN); + Serial.print("/"); + Serial.println(v[14],BIN); + Serial.print("Cap Gain (0x0F-0x10): "); + Serial.print(v[15],BIN); + Serial.print("/"); + Serial.println(v[16],BIN); + Serial.print("Volt Gain (0x11-0x12): "); + Serial.print(v[17],BIN); + Serial.print("/"); + Serial.println(v[18],BIN); + Serial.println(""); + +} diff --git a/ACM1219_Interface_Rev01/Subs.ino b/ACM1219_Interface_Rev01/Subs.ino new file mode 100644 index 0000000..6f8c573 --- /dev/null +++ b/ACM1219_Interface_Rev01/Subs.ino @@ -0,0 +1,382 @@ + +//********************Subroutine: ReadR************* +/* +read 1 Register R and return value +*/ +byte readR(unsigned char r) { + byte c; + + Wire.requestFrom(I2C_ADDRESS,r+1); //read every register from 0x00 until the required register + while (!Wire.available()==r+1); //wait until registers are available + + for (int i=r; i>=0; i--) { + c=Wire.read(); + if (i==0) {return c;} //return only required register + } +} +//********************Subroutine: readRegisters***** +/* +read a number of registers from 0 on +*/ +byte readRegisters(byte number, byte* reg) { + byte c; + + Wire.requestFrom((byte)I2C_ADDRESS,number); //read every register from 0x00 on + if (Wire.available()170){ //check if capdac has to be disabled + writeR(CAP_DAC_A,0); //disable capdac + } + else{ + writeR(CAP_DAC_A,_BV(7)|(capdac*127/17+5)/10); //write value into register + } +} +//********************Subroutine: setCapdacB******** +void setCapdacB(byte* inp,byte start){ + int capdac=int (inp[start]-'0')*100 //convert xx.x of the string to int + +int(inp[start+1]-'0')*10 + +inp[start+3]-'0'; + + + if (capdac>170){ //check if capdac has to be disabled + writeR(CAP_DAC_B,0); //disable capdac + } + else{ + writeR(CAP_DAC_B,_BV(7)|(capdac*127/17+5)/10); //write value into register + } +} +//********************Subroutine: readC************* +/* +read the 3 registers of the capacitance-channel and convert +to a 24Bit integer +*/ +long readC(){ + byte v[4]; + readRegisters(4,v); + return long(v[1])*65536+long(v[2])*256+long(v[3]); +} +//********************Subroutine: readVT************ +/* +read the 3 registers of the VT-channel and convert +to a 24Bit integer +*/ +long readVT(){ + byte v[7]; + readRegisters(7,v); + return long(v[4])*65536+long(v[5])*256+long(v[6]); + +} +//********************Subroutine: serial_gets******* +/* +read characters up to the next white space character +sent from the serial port as a string +*/ +byte serial_gets(byte num, char* string) { //lentght of entered data + for (byte i=0; i 0 && Serial.read() < 32); //if data is already available read untill finished + return num-1; +} +//********************Subroutine: setbits*********** +/* +set value v of a defined bit lenght (lenght-startbit) +in the register r. For example the bits 5 to 7 of +register 0x0A have to be set on 010. +The command is: set_bits(0x0A,5,3,2) +5=Startbit,3=bitlenght,2=value of the binary code 010 +*/ +void set_bits (byte r, byte startbit, byte lenght, byte v){ + byte b; //initialize a temp value b + b=readR(r); //read the Register which have to be changed and save as b + for (byte i=0;i0){ + zahl[i+decimals]=big%10+'0'; //get the integer part of the number + big/=10; + i++; + } + + for (byte k=0;kmaxi[i]) maxi[i]=tmp; //check if new value is max + if (tmp0){ //create previous average + tmpav=av[i]/(n-1); + tmpav/=100; + } + else{ + tmpav=0; //if n=0, previous average=0 + } + delta=tmp*10; //increase accuracy + tmp*=1000; //increase accuracy + av[i]+=tmp; //new mean(sum) + + + delta-=tmpav;//1 //calculate delta + tmpav=av[i]/100;//1 //calculate new mean with 1 decimal accuracy + vari[i]+=delta*((tmp/100)-tmpav/n);//2 //calculate new sum of variance + } +} +//********************Subroutine: checkLIMIT******** +/* +check if upper or lower limit is exceeded +*/ + +void checkLIMIT (byte* limits,long val){ + byte cas; + byte loc; + + val=retcap(val,0); + switch (settings[7]){ //check which c channel is enabled + case '0': //both disalbed + cas=9; + break; + + case '1': //CIN 1 enabled + cas=settings[9]; //check if single mode + loc=9; //store start location of limit in string + break; + + case '2': //CIN 2 enabled + cas=settings[21]; //check if single mode + loc=21; //store start location of limit in string + break; + + default: + Serial.println("CHECKLIMIT-ERROR"); + } + + if (cas=='0'){ //enabled channel in sigle mode + if (valretbitval(limits,loc+6)){ //check if upper limit is exceeded + digitalWrite(3,HIGH); //if yes set pin 3 high + } + else{ + digitalWrite(3,LOW); //else set pin 3 low + } + } + else{ + digitalWrite(2,LOW); + digitalWrite(3,LOW); + } + +} +//setLIMIT 04.99,11.21,01.00,11.17 +//********************Subroutine: retbitval********* +/* +calculates the value in DEC out of 4 array elements +*/ +long retbitval(byte* array,byte start){ + long bitval; + bitval=long(array[start]-'0')*1000 //convert the string part xx.xx to an integer number xxxx + +long(array[start+1]-'0')*100 + +long(array[start+3]-'0')*10 + +long(array[start+4]-'0'); + bitval*=1000000; //add 6 decimals + return bitval; +} + diff --git a/ACM1219_Interface_Rev01/analyse_commands.ino b/ACM1219_Interface_Rev01/analyse_commands.ino new file mode 100644 index 0000000..0b2bfa9 --- /dev/null +++ b/ACM1219_Interface_Rev01/analyse_commands.ino @@ -0,0 +1,116 @@ +//********************Subroutine******************** +//Analyse command +byte analyse_cmd(char* cmd){ + + switch (cmd[0]*cmd[1]-cmd[2]) //analyse cmd string + { + case 11417: //read... + switch(cmd[4]*cmd[5]-cmd[6]){ //analyse read command + + case 5678: //CVT + readCVT(settings); + break; + + case 5523: //AVC + readAVCVT(); + break; + + case 6907: //STA + readSTATUS(); + break; + + case 6478: //MUC + readMUC(settings,cmd); + break; + + default: + Serial.println("READ-ERROR"); + } + + + break; + + case 11499: //set... + Serial.println(cmd); //return received string to acknowledge the reception + switch(cmd[3]*cmd[4]-cmd[5]){ //analyse set command + + case 4813: //CIN + setCIN(settings,cmd); + break; + + case 5471: //LIM + setLIMIT(limits,cmd); + break; + + case 7192: //VT (and white space (ASCII32)) + setVT(cmd); + break; + + case 5596: //CT (and white space (ASCII32)) + setCT(cmd); + break; + + case 6005: //EXC + setEXC(cmd); + break; + + case 7157: //VTC + setVTCHOP(cmd); + break; + + case 5017: //CLK + setCLKCTRL(cmd); + break; + + case 7141: //VTS + setVTSHORT(cmd); + break; + + case 4275: //CAP + setCAPCHOP(cmd); + break; + + case 5215: //CON + setCONVMOD(cmd); + break; + + case 5223: //COF + setCOF(cmd); + break; + + case 4692: //CGA + setCGAINOF(cmd); + break; + + case 6041: //VGA + setVGAINOF(cmd); + break; + + default: + Serial.println("SET-ERROR"); + + } + + break; + + case 2998: //*IDN? + Serial.println("0x48,ACM1219,Arduino Uno ATMEGA328P-PU,AD7746 Capacitance-to-Digital Converter,A.Beckert"); + break; + + case 11037: //saveSettings + Serial.println(cmd); //return received string to acknowledge the reception + saveSettings(); + break; + + case 11399: //restoreDefaults + Serial.println(cmd); //return received string to acknowledge the reception + restoreDefaults(); + break; + + default: + Serial.print(cmd); //return received string to acknowledge the reception + Serial.println(",CMD-ERROR"); + } +} + + diff --git a/ACM1219_Interface_Rev01/commands.ino b/ACM1219_Interface_Rev01/commands.ino new file mode 100644 index 0000000..253c423 --- /dev/null +++ b/ACM1219_Interface_Rev01/commands.ino @@ -0,0 +1,357 @@ + +//********************Subroutine: setCIN************ + +void setCIN(byte* settings, char* cmd){ + float f; + + if (cmd[3]*cmd[4]-cmd[5]==4813){ //check if command is CIN and not MUC or else + for (byte i=0;i<32;i++){ //copy command into settings string + settings[i]=cmd[i]; + } + } + + switch (settings[7]){ + + case '0': //disable CIN 1 and CIN 2 + set_bits(CAP_SETUP,0,8,settings[7]-'0'); //set cap channel off + writeR(CAP_DAC_A,0); //disable capdac A + writeR(CAP_DAC_B,0); //disable capdac B + break; + + case '1': //CIN 1 selected + set_bits(CAP_SETUP,6,2,settings[7]-'0'+1); //set CIN1 + set_bits(CAP_SETUP,5,1,settings[9]-'0'); //set differential mode + setCapdacA(settings,11); //set CapdacA + setCapdacB(settings,16); //set CapdacB + break; + + + case '2': //CIN 2 selected + set_bits(CAP_SETUP,6,2,settings[7]-'0'+1); //set CIN2 + set_bits(CAP_SETUP,5,1,settings[21]-'0'); //set differential mode + setCapdacA(settings,23); //set CapdacA + setCapdacB(settings,28); //set CapdacB + break; + + default: + Serial.println("setC_ERROR"); + } +} + +//********************Subroutine: setVT************* + +void setVT(char* cmd){ + set_bits(VT_SETUP,5,3,cmd[6]-'0'); //select temp sensor int/ext,vdd monitor, ext voltage input + set_bits(VT_SETUP,4,1,cmd[8]-'0'); //set ext voltage Reference +} + +//********************Subroutine: setCT************* + +void setCT(char* cmd){ + set_bits(CONFIGURATION,6,2,cmd[8]-'0'); //set conversion time VT channel + set_bits(CONFIGURATION,3,3,cmd[6]-'0'); //set conversion time C channel + +} + +//********************Subroutine: setEXC************ + +void setEXC(char* cmd){ + set_bits(EXC_SETUP,2,2,cmd[7]-'0'); //config EXC Pin A + set_bits(EXC_SETUP,4,2,cmd[9]-'0'); //config EXC Pin B + set_bits(EXC_SETUP,0,2,cmd[11]-'0'); //set Vdd + set_bits(EXC_SETUP,6,1,cmd[13]-'0'); //set EXCON +} + +//********************Subroutine: setVTCHOP********* + +void setVTCHOP(char* cmd){ + set_bits(VT_SETUP,0,1,cmd[10]-'0'); //set VT chop +} + +//********************Subroutine: setCLKCTRL******** + +void setCLKCTRL(char* cmd){ + set_bits(EXC_SETUP,7,1,cmd[11]-'0'); //set CLKCTRL +} + +//********************Subroutine: setVTSHORT******** + +void setVTSHORT(char* cmd){ + set_bits(VT_SETUP,1,1,cmd[11]-'0'); //set VT short +} +//Example: +//setVTSHORT_1 + +//********************Subroutine: setCAPCHOP******** +/* +CAPCHOP approximately doubles the conversion time +*/ +void setCAPCHOP(char* cmd){ + set_bits(CAP_SETUP,0,1,cmd[11]-'0'); //set CAP chop +} + +//********************Subroutine: setCONVMOD******** + +void setCONVMOD(char* cmd){ + set_bits(CONFIGURATION,0,3,cmd[11]-'0'); //set converter mode +} + +//********************Subroutine: setCOF************ +/* +set an accurate c-channel offset +*/ +void setCOF(char* cmd){ + unsigned int big=65535; //16Bit full range + big*=make_long(cmd,7); //return a long type + big/=6; + big/=10000; //delete additional digits + if (big<65536){ + writeR(CAP_OFFSET,big/256); //write in register + writeR(CAP_OFFSET+1,big%256); //write in register + } + else{ + Serial.println("SETCOF-ERROR"); + } +} + +//********************Subroutine: setGAINOF********* +/* +Set gain of the c-channel +*/ +void setCGAINOF(char* cmd){ + unsigned int big; + big=make_long(cmd,11); //convert string into integer value + if (big<65536){ + writeR(CAP_GAIN,big/256); //split value in two registers + writeR(CAP_GAIN+1,big%256); //part two + } + else{ + Serial.println("SETCGAINOF-ERROR"); + } +} + +//********************Subroutine: setVGAINOF******** + /* + change factory calibratet VT-channel gain + */ + void setVGAINOF(char* cmd){ + unsigned int big; + big=make_long(cmd,11); //convert string into integer value + if (big<65536){ + writeR(VOLTAGE_GAIN,big/256); //split value in two registers + writeR(VOLTAGE_GAIN+1,big%256); //part two + } + else{ + Serial.println("SETVGAINOF-ERROR"); + } + } + +/*********************Subroutine******************** + read routines +**********************Subroutine: readCVT***********/ + + void readCVT(byte* settings){ + switch (settings[7]){ //check which C channel is enabled + + case '0': + Serial.print("-999.999,-999.999,"); //if both disabled, print twice -999.999 + printll(rettemp(readVT(),0),4); + Serial.println(""); + break; + + case '1': + printll(retcap(readC(),0),8); //read capacitance on enabled channel + Serial.print(",-999.999,"); //print -999.999 for disabled channel + printll(rettemp(readVT(),0),4); //read temperature + Serial.println(""); + break; + + case '2': //analog to case '1' + Serial.print("-999.999,"); + printll(retcap(readC(),0),8); + Serial.print(","); + printll(rettemp(readVT(),0),4); + Serial.println(""); + break; + + default: + Serial.println("READ-ERROR"); + } + } + + //********************Subroutine: readAVCVT********* + void readAVCVT(){ + float f; + if (n>1){ //avoid divisions by 0 + for (byte i=0;i<2;i++){ + vari[i]/=(n-1); //calculate variance + f=float(vari[i]); //convert long long to float + f/=100; //remove additional decimals (because of integer arithmetic) + f=sqrt(f); //calculate standard deviation + f/=8388608.; //convert bit value into pF + f*=4.096; //multiply with half mesure scale + av[i]/=n; //calculate average + if (i==0){ + printll(retcap(mini[i],0),8); //convert bit value to pF + Serial.print(","); + printll(retcap(maxi[i],0),8); //convert bit value to pF + Serial.print(","); + printll(retcap(av[i],3),8); //convert to pF and print average + Serial.print(","); + } + else{ + printll(rettemp(mini[i],0),4); //convert bit value to pF + Serial.print(","); + printll(rettemp(maxi[i],0),4); //convert bit value to pF + Serial.print(","); + printll(rettemp(av[i],3),4); //convert to pF and print average + Serial.print(","); + } + Serial.print(f,5); + Serial.print(","); + } + Serial.print(millis()-ti); //display mesured interval + Serial.print(","); + Serial.println(n); //display number of mesurements + } + else{ + Serial.println("n<2 !!!"); + } + } + //********************Subroutine: readSTATUS******** + void readSTATUS(){ + displayStatus(); //Display all Registers + } + //********************Subroutine: readMUC*********** + /* + read on CIN 1 and CIN 2 multiplex. Mesure first with + actual settings, afterward load settings for other + channel and restore previous settings.Between + multiplex delays for 700ms for updating values + on c-channel. + */ + + void readMUC(byte* settings, char* cmd){ + long f; + switch (settings[7]){ //check current enabled channel + + case '0': //both channels disabled + Serial.print("-999.999,-999.999,"); //show that both capacitance channels are disabled + printll(rettemp(readVT(),0),4); //read+print vt channel + break; + + case '1': //channel 1 enabled + printll(retcap(readC(),0),8); //read+print capacitance + Serial.print(","); + settings[7]='2'; //change settings string for next step. Channel 2 will be enabled + setCIN(settings,cmd); //change coonfigurations and enable channel 2 (due to the change of settings string) + delay(700); //wait for updating the new configured channel + printll(retcap(readC(),0),8); //read+print capacitance on channel 2 + Serial.print(","); + settings[7]='1'; //change settings string + setCIN(settings,cmd); //change configurations and enable channel 1 + printll(rettemp(readVT(),0),4); //read+print vt channel + break; + + case '2': //channel 2 enabled + f=readC(); //read first channel 2 and store result + settings[7]='1'; //start multiplex mode etc. (analog case '1') + setCIN(settings,cmd); + //delay(700); + while(bitRead(readR(0),0)==1); + while(bitRead(readR(0),0)==1); + printll(retcap(readC(),0),8); + settings[7]='2'; + setCIN(settings,cmd); + Serial.print(","); + printll(retcap(f,0),8); + Serial.print(","); + printll(rettemp(readVT(),0),4); + break; + + default: + Serial.println("MULTIPLEX-ERROR"); + } + Serial.println(""); + + } + //********************Subroutine: saveSETTINGS****** + /* + save the current settings in EEPROM incl. settings-string + */ + + void saveSettings(){ + byte a; + unsigned int b=0; + + for (byte i=0;i<12;i++){ //go through every write-register and + a=readR(i+7); + if(a!=EEPROM.read(i)){ //proof if the current register has the same value as before + EEPROM.write(i,a); //write the value into EEPROM + b=1; //indicate if any change has been made + } + } + + for (byte i=0;i<33;i++){ + if (EEPROM.read(i+12)!=settings[i]){ //check settings-string + EEPROM.write(i+12,settings[i]); //if a value is different, write to EEPROM + b=1; //indicate if any change has been made + } + } + + for (byte i=0;i<33;i++){ + if (EEPROM.read(i+45)!=limits[i]){ //check limits-string + EEPROM.write(i+45,limits[i]); //if a value is different, write to EEPROM + b=1; //indicate if any change has been made + } + } + + + if (b==1){ //if changes have been saved + b=(long(EEPROM.read(78))*256)+EEPROM.read(79); //read how many have already been saved + b++; //increase 1 + if (b>65534){ //ERROR if settings have already been changed 65534 times + Serial.println("ATTENTION CURRENT USED EEPROM FOR SAVESETTINGS HAS TO BE CHANGED.PLEASE CONSULT THE DEVELOPER A.BECKERT."); + } + + EEPROM.write(78,b/256); //write new save-number to EEPROM + EEPROM.write(79,b%256); //write new save-number to EEPROM + + } + } + //********************Subroutine: setLIMIT********** + /* + create limits string + */ + void setLIMIT(byte* limits, char*cmd){ + for (byte i=0;i<32;i++){ //copy command into settings string + limits[i]=cmd[i]; + } + } +//setLIMIT 04.99,11.21,05.02,12.17" + //********************Subroutine: restoreDefaults*** + /* + restore factory defaults + */ +void restoreDefaults(){ + for (byte i=0;i<78;i++){ + if (EEPROM.read(i)!=EEPROM.read(80+i)){ + EEPROM.write(i,EEPROM.read(80+i)); + } + } + //Set configurations saved in EEPROM + for (byte i=0;i<12;i++){ + writeR(i+7,EEPROM.read(i)); //set registers as saved in EEPROM + } + + //get Settings-String of EEPROM + for (byte i=12;i<45;i++){ + settings[i-12]=EEPROM.read(i); //set settings-string as saved in EEPROM + } + + //get limits-String of EEPROM + for (byte i=45;i<78;i++){ + limits[i-45]=EEPROM.read(i); //set settings-string as saved in EEPROM + } +} + diff --git a/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino b/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino new file mode 100644 index 0000000..94914d1 --- /dev/null +++ b/ACM1219_microcontroller_setup_Rev01/ACM1219_microcontroller_setup_Rev01.ino @@ -0,0 +1,45 @@ +/**************************************************** +Programmed during 2011-05-02 and 2011-07-29 for the +project ACM1219 as a microcontroller setup for the +ACM1219 interface +Designed and developed by Adrian Beckert +Contact: adrian.beckert@gmx.ch +*****************************************************/ +#include + +byte values[159]={128,0,75,57,158,0,128,0,77,208,91,37,115,101, //Values to write into the EEPROM +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0,0,1,128,0,75,57,158,0,128,0,77,208,91,37,115,101, +116,67,73,78,32,49,44,48,44,48,52,46,48,44,57,57,46,57,44,48, +44,57,57,46,57,44,57,57,46,57,0,115,101,116,76,73,77,73,84,32, +48,48,46,48,49,44,48,56,46,49,56,44,48,48,46,48,48,44,48,48,46, +48,48,0}; + + +void setup(){ + Serial.begin(9600); + for (byte i=0;i<158;i++){ //write values in EEPROM + EEPROM.write(i,values[i]); + } + + Serial.println("Please check:"); + Serial.println("Column 1: Values to write in EEPROM"); + Serial.println("Column 2: Values written in EEPROM"); + for (byte i=0;i<158;i++){ //print the values written into serial port + Serial.print(i,DEC); + Serial.print(": "); + Serial.print(values[i],DEC); + Serial.print(" "); + Serial.println(EEPROM.read(i),DEC); + } + + Serial.println("successful"); + Serial.println("Please close the serial port and load the file 'ACM1219_Interface_Rev01' on the Arduino microcontroller"); +} + +void loop(){ +} + +